=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d8/tests: Test invalid volume lock boxes.
Alexandre Julliard
julliard at winehq.org
Thu Sep 19 17:21:03 CDT 2013
Module: wine
Branch: master
Commit: 8aa65c79e77d758595465681aa86d29f67180fea
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8aa65c79e77d758595465681aa86d29f67180fea
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Thu Sep 19 11:02:57 2013 +0200
d3d8/tests: Test invalid volume lock boxes.
---
dlls/d3d8/tests/device.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 0 deletions(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index c16ee63..7932a7f 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -5733,6 +5733,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};
+ IDirect3DVolumeTexture8 *texture = NULL;
+ D3DLOCKED_BOX locked_box;
+ IDirect3DDevice8 *device;
+ IDirect3D8 *d3d;
+ unsigned int i;
+ ULONG refcount;
+ HWND window;
+ BYTE *base;
+ HRESULT hr;
+
+ if (!(d3d = pDirect3DCreate8(D3D_SDK_VERSION)))
+ {
+ skip("Failed to create D3D object, skipping tests.\n");
+ return;
+ }
+
+ window = CreateWindowA("d3d8_test_wc", "d3d8_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");
+ IDirect3D8_Release(d3d);
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice8_CreateVolumeTexture(device, 4, 4, 2, 1, 0,
+ D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &texture);
+ ok(SUCCEEDED(hr), "Failed to create volume texture, hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture8_LockBox(texture, 0, &locked_box, NULL, 0);
+ ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr);
+ base = locked_box.pBits;
+ hr = IDirect3DVolumeTexture8_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 = IDirect3DVolumeTexture8_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 = IDirect3DVolumeTexture8_UnlockBox(texture, 0);
+ ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr);
+ }
+
+ /* locked_box = NULL throws an exception on Windows */
+ hr = IDirect3DVolumeTexture8_LockBox(texture, 0, &locked_box, NULL, 0);
+ ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture8_LockBox(texture, 0, &locked_box, NULL, 0);
+ ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture8_UnlockBox(texture, 0);
+ ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture8_UnlockBox(texture, 0);
+ ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirect3DVolumeTexture8_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 = IDirect3DVolumeTexture8_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 = IDirect3DVolumeTexture8_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 = IDirect3DVolumeTexture8_UnlockBox(texture, 0);
+ ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr);
+
+ IDirect3DVolumeTexture8_Release(texture);
+ refcount = IDirect3DDevice8_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ IDirect3D8_Release(d3d);
+ DestroyWindow(window);
+}
+
START_TEST(device)
{
HMODULE d3d8_handle = LoadLibraryA( "d3d8.dll" );
@@ -5814,6 +5934,7 @@ START_TEST(device)
test_update_volumetexture();
test_create_rt_ds_fail();
test_volume_blocks();
+ test_lockbox_invalid();
}
UnregisterClassA("d3d8_test_wc", GetModuleHandleA(NULL));
}
More information about the wine-cvs
mailing list