From: Stefan Dösinger Subject: [PATCH 5/5] wined3d: Move volume DXTn handling to apply_format_fixups. Message-Id: <1429864431-18950-5-git-send-email-stefan@codeweavers.com> Date: Fri, 24 Apr 2015 10:33:51 +0200 Note that ARB_internalformat_query2 isn't going to help here. It will report support for DXTn volumes if GL_NV_texture_compression_vtc is supported. --- dlls/d3d8/tests/device.c | 24 ++++-------------------- dlls/d3d9/tests/device.c | 24 ++++-------------------- dlls/wined3d/directx.c | 19 ------------------- dlls/wined3d/utils.c | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 59 deletions(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 64c2911..7158cf7 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -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); diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 4d48ea8..cb4a6e8 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -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); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 69491a9..1d2e71f 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -4491,25 +4491,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 diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 1d34440..b45e0bf 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -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) -- 2.3.4