From 2f9d9b503266d1a8f9f65ef37b1243947d0efb8c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Wed, 18 Sep 2013 12:24:59 +0200 Subject: [PATCH] d3d9/tests: Test invalid volume lock boxes. --- dlls/d3d9/tests/device.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 5e09e329be6..f71f8beec38 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -7299,6 +7299,126 @@ static void test_volume_blocks(void) DestroyWindow(window); } +static void test_lockbox_invalid(void) +{ + static const struct + { + D3DBOX box; + HRESULT result; + } + test_data[] = + { + {{0, 0, 2, 2, 0, 1}, D3D_OK}, /* Valid */ + {{0, 0, 4, 4, 0, 1}, D3D_OK}, /* Valid */ + {{0, 0, 0, 4, 0, 1}, D3DERR_INVALIDCALL}, /* 0 height */ + {{0, 0, 4, 0, 0, 1}, D3DERR_INVALIDCALL}, /* 0 width */ + {{0, 0, 4, 4, 1, 1}, D3DERR_INVALIDCALL}, /* 0 depth */ + {{4, 0, 0, 4, 0, 1}, D3DERR_INVALIDCALL}, /* left > right */ + {{0, 4, 4, 0, 0, 1}, D3DERR_INVALIDCALL}, /* top > bottom */ + {{0, 0, 4, 4, 1, 0}, D3DERR_INVALIDCALL}, /* back > front */ + {{0, 0, 8, 4, 0, 1}, D3DERR_INVALIDCALL}, /* right > surface */ + {{0, 0, 4, 8, 0, 1}, D3DERR_INVALIDCALL}, /* bottom > surface */ + {{0, 0, 4, 4, 0, 3}, D3DERR_INVALIDCALL}, /* back > surface */ + {{8, 0, 16, 4, 0, 1}, D3DERR_INVALIDCALL}, /* left > surface */ + {{0, 8, 4, 16, 0, 1}, D3DERR_INVALIDCALL}, /* top > surface */ + {{0, 0, 4, 4, 2, 4}, D3DERR_INVALIDCALL}, /* top > surface */ + }; + static const D3DBOX test_boxt_2 = {2, 2, 4, 4, 0, 1}; + IDirect3DVolumeTexture9 *texture = NULL; + D3DLOCKED_BOX locked_box; + IDirect3DDevice9 *device; + IDirect3D9 *d3d; + unsigned int i; + ULONG refcount; + HWND window; + BYTE *base; + HRESULT hr; + + if (!(d3d = pDirect3DCreate9(D3D_SDK_VERSION))) + { + skip("Failed to create D3D object, skipping tests.\n"); + return; + } + + window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW, + 0, 0, 640, 480, 0, 0, 0, 0); + if (!(device = create_device(d3d, window, window, TRUE))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + IDirect3D9_Release(d3d); + DestroyWindow(window); + return; + } + + hr = IDirect3DDevice9_CreateVolumeTexture(device, 4, 4, 2, 1, 0, + D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &texture, NULL); + ok(SUCCEEDED(hr), "Failed to create volume texture, hr %#x.\n", hr); + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, NULL, 0); + ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr); + base = locked_box.pBits; + hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0); + ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr); + + for (i = 0; i < (sizeof(test_data) / sizeof(*test_data)); ++i) + { + unsigned int offset, expected_offset; + const D3DBOX *box = &test_data[i].box; + + locked_box.pBits = (BYTE *)0xdeadbeef; + locked_box.RowPitch = 0xdeadbeef; + locked_box.SlicePitch = 0xdeadbeef; + + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, box, 0); + /* Unlike surfaces, volumes properly check the box even in Windows XP */ + ok(hr == test_data[i].result, + "Got unexpected hr %#x with box [%u, %u, %u]->[%u, %u, %u], expected %#x.\n", + hr, box->Left, box->Top, box->Front, box->Right, box->Bottom, box->Back, + test_data[i].result); + if (FAILED(hr)) + continue; + + offset = (BYTE *)locked_box.pBits - base; + expected_offset = box->Front * locked_box.SlicePitch + box->Top * locked_box.RowPitch + box->Left * 4; + ok(offset == expected_offset, + "Got unexpected offset %u (expected %u) for rect [%u, %u, %u]->[%u, %u, %u].\n", + offset, expected_offset, box->Left, box->Top, box->Front, box->Right, box->Bottom, box->Back); + + hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0); + ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr); + } + + /* locked_box = NULL throws an exception on Windows */ + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, NULL, 0); + ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr); + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, NULL, 0); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0); + ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr); + hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, &test_data[0].box, 0); + ok(hr == D3D_OK, "Got unexpected hr %#x for rect [%u, %u, %u]->[%u, %u, %u].\n", + hr, test_data[0].box.Left, test_data[0].box.Top, test_data[0].box.Front, + test_data[0].box.Right, test_data[0].box.Bottom, test_data[0].box.Back); + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, &test_data[0].box, 0); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for rect [%u, %u, %u]->[%u, %u, %u].\n", + hr, test_data[0].box.Left, test_data[0].box.Top, test_data[0].box.Front, + test_data[0].box.Right, test_data[0].box.Bottom, test_data[0].box.Back); + hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &locked_box, &test_boxt_2, 0); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for rect [%u, %u, %u]->[%u, %u, %u].\n", + hr, test_boxt_2.Left, test_boxt_2.Top, test_boxt_2.Front, + test_boxt_2.Right, test_boxt_2.Bottom, test_boxt_2.Back); + hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0); + ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr); + + IDirect3DVolumeTexture9_Release(texture); + refcount = IDirect3DDevice9_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + IDirect3D9_Release(d3d); + DestroyWindow(window); +} + START_TEST(device) { HMODULE d3d9_handle = LoadLibraryA( "d3d9.dll" ); @@ -7393,6 +7513,7 @@ START_TEST(device) test_update_volumetexture(); test_create_rt_ds_fail(); test_volume_blocks(); + test_lockbox_invalid(); } out: -- 2.11.4.GIT