wined3d: Move volume DXTn handling to apply_format_fixups.

This commit is contained in:
Stefan Dösinger 2015-04-26 16:09:10 +02:00 committed by Alexandre Julliard
parent 978fe23218
commit 7109bebd02
5 changed files with 37 additions and 61 deletions

View file

@ -5953,7 +5953,7 @@ static void test_volume_blocks(void)
D3DLOCKED_BOX locked_box;
BYTE *base;
INT expected_row_pitch, expected_slice_pitch;
BOOL support, support_2d;
BOOL support;
BOOL pow2;
unsigned int offset, expected_offset;
@ -5977,9 +5977,6 @@ static void test_volume_blocks(void)
hr = IDirect3D8_CheckDeviceFormat(d3d8, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
0, D3DRTYPE_VOLUMETEXTURE, formats[i].fmt);
support = SUCCEEDED(hr);
hr = IDirect3D8_CheckDeviceFormat(d3d8, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
0, D3DRTYPE_TEXTURE, formats[i].fmt);
support_2d = SUCCEEDED(hr);
/* Test creation restrictions */
for (w = 1; w <= 8; w++)
@ -6000,7 +5997,6 @@ static void test_volume_blocks(void)
for (j = 0; j < sizeof(create_tests) / sizeof(*create_tests); j++)
{
BOOL may_succeed = FALSE;
BOOL todo = FALSE;
if (create_tests[j].need_runtime_support && !formats[i].core_fmt && !support)
expect_hr = D3DERR_INVALIDCALL;
@ -6009,10 +6005,7 @@ static void test_volume_blocks(void)
else if (pow2 && !size_is_pow2 && create_tests[j].need_driver_support)
expect_hr = D3DERR_INVALIDCALL;
else if (create_tests[j].need_driver_support && !support)
{
todo = support_2d;
expect_hr = D3DERR_INVALIDCALL;
}
else
expect_hr = D3D_OK;
@ -6028,18 +6021,9 @@ static void test_volume_blocks(void)
if (!formats[i].core_fmt && !support && FAILED(expect_hr))
may_succeed = TRUE;
if (todo)
{
todo_wine ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
}
else
{
ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
}
ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
if (FAILED(hr))
ok(texture == NULL, "Got texture ptr %p, expected NULL.\n", texture);

View file

@ -8567,7 +8567,7 @@ static void test_volume_blocks(void)
D3DLOCKED_BOX locked_box;
BYTE *base;
INT expected_row_pitch, expected_slice_pitch;
BOOL support, support_2d;
BOOL support;
BOOL pow2;
unsigned int offset, expected_offset;
@ -8591,9 +8591,6 @@ static void test_volume_blocks(void)
hr = IDirect3D9_CheckDeviceFormat(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
0, D3DRTYPE_VOLUMETEXTURE, formats[i].fmt);
support = SUCCEEDED(hr);
hr = IDirect3D9_CheckDeviceFormat(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
0, D3DRTYPE_TEXTURE, formats[i].fmt);
support_2d = SUCCEEDED(hr);
/* Test creation restrictions */
for (w = 1; w <= 8; w++)
@ -8614,7 +8611,6 @@ static void test_volume_blocks(void)
for (j = 0; j < sizeof(create_tests) / sizeof(*create_tests); j++)
{
BOOL may_succeed = FALSE;
BOOL todo = FALSE;
if (create_tests[j].need_runtime_support && !formats[i].core_fmt && !support)
expect_hr = D3DERR_INVALIDCALL;
@ -8623,10 +8619,7 @@ static void test_volume_blocks(void)
else if (pow2 && !size_is_pow2 && create_tests[j].need_driver_support)
expect_hr = D3DERR_INVALIDCALL;
else if (create_tests[j].need_driver_support && !support)
{
todo = support_2d;
expect_hr = D3DERR_INVALIDCALL;
}
else
expect_hr = D3D_OK;
@ -8642,18 +8635,9 @@ static void test_volume_blocks(void)
if (!formats[i].core_fmt && !support && FAILED(expect_hr))
may_succeed = TRUE;
if (todo)
{
todo_wine ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
}
else
{
ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
}
ok(hr == expect_hr || ((SUCCEEDED(hr) && may_succeed)),
"Got unexpected hr %#x for format %s, pool %s, size %ux%ux%u.\n",
hr, formats[i].name, create_tests[j].name, w, h, d);
if (FAILED(hr))
ok(texture == NULL, "Got texture ptr %p, expected NULL.\n", texture);

View file

@ -25,7 +25,7 @@
#include "d3dx9tex.h"
#include "resources.h"
static int has_2d_dxt3, has_2d_dxt5, has_cube_dxt5;
static int has_2d_dxt3, has_2d_dxt5, has_cube_dxt5, has_3d_dxt3;
/* 2x2 16-bit dds, no mipmaps */
static const unsigned char dds_16bit[] = {
@ -575,6 +575,14 @@ static void test_D3DXCheckVolumeTextureRequirements(IDirect3DDevice9 *device)
ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
format = D3DFMT_DXT3;
hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
if (has_3d_dxt3)
ok(format == D3DFMT_DXT3, "Returned format %u, expected %u\n", format, D3DFMT_DXT3);
else
todo_wine ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
/* mipmaps */
if (!(caps.TextureCaps & D3DPTEXTURECAPS_MIPVOLUMEMAP))
{
@ -1774,7 +1782,7 @@ static void test_D3DXCreateVolumeTextureFromFileInMemory(IDirect3DDevice9 *devic
ok(hr == D3DERR_INVALIDCALL, "D3DXCreateVolumeTextureFromFileInMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
hr = D3DXCreateVolumeTextureFromFileInMemory(device, dds_volume_map, sizeof(dds_volume_map), &volume_texture);
if (has_2d_dxt3)
if (has_3d_dxt3)
ok(hr == D3D_OK, "D3DXCreateVolumeTextureFromFileInMemory returned %#x, expected %#x\n", hr, D3D_OK);
else
todo_wine ok(hr == D3D_OK, "D3DXCreateVolumeTextureFromFileInMemory returned %#x, expected %#x\n", hr, D3D_OK);
@ -1788,6 +1796,7 @@ static void test_D3DXCreateVolumeTextureFromFileInMemory(IDirect3DDevice9 *devic
ok(volume_desc.Width == 4, "Got width %u, expected 4\n", volume_desc.Width);
ok(volume_desc.Height == 4, "Got height %u, expected 4\n", volume_desc.Height);
ok(volume_desc.Depth == 2, "Got depth %u, expected 2\n", volume_desc.Depth);
ok(volume_desc.Pool == D3DPOOL_MANAGED, "Got pool %u, expected D3DPOOL_MANAGED\n", volume_desc.Pool);
hr = IDirect3DVolumeTexture9_GetLevelDesc(volume_texture, 1, &volume_desc);
ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
@ -2031,6 +2040,8 @@ START_TEST(texture)
hr = IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_X8R8G8B8, 0, D3DRTYPE_CUBETEXTURE, D3DFMT_DXT5);
has_cube_dxt5 = SUCCEEDED(hr);
has_3d_dxt3 = SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_X8R8G8B8, 0, D3DRTYPE_VOLUMETEXTURE, D3DFMT_DXT3));
test_D3DXCheckTextureRequirements(device);
test_D3DXCheckCubeTextureRequirements(device);

View file

@ -4490,25 +4490,6 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
case WINED3D_RTYPE_VOLUME_TEXTURE:
case WINED3D_RTYPE_VOLUME:
/* The GL_EXT_texture_compression_s3tc spec requires that loading
* an s3tc compressed texture results in an error. While the D3D
* refrast does support s3tc volumes, at least the nvidia Windows
* driver does not, so we're free not to support this format. */
switch (check_format_id)
{
case WINED3DFMT_DXT1:
case WINED3DFMT_DXT2:
case WINED3DFMT_DXT3:
case WINED3DFMT_DXT4:
case WINED3DFMT_DXT5:
TRACE("[FAILED] - DXTn does not support 3D textures.\n");
return WINED3DERR_NOTAVAILABLE;
default:
/* Do nothing, continue with checking the format below */
break;
}
format_flags |= WINED3DFMT_FLAG_TEXTURE;
allowed_usage = WINED3DUSAGE_DYNAMIC
| WINED3DUSAGE_SOFTWAREPROCESSING

View file

@ -2293,6 +2293,22 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
|| !adapter->fragment_pipe->color_fixup_supported(format->color_fixup))
format_clear_flag(&gl_info->formats[idx], WINED3DFMT_FLAG_TEXTURE);
}
/* GL_EXT_texture_compression_s3tc does not support 3D textures. Some Windows drivers
* for dx9 GPUs support it, some do not, so not supporting DXTn volumes is OK for d3d9.
*
* Note that GL_NV_texture_compression_vtc adds this functionality to OpenGL, but the
* block layout is not compatible with the one used by d3d. See volume_dxt5_test. */
idx = getFmtIdx(WINED3DFMT_DXT1);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
idx = getFmtIdx(WINED3DFMT_DXT2);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
idx = getFmtIdx(WINED3DFMT_DXT3);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
idx = getFmtIdx(WINED3DFMT_DXT4);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
idx = getFmtIdx(WINED3DFMT_DXT5);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
}
static BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info)