[PATCH 4/5] d3d9/tests: Test blocked texture creation restrictions

Stefan Dösinger stefandoesinger at gmail.com
Tue Sep 3 07:13:40 CDT 2013


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Fwiw, d3d8, ddraw and volumes behave in the same way. I've attached
the tests for reference. The volume and ddraw tests need a bit of
preparation work in ddraw/wined3d and a little bit of work themselves.

Am 2013-09-03 14:07, schrieb Stefan Dösinger:
> --- dlls/d3d9/tests/device.c | 225 
> +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed,
> 210 insertions(+), 15 deletions(-)
> 
> diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c 
> index d705e3e..af39ffa 100644 --- a/dlls/d3d9/tests/device.c +++ 
> b/dlls/d3d9/tests/device.c @@ -5815,7 +5815,7 @@ static void 
> test_surface_double_unlock(void) DestroyWindow(window); }
> 
> -static void test_surface_lockrect_blocks(void) +static void 
> test_surface_blocks(void) { static const struct { @@ -5824,20 
> +5824,21 @@ static void test_surface_lockrect_blocks(void)
> unsigned int block_width; unsigned int block_height; BOOL broken;
> + BOOL create_size_checked, core_fmt; } formats[] = { - 
> {D3DFMT_DXT1,                 "D3DFMT_DXT1", 4, 4, FALSE}, - 
> {D3DFMT_DXT2,                 "D3DFMT_DXT2", 4, 4, FALSE}, - 
> {D3DFMT_DXT3,                 "D3DFMT_DXT3", 4, 4, FALSE}, - 
> {D3DFMT_DXT4,                 "D3DFMT_DXT4", 4, 4, FALSE}, - 
> {D3DFMT_DXT5,                 "D3DFMT_DXT5", 4, 4, FALSE}, + 
> {D3DFMT_DXT1,                 "D3DFMT_DXT1", 4, 4, FALSE, TRUE, 
> TRUE }, +        {D3DFMT_DXT2,                 "D3DFMT_DXT2", 4,
> 4, FALSE, TRUE,  TRUE }, +        {D3DFMT_DXT3, "D3DFMT_DXT3", 4,
> 4, FALSE, TRUE,  TRUE }, +        {D3DFMT_DXT4, "D3DFMT_DXT4", 4,
> 4, FALSE, TRUE,  TRUE }, +        {D3DFMT_DXT5, "D3DFMT_DXT5", 4,
> 4, FALSE, TRUE,  TRUE }, /* ATI2N has 2x2 blocks on all AMD cards
> and Geforce 7 cards, * which doesn't match the format spec. On
> newer Nvidia cards * it has the correct 4x4 block size */ -
> {MAKEFOURCC('A','T','I','2'), "ATI2N",       4, 4, TRUE}, -
> {D3DFMT_YUY2,                 "D3DFMT_YUY2", 2, 1, FALSE}, -
> {D3DFMT_UYVY,                 "D3DFMT_UYVY", 2, 1, FALSE}, +
> {MAKEFOURCC('A','T','I','2'), "ATI2N",       4, 4, TRUE,  FALSE,
> FALSE}, +        {D3DFMT_YUY2, "D3DFMT_YUY2", 2, 1, FALSE, FALSE,
> TRUE }, +        {D3DFMT_UYVY, "D3DFMT_UYVY", 2, 1, FALSE, FALSE,
> TRUE }, }; static const struct { @@ -5854,17 +5855,45 @@ static
> void test_surface_lockrect_blocks(void) {D3DPOOL_SYSTEMMEM, 
> "D3DPOOL_SYSTEMMEM",TRUE}, {D3DPOOL_MANAGED, "D3DPOOL_MANAGED",
> TRUE}, }; +    static struct +    { + D3DRESOURCETYPE rtype; +
> const char *type_name; + D3DPOOL pool; +        const char
> *pool_name; +        BOOL need_driver_support,
> need_runtime_support; +    } + create_tests[] = +    { +
> {D3DRTYPE_SURFACE, "D3DRTYPE_SURFACE",     D3DPOOL_DEFAULT,
> "D3DPOOL_DEFAULT", TRUE,  FALSE}, +        {D3DRTYPE_SURFACE,
> "D3DRTYPE_SURFACE", D3DPOOL_SYSTEMMEM, "D3DPOOL_SYSTEMMEM", TRUE,
> TRUE }, +        /* Managed offscreen plain surfaces are not
> supported */ + {D3DRTYPE_SURFACE,     "D3DRTYPE_SURFACE",
> D3DPOOL_SCRATCH, "D3DPOOL_SCRATCH",   FALSE, TRUE }, + +
> {D3DRTYPE_TEXTURE, "D3DRTYPE_TEXTURE",     D3DPOOL_DEFAULT,
> "D3DPOOL_DEFAULT", TRUE,  FALSE}, +        {D3DRTYPE_TEXTURE,
> "D3DRTYPE_TEXTURE", D3DPOOL_SYSTEMMEM, "D3DPOOL_SYSTEMMEM", TRUE,
> FALSE}, + {D3DRTYPE_TEXTURE,     "D3DRTYPE_TEXTURE",
> D3DPOOL_MANAGED, "D3DPOOL_MANAGED",   TRUE,  FALSE}, +
> {D3DRTYPE_TEXTURE, "D3DRTYPE_TEXTURE",     D3DPOOL_SCRATCH,
> "D3DPOOL_SCRATCH", FALSE, TRUE }, + +
> {D3DRTYPE_CUBETEXTURE, "D3DRTYPE_CUBETEXTURE", D3DPOOL_DEFAULT,
> "D3DPOOL_DEFAULT", TRUE,  FALSE}, +        {D3DRTYPE_CUBETEXTURE, 
> "D3DRTYPE_CUBETEXTURE", D3DPOOL_SYSTEMMEM, "D3DPOOL_SYSTEMMEM", 
> TRUE,  FALSE}, +        {D3DRTYPE_CUBETEXTURE, 
> "D3DRTYPE_CUBETEXTURE", D3DPOOL_MANAGED,   "D3DPOOL_MANAGED", TRUE,
> FALSE}, +        {D3DRTYPE_CUBETEXTURE, "D3DRTYPE_CUBETEXTURE",
> D3DPOOL_SCRATCH,   "D3DPOOL_SCRATCH", FALSE, TRUE }, +    };
> IDirect3DTexture9 *texture; + IDirect3DCubeTexture9 *cube_texture;
> IDirect3DSurface9 *surface; D3DLOCKED_RECT locked_rect;
> IDirect3DDevice9 *device; -    unsigned int i, j; +    unsigned int
> i, j, w, h; BOOL surface_only; IDirect3D9 *d3d; ULONG refcount;
> HWND window; HRESULT hr; RECT rect; +    BOOL tex_pow2, cube_pow2;
> +    D3DCAPS9 caps;
> 
> if (!(d3d = pDirect3DCreate9(D3D_SDK_VERSION))) { @@ -5882,14 
> +5911,142 @@ static void test_surface_lockrect_blocks(void) return;
> }
> 
> +    hr = IDirect3DDevice9_GetDeviceCaps(device, &caps); + 
> ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr); + tex_pow2
> = !!(caps.TextureCaps & D3DPTEXTURECAPS_POW2); +    if (tex_pow2) +
> tex_pow2 = !(caps.TextureCaps & 
> D3DPTEXTURECAPS_NONPOW2CONDITIONAL); +    cube_pow2 = 
> !!(caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2); + for (i = 0; 
> i < (sizeof(formats) / sizeof(*formats)); ++i) { +        BOOL 
> tex_support, cube_support, surface_support, format_known, 
> dynamic_tex_support; + +        hr = 
> IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, +                0, D3DRTYPE_TEXTURE, 
> formats[i].fmt); +        tex_support = SUCCEEDED(hr); +        hr 
> = IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, +                0, D3DRTYPE_CUBETEXTURE, 
> formats[i].fmt); +        cube_support = SUCCEEDED(hr); +
> hr = IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, +                0, D3DRTYPE_SURFACE, 
> formats[i].fmt); +        surface_support = SUCCEEDED(hr); + + /*
> Scratch pool in general allows texture creation even if the driver
> does +         * not support the format. If the format is an 
> extension format that is not +         * known to the runtime,
> like ATI2N, some driver support is required for +         * this
> to work. +         * +         * It is also possible that Windows 
> Vista and Windows 7 d3d9 runtimes know +         * about ATI2N. I 
> cannot check this because all my Vista+ machines support + * ATI2N
> in hardware, but none of my WinXP machines do. */ + format_known =
> tex_support || cube_support || surface_support; + + for (w = 1; w
> <= 8; w++) +        { +            for (h = 1; h <= 8; h++) +
> { +                BOOL block_aligned = TRUE; +                BOOL
> size_is_pow2; + +                if (w & (formats[i].block_width -
> 1) || h & (formats[i].block_height - 1)) +
> block_aligned = FALSE; + + size_is_pow2 = !(w & (w - 1) || h & (h -
> 1)); + + for (j = 0; j < sizeof(create_tests) /
> sizeof(*create_tests); j++) +                { +
> BOOL support, pow2; + HRESULT expect_hr; +                    BOOL
> may_succeed = FALSE; + IUnknown **check_null; + +
> if (!formats[i].core_fmt) +                    { + /* AMD warns
> against creating ATI2N textures smaller than + * the block size
> because the runtime cannot calculate the + * correct texture size.
> Generalize this for all extension + * formats. */ +
> if (w < formats[i].block_width || h < formats[i].block_height) + 
> continue; +                    } + +                    texture = 
> (IDirect3DTexture9 *)0xdeadbeef; +                    cube_texture 
> = (IDirect3DCubeTexture9 *)0xdeadbeef; +
> surface = (IDirect3DSurface9 *)0xdeadbeef; + +
> switch (create_tests[j].rtype) +                    { + case
> D3DRTYPE_TEXTURE: +                            check_null = 
> (IUnknown **)&texture; +                            hr = 
> IDirect3DDevice9_CreateTexture(device, w, h, 1, 0, + 
> formats[i].fmt, create_tests[j].pool, &texture, NULL); + support =
> tex_support; +                            pow2 = tex_pow2; +
> break; + + case D3DRTYPE_CUBETEXTURE: +
> if (w != h) +                                continue; + check_null
> = (IUnknown **)&cube_texture; + hr =
> IDirect3DDevice9_CreateCubeTexture(device, w, 1, 0, + 
> formats[i].fmt, create_tests[j].pool, &cube_texture, NULL); + 
> support = cube_support; +                            pow2 = 
> cube_pow2; +                            break; + + case
> D3DRTYPE_SURFACE: +                            check_null = 
> (IUnknown **)&surface; +                            hr = 
> IDirect3DDevice9_CreateOffscreenPlainSurface(device, w, h, + 
> formats[i].fmt, create_tests[j].pool, &surface, NULL); + support =
> surface_support; +                            pow2 = FALSE; +
> break; + + default: +                            check_null = NULL;
> + pow2 = FALSE; +                            support = FALSE; + 
> break; +                    } + +                    if 
> (create_tests[j].need_driver_support && !support) + expect_hr =
> D3DERR_INVALIDCALL; +                    else if 
> (create_tests[j].need_runtime_support && !formats[i].core_fmt && 
> !format_known) +                        expect_hr = 
> D3DERR_INVALIDCALL; +                    else if 
> (formats[i].create_size_checked && !block_aligned) + expect_hr =
> D3DERR_INVALIDCALL; +                    else if (pow2 &&
> !size_is_pow2 && create_tests[j].need_driver_support) + expect_hr =
> D3DERR_INVALIDCALL; +                    else + expect_hr = D3D_OK;
> + +                    /* Wine knows about ATI2N and happily
> creates a scratch resource even if GL + * does not support it.
> Accept scratch creation of extension formats on +
> * Windows as well if it occurs. We don't really care if e.g. a
> Windows 7 +                     * on an r200 GPU creates scratch
> ATI2N texture even though the card doesn't + * support it. */ +
> if (!formats[i].core_fmt && !format_known && FAILED(expect_hr)) + 
> may_succeed = TRUE; + +                    ok(hr == expect_hr || 
> ((SUCCEEDED(hr) && may_succeed)), +
> "Got unexpected hr %#x for format %s, pool %s, type %s, size
> %ux%u.\n", +                            hr, formats[i].name, 
> create_tests[j].pool_name, create_tests[j].type_name, w, h); + if
> (FAILED(hr)) +                        ok(*check_null == NULL, "Got
> object ptr %p, expected NULL.\n", *check_null); + else +
> IUnknown_Release(*check_null); + } +            } +        } +
> surface_only = FALSE; -        if 
> (FAILED(IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, -                D3DUSAGE_DYNAMIC, 
> D3DRTYPE_TEXTURE, formats[i].fmt))) +        hr = 
> IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, +                D3DUSAGE_DYNAMIC, 
> D3DRTYPE_TEXTURE, formats[i].fmt); +        dynamic_tex_support = 
> SUCCEEDED(hr);; +        if (!dynamic_tex_support) { - if
> (FAILED(IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, 
> D3DFMT_X8R8G8B8, -                    0, D3DRTYPE_SURFACE, 
> formats[i].fmt))) +            if (!surface_support) {
> skip("Format %s not supported, skipping lockrect offset tests.\n", 
> formats[i].name); continue; @@ -5997,6 +6154,44 @@ static void 
> test_surface_lockrect_blocks(void)
> 
> IDirect3DSurface9_Release(surface); } + +        if 
> (!dynamic_tex_support) +        { +            skip("Dynamic %s 
> textures not supported, skipping mipmap test.\n", formats[i].name);
> +            continue; +        } + +        if 
> (formats[i].block_width == 1 && formats[i].block_height == 1) + 
> continue; +        if (!formats[i].core_fmt) + continue; + +
> hr = IDirect3DDevice9_CreateTexture(device, formats[i].block_width,
> formats[i].block_height, 2, + D3DUSAGE_DYNAMIC, formats[i].fmt,
> D3DPOOL_DEFAULT, &texture, NULL); +        ok(SUCCEEDED(hr),
> "Failed to create texture, hr %#x, format %s.\n", hr,
> formats[i].name); + +        hr = 
> IDirect3DTexture9_LockRect(texture, 1, &locked_rect, NULL, 0); + 
> ok(SUCCEEDED(hr), "Failed lock texture, hr %#x.\n", hr); + hr =
> IDirect3DTexture9_UnlockRect(texture, 1); + ok(SUCCEEDED(hr),
> "Failed lock texture, hr %#x.\n", hr); + + rect.left = 0; +
> rect.top = 0; +        rect.right = formats[i].block_width == 1 ? 1
> : formats[i].block_width >> 1; + rect.bottom =
> formats[i].block_height == 1 ? 1 : formats[i].block_height >> 1; +
> hr = IDirect3DTexture9_LockRect(texture, 1, &locked_rect, &rect,
> 0); + ok(SUCCEEDED(hr), "Failed lock texture, hr %#x.\n", hr); + hr
> = IDirect3DTexture9_UnlockRect(texture, 1); + ok(SUCCEEDED(hr),
> "Failed lock texture, hr %#x.\n", hr); + + rect.right =
> formats[i].block_width; +        rect.bottom = 
> formats[i].block_height; +        hr = 
> IDirect3DTexture9_LockRect(texture, 1, &locked_rect, &rect, 0); + 
> todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", 
> hr); +        if (SUCCEEDED(hr)) + 
> IDirect3DTexture9_UnlockRect(texture, 1); + + 
> IDirect3DTexture9_Release(texture); }
> 
> refcount = IDirect3DDevice9_Release(device); @@ -6779,7 +6974,7 @@ 
> START_TEST(device) test_surface_dimensions(); 
> test_surface_format_null(); test_surface_double_unlock(); - 
> test_surface_lockrect_blocks(); +        test_surface_blocks(); 
> test_set_palette(); test_swvp_buffer(); test_rtpatch();
> 

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJSJdJoAAoJEN0/YqbEcdMwkZkP/18bJEtlTuDSPlTg16mUVZn4
8XeOXELM/a+156LoBAyjy6XC6Mn4kO+fhuzdhKa846bjtL8L3A0HIbVWVw5VVbLi
jV4pU7oXiKP2upSieDAro1IXQAgKabeLaKPYMz3dDJevXZoTglr8S7irzUy7WYhN
/Pxj2vDvV6FDyonaHz/+odvBCnFmfD2FoqbgxWlTQ5fSt6iuCwXklJsmmOXTWjv7
6o4zFlvQ6Q42QSPDhHgDSoiXlpoK4mNfDPE6j1n3BdnCIbse5Peh5V8F1NGcjQJQ
iV9t7gjruiEPhqG/W7zLoDVgRLZIsXiQNY5jNA8JJaGX5eWUrlRRPR1RsANKoaUU
oltPEy3J9D/ILfRc1mK39NpvXuJWnNB8uDjMzGJurs6JCAMQHYaOoUKY7DkJqc9y
n1CzmlDrMeDeverpRSLAXr8MtBPyGbg9NcTzzaLji+7DIyQJNMXU53Gj/heleurs
4ZVfxPaIr3ww2xOlC/tkhjZcy4F/Az48Py2EARRtLp8YMW9skej/U51jc2n32Akd
m8zEdKdWgC0WdLtWEf4+u8O8azuhq4dPiw+iAUC2KNxhwtt0jjDPrV+LsrygRbNG
iZvUgAZLga6X6Pk8vZPrT26nX2WfF1QEVKPAXwWmzd0beVNnGqEuEV24Vrd/RcL+
JicqI3oBax7saTMiRyni
=6u3G
-----END PGP SIGNATURE-----
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0007-d3d8-tests-Test-blocked-texture-creation-restriction.patch
Type: text/x-patch
Size: 13410 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0005.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0008-d3d8-tests-Test-the-behavior-of-failing-surface-crea.patch
Type: text/x-patch
Size: 2768 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0006.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0013-ddraw-tests-Test-blocked-texture-creation-restrictio.patch
Type: text/x-patch
Size: 8595 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0007.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0015-d3d9-tests-Add-tests-for-block-based-volume-formats.patch
Type: text/x-patch
Size: 10390 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0008.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0016-d3d9-tests-Add-tests-for-unsupported-volume-formats.patch
Type: text/x-patch
Size: 3602 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0009.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0007-d3d8-tests-Test-blocked-texture-creation-restriction.patch.sig
Type: application/pgp-signature
Size: 543 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0005.pgp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0008-d3d8-tests-Test-the-behavior-of-failing-surface-crea.patch.sig
Type: application/pgp-signature
Size: 543 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0006.pgp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0013-ddraw-tests-Test-blocked-texture-creation-restrictio.patch.sig
Type: application/pgp-signature
Size: 543 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0007.pgp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0015-d3d9-tests-Add-tests-for-block-based-volume-formats.patch.sig
Type: application/pgp-signature
Size: 543 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0008.pgp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0016-d3d9-tests-Add-tests-for-unsupported-volume-formats.patch.sig
Type: application/pgp-signature
Size: 543 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130903/14e31f11/attachment-0009.pgp>


More information about the wine-devel mailing list