=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: ddraw/tests: Test matrices in TransformVertices.
Alexandre Julliard
julliard at winehq.org
Fri Sep 2 11:41:44 CDT 2016
Module: wine
Branch: master
Commit: 33fbdd8bdca60d48c3e0afc7224d57408ec45057
URL: http://source.winehq.org/git/wine.git/?a=commit;h=33fbdd8bdca60d48c3e0afc7224d57408ec45057
Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date: Thu Sep 1 23:46:47 2016 +0100
ddraw/tests: Test matrices in TransformVertices.
Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ddraw/tests/ddraw1.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index e8194b3..1271022 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -9130,6 +9130,11 @@ static void test_transform_vertices(void)
HWND window;
HRESULT hr;
IDirect3DViewport *viewport;
+ IDirect3DExecuteBuffer *execute_buffer;
+ D3DEXECUTEBUFFERDESC exec_desc;
+ UINT inst_length;
+ void *ptr;
+ D3DMATRIXHANDLE world_handle, view_handle, proj_handle;
static struct transform_input position_tests[] =
{
{ 0.0f, 0.0f, 0.0f, 0.0f, 1, 2, 3, 4, 5},
@@ -9163,6 +9168,28 @@ static void test_transform_vertices(void)
};
unsigned int i;
DWORD offscreen;
+ static D3DMATRIX mat_scale =
+ {
+ 2.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 2.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 2.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+ },
+ mat_translate1 =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 1.0f,
+ },
+ mat_translate2 =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 1.0f,
+ };
+
for (i = 0; i < ARRAY_SIZE(out); ++i)
{
@@ -9439,6 +9466,83 @@ static void test_transform_vertices(void)
ok(SUCCEEDED(hr), "Failed to transform vertices, hr %#x.\n", hr);
ok(offscreen == D3DCLIP_RIGHT, "Offscreen is %x.\n", offscreen);
+ /* Test the effect of Matrices.
+ *
+ * Basically the x coodinate ends up as ((x + 1) * 2 + 0) * 5 and
+ * y as ((y + 0) * 2 + 1) * 5. The 5 comes from dvScaleX/Y, 2 from
+ * the view matrix and the +1's from the world and projection matrix. */
+ vp_data.dwX = 0;
+ vp_data.dwX = 0;
+ vp_data.dwWidth = 256;
+ vp_data.dwHeight = 256;
+ vp_data.dvScaleX = 5.0f;
+ vp_data.dvScaleY = 5.0f;
+ vp_data.dvMinZ = 0.0f;
+ vp_data.dvMaxZ = 1.0f;
+ hr = IDirect3DViewport_SetViewport(viewport, &vp_data);
+ ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice_CreateMatrix(device, &world_handle);
+ ok(hr == D3D_OK, "Creating a matrix object failed, hr %#x.\n", hr);
+ hr = IDirect3DDevice_SetMatrix(device, world_handle, &mat_translate1);
+ ok(hr == D3D_OK, "Setting a matrix object failed, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice_CreateMatrix(device, &view_handle);
+ ok(hr == D3D_OK, "Creating a matrix object failed, hr %#x.\n", hr);
+ hr = IDirect3DDevice_SetMatrix(device, view_handle, &mat_scale);
+ ok(hr == D3D_OK, "Setting a matrix object failed, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice_CreateMatrix(device, &proj_handle);
+ ok(hr == D3D_OK, "Creating a matrix object failed, hr %#x.\n", hr);
+ hr = IDirect3DDevice_SetMatrix(device, proj_handle, &mat_translate2);
+ ok(hr == D3D_OK, "Setting a matrix object failed, hr %#x.\n", hr);
+
+ memset(&exec_desc, 0, sizeof(exec_desc));
+ exec_desc.dwSize = sizeof(exec_desc);
+ exec_desc.dwFlags = D3DDEB_BUFSIZE | D3DDEB_CAPS;
+ exec_desc.dwBufferSize = 1024;
+ exec_desc.dwCaps = D3DDEBCAPS_SYSTEMMEMORY;
+ hr = IDirect3DDevice_CreateExecuteBuffer(device, &exec_desc, &execute_buffer, NULL);
+ ok(SUCCEEDED(hr), "Failed to create execute buffer, hr %#x.\n", hr);
+
+ hr = IDirect3DExecuteBuffer_Lock(execute_buffer, &exec_desc);
+ ok(SUCCEEDED(hr), "Failed to lock execute buffer, hr %#x.\n", hr);
+ ptr = (BYTE *)exec_desc.lpData;
+ emit_set_ts(&ptr, D3DTRANSFORMSTATE_WORLD, world_handle);
+ emit_set_ts(&ptr, D3DTRANSFORMSTATE_VIEW, view_handle);
+ emit_set_ts(&ptr, D3DTRANSFORMSTATE_PROJECTION, proj_handle);
+ emit_end(&ptr);
+ inst_length = (BYTE *)ptr - (BYTE *)exec_desc.lpData;
+ hr = IDirect3DExecuteBuffer_Unlock(execute_buffer);
+ ok(SUCCEEDED(hr), "Failed to unlock execute buffer, hr %#x.\n", hr);
+
+ set_execute_data(execute_buffer, 0, 0, inst_length);
+ hr = IDirect3DDevice_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice_Execute(device, execute_buffer, viewport, D3DEXECUTE_CLIPPED);
+ ok(SUCCEEDED(hr), "Failed to execute exec buffer, hr %#x.\n", hr);
+ hr = IDirect3DDevice_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ transformdata.lpIn = position_tests;
+ transformdata.dwInSize = sizeof(position_tests[0]);
+ hr = IDirect3DViewport_TransformVertices(viewport, ARRAY_SIZE(position_tests),
+ &transformdata, D3DTRANSFORM_UNCLIPPED, &offscreen);
+ ok(SUCCEEDED(hr), "Failed to transform vertices, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(position_tests); ++i)
+ {
+ static const struct vec4 cmp[] =
+ {
+ {138.0f, 123.0f, 0.0f, 1.0f}, {148.0f, 113.0f, 2.0f, 1.0f}, {128.0f, 133.0f, -2.0f, 1.0f},
+ {143.0f, 118.0f, 1.0f, 1.0f}, {133.0f, 128.0f, -1.0f, 1.0f}, {133.0f, 128.0f, 0.0f, 1.0f}
+ };
+
+ todo_wine ok(compare_vec4(&cmp[i], out[i].x, out[i].y, out[i].z, out[i].w, 4096),
+ "Vertex %u differs. Got %f %f %f %f.\n", i,
+ out[i].x, out[i].y, out[i].z, out[i].w);
+ }
+
/* Invalid flags. */
offscreen = 0xdeadbeef;
hr = IDirect3DViewport_TransformVertices(viewport, ARRAY_SIZE(position_tests),
@@ -9496,6 +9600,11 @@ static void test_transform_vertices(void)
ok(SUCCEEDED(hr), "Failed to transform vertices, hr %#x.\n", hr);
ok(offscreen == ~0U, "Offscreen is %x.\n", offscreen);
+ IDirect3DDevice_DeleteMatrix(device, world_handle);
+ IDirect3DDevice_DeleteMatrix(device, view_handle);
+ IDirect3DDevice_DeleteMatrix(device, proj_handle);
+ IDirect3DExecuteBuffer_Release(execute_buffer);
+
destroy_viewport(device, viewport);
refcount = IDirect3DDevice_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
More information about the wine-cvs
mailing list