[PATCH 3/5] ddraw/tests: Move the Direct3D7 ProcessVertices() test to ddraw7.c.

Henri Verbeet hverbeet at codeweavers.com
Mon Dec 19 14:00:07 CST 2011


---
 dlls/ddraw/tests/Makefile.in |    1 +
 dlls/ddraw/tests/d3d.c       |  224 ----------------------------
 dlls/ddraw/tests/ddraw7.c    |  329 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 330 insertions(+), 224 deletions(-)
 create mode 100644 dlls/ddraw/tests/ddraw7.c

diff --git a/dlls/ddraw/tests/Makefile.in b/dlls/ddraw/tests/Makefile.in
index 419ec5d..a78908c 100644
--- a/dlls/ddraw/tests/Makefile.in
+++ b/dlls/ddraw/tests/Makefile.in
@@ -4,6 +4,7 @@ IMPORTS   = ddraw user32 gdi32 ole32
 C_SRCS = \
 	d3d.c \
 	ddraw4.c \
+	ddraw7.c \
 	ddrawmodes.c \
 	dsurface.c \
 	overlay.c \
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index 43d53af..e24eb30 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -35,8 +35,6 @@ static LPDIRECTDRAWSURFACE7    lpDDS = NULL;
 static LPDIRECTDRAWSURFACE7    lpDDSdepth = NULL;
 static LPDIRECT3DDEVICE7       lpD3DDevice = NULL;
 static LPDIRECT3DVERTEXBUFFER7 lpVBufSrc = NULL;
-static LPDIRECT3DVERTEXBUFFER7 lpVBufDest1 = NULL;
-static LPDIRECT3DVERTEXBUFFER7 lpVBufDest2 = NULL;
 
 static IDirectDraw *DirectDraw1 = NULL;
 static IDirectDrawSurface *Surface1 = NULL;
@@ -71,47 +69,6 @@ typedef struct
 
 static HRESULT (WINAPI *pDirectDrawCreateEx)(LPGUID,LPVOID*,REFIID,LPUNKNOWN);
 
-struct vec3
-{
-    float x, y, z;
-};
-
-struct vec4
-{
-    float x, y, z, w;
-};
-
-static BOOL compare_float(float f, float g, unsigned int ulps)
-{
-    int x = *(int *)&f;
-    int y = *(int *)&g;
-
-    if (x < 0)
-        x = INT_MIN - x;
-    if (y < 0)
-        y = INT_MIN - y;
-
-    if (abs(x - y) > ulps)
-        return FALSE;
-
-    return TRUE;
-}
-
-static BOOL compare_vec3(struct vec3 *vec, float x, float y, float z, unsigned int ulps)
-{
-    return compare_float(vec->x, x, ulps)
-            && compare_float(vec->y, y, ulps)
-            && compare_float(vec->z, z, ulps);
-}
-
-static BOOL compare_vec4(struct vec4 *vec, float x, float y, float z, float w, unsigned int ulps)
-{
-    return compare_float(vec->x, x, ulps)
-            && compare_float(vec->y, y, ulps)
-            && compare_float(vec->z, z, ulps)
-            && compare_float(vec->w, w, ulps);
-}
-
 static void init_function_pointers(void)
 {
     HMODULE hmod = GetModuleHandleA("ddraw.dll");
@@ -453,186 +410,6 @@ static void LightTest(void)
     }
 }
 
-static void ProcessVerticesTest(void)
-{
-    D3DVERTEXBUFFERDESC desc;
-    struct vec4 *out;
-    struct vec3 *out2;
-    struct vec3 *in;
-    D3DVIEWPORT7 vp;
-    HRESULT hr;
-
-    D3DMATRIX view = {  2.0, 0.0, 0.0, 0.0,
-                        0.0, -1.0, 0.0, 0.0,
-                        0.0, 0.0, 1.0, 0.0,
-                        0.0, 0.0, 0.0, 3.0 };
-
-    D3DMATRIX world = { 0.0, 1.0, 0.0, 0.0,
-                        1.0, 0.0, 0.0, 0.0,
-                        0.0, 0.0, 0.0, 1.0,
-                        0.0, 1.0, 1.0, 1.0 };
-
-    D3DMATRIX proj = {  1.0, 0.0, 0.0, 1.0,
-                        0.0, 1.0, 1.0, 0.0,
-                        0.0, 1.0, 1.0, 0.0,
-                        1.0, 0.0, 0.0, 1.0 };
-    /* Create some vertex buffers */
-
-    memset(&desc, 0, sizeof(desc));
-    desc.dwSize = sizeof(desc);
-    desc.dwCaps = 0;
-    desc.dwFVF = D3DFVF_XYZ;
-    desc.dwNumVertices = 16;
-    hr = IDirect3D7_CreateVertexBuffer(lpD3D, &desc, &lpVBufSrc, 0);
-    ok(SUCCEEDED(hr), "Failed to create vertex buffer, hr %#x.\n", hr);
-
-    memset(&desc, 0, sizeof(desc));
-    desc.dwSize = sizeof(desc);
-    desc.dwCaps = 0;
-    desc.dwFVF = D3DFVF_XYZRHW;
-    desc.dwNumVertices = 16;
-    /* Msdn says that the last parameter must be 0 - check that */
-    hr = IDirect3D7_CreateVertexBuffer(lpD3D, &desc, &lpVBufDest1, 4);
-    ok(SUCCEEDED(hr), "Failed to create vertex buffer, hr %#x.\n", hr);
-
-    memset(&desc, 0, sizeof(desc));
-    desc.dwSize = sizeof(desc);
-    desc.dwCaps = 0;
-    desc.dwFVF = D3DFVF_XYZ;
-    desc.dwNumVertices = 16;
-    /* Msdn says that the last parameter must be 0 - check that */
-    hr = IDirect3D7_CreateVertexBuffer(lpD3D, &desc, &lpVBufDest2, 12345678);
-    ok(SUCCEEDED(hr), "Failed to create vertex buffer, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_Lock(lpVBufSrc, 0, (void **)&in, NULL);
-    ok(SUCCEEDED(hr), "Failed to lock source vertex buffer, hr %#x.\n", hr);
-    in[0].x = 0.0f;
-    in[0].y = 0.0f;
-    in[0].z = 0.0f;
-    in[1].x = 1.0f;
-    in[1].y = 1.0f;
-    in[1].z = 1.0f;
-    in[2].x = -1.0f;
-    in[2].y = -1.0f;
-    in[2].z = 0.5f;
-    in[3].x = 0.5f;
-    in[3].y = -0.5f;
-    in[3].z = 0.25f;
-    hr = IDirect3DVertexBuffer7_Unlock(lpVBufSrc);
-    ok(SUCCEEDED(hr), "Failed to unlock source vertex buffer, hr %#x.\n", hr);
-
-    memset(&vp, 0, sizeof(vp));
-    vp.dwX = 64;
-    vp.dwY = 64;
-    vp.dwWidth = 128;
-    vp.dwHeight = 128;
-    vp.dvMinZ = 0.0f;
-    vp.dvMaxZ = 1.0f;
-    hr = IDirect3DDevice7_SetViewport(lpD3DDevice, &vp);
-    ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_ProcessVertices(lpVBufDest1, D3DVOP_TRANSFORM, 0, 4, lpVBufSrc, 0, lpD3DDevice, 0);
-    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
-    hr = IDirect3DVertexBuffer7_ProcessVertices(lpVBufDest2, D3DVOP_TRANSFORM, 0, 4, lpVBufSrc, 0, lpD3DDevice, 0);
-    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_Lock(lpVBufDest1, 0, (void **)&out, NULL);
-    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
-    ok(compare_vec4(&out[0], +1.280e+2f, +1.280e+2f, +0.000e+0f, +1.000e+0f, 4096),
-            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[0].x, out[0].y, out[0].z, out[0].w);
-    ok(compare_vec4(&out[1], +1.920e+2f, +6.400e+1f, +1.000e+0f, +1.000e+0f, 4096),
-            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[1].x, out[1].y, out[1].z, out[1].w);
-    ok(compare_vec4(&out[2], +6.400e+1f, +1.920e+2f, +5.000e-1f, +1.000e+0f, 4096),
-            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[2].x, out[2].y, out[2].z, out[2].w);
-    ok(compare_vec4(&out[3], +1.600e+2f, +1.600e+2f, +2.500e-1f, +1.000e+0f, 4096),
-            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[3].x, out[3].y, out[3].z, out[3].w);
-    hr = IDirect3DVertexBuffer7_Unlock(lpVBufDest1);
-    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
-    out = NULL;
-
-    hr = IDirect3DVertexBuffer7_Lock(lpVBufDest2, 0, (void **)&out2, NULL);
-    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
-    /* Small thing without much practical meaning, but I stumbled upon it,
-     * so let's check for it: If the output vertex buffer has to RHW value,
-     * The RHW value of the last vertex is written into the next vertex. */
-    ok(compare_vec3(&out2[4], +1.000e+0f, +0.000e+0f, +0.000e+0f, 4096),
-            "Got unexpected vertex 4 {%.8e, %.8e, %.8e}.\n",
-            out2[4].x, out2[4].y, out2[4].z);
-    hr = IDirect3DVertexBuffer7_Unlock(lpVBufDest2);
-    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
-    out = NULL;
-
-    /* Try a more complicated viewport, same vertices. */
-    memset(&vp, 0, sizeof(vp));
-    vp.dwX = 10;
-    vp.dwY = 5;
-    vp.dwWidth = 246;
-    vp.dwHeight = 130;
-    vp.dvMinZ = -2.0;
-    vp.dvMaxZ = 4.0;
-    hr = IDirect3DDevice7_SetViewport(lpD3DDevice, &vp);
-    ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
-
-    /* Process again */
-    hr = IDirect3DVertexBuffer7_ProcessVertices(lpVBufDest1, D3DVOP_TRANSFORM, 0, 4, lpVBufSrc, 0, lpD3DDevice, 0);
-    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_Lock(lpVBufDest1, 0, (void **) &out, NULL);
-    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
-    ok(compare_vec4(&out[0], +1.330e+2f, +7.000e+1f, -2.000e+0f, +1.000e+0f, 4096),
-            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[0].x, out[0].y, out[0].z, out[0].w);
-    ok(compare_vec4(&out[1], +2.560e+2f, +5.000e+0f, +4.000e+0f, +1.000e+0f, 4096),
-            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[1].x, out[1].y, out[1].z, out[1].w);
-    ok(compare_vec4(&out[2], +1.000e+1f, +1.350e+2f, +1.000e+0f, +1.000e+0f, 4096),
-            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[2].x, out[2].y, out[2].z, out[2].w);
-    ok(compare_vec4(&out[3], +1.945e+2f, +1.025e+2f, -5.000e-1f, +1.000e+0f, 4096),
-            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[3].x, out[3].y, out[3].z, out[3].w);
-    hr = IDirect3DVertexBuffer7_Unlock(lpVBufDest1);
-    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
-    out = NULL;
-
-    /* Play with some matrices. */
-    hr = IDirect3DDevice7_SetTransform(lpD3DDevice, D3DTRANSFORMSTATE_WORLD, &world);
-    ok(SUCCEEDED(hr), "Failed to set world transform, hr %#x.\n", hr);
-    hr = IDirect3DDevice7_SetTransform(lpD3DDevice, D3DTRANSFORMSTATE_VIEW, &view);
-    ok(SUCCEEDED(hr), "Failed to set view transform, hr %#x.\n", hr);
-    hr = IDirect3DDevice7_SetTransform(lpD3DDevice, D3DTRANSFORMSTATE_PROJECTION, &proj);
-    ok(SUCCEEDED(hr), "Failed to set projection transform, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_ProcessVertices(lpVBufDest1, D3DVOP_TRANSFORM, 0, 4, lpVBufSrc, 0, lpD3DDevice, 0);
-    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
-
-    hr = IDirect3DVertexBuffer7_Lock(lpVBufDest1, 0, (void **) &out, NULL);
-    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
-    ok(compare_vec4(&out[0], +2.560e+2f, +7.000e+1f, -2.000e+0f, +3.333e-1f, 4096),
-            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[0].x, out[0].y, out[0].z, out[0].w);
-    ok(compare_vec4(&out[1], +2.560e+2f, +7.813e+1f, -2.750e+0f, +1.250e-1f, 4096),
-            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[1].x, out[1].y, out[1].z, out[1].w);
-    ok(compare_vec4(&out[2], +2.560e+2f, +4.400e+1f, +4.000e-1f, +4.000e-1f, 4096),
-            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[2].x, out[2].y, out[2].z, out[2].w);
-    ok(compare_vec4(&out[3], +2.560e+2f, +8.182e+1f, -3.091e+0f, +3.636e-1f, 4096),
-            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
-            out[3].x, out[3].y, out[3].z, out[3].w);
-    hr = IDirect3DVertexBuffer7_Unlock(lpVBufDest1);
-    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
-    out = NULL;
-
-    IDirect3DVertexBuffer7_Release(lpVBufSrc);
-    IDirect3DVertexBuffer7_Release(lpVBufDest1);
-    IDirect3DVertexBuffer7_Release(lpVBufDest2);
-}
-
 static void StateTest( void )
 {
     HRESULT rc;
@@ -5157,7 +4934,6 @@ START_TEST(d3d)
         skip("Skipping d3d7 tests\n");
     } else {
         LightTest();
-        ProcessVerticesTest();
         StateTest();
         SceneTest();
         LimitTest();
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
new file mode 100644
index 0000000..3ebf58c
--- /dev/null
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2006 Stefan Dösinger for CodeWeavers
+ * Copyright 2011 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/test.h"
+#include <limits.h>
+#include "d3d.h"
+
+static HRESULT (WINAPI *pDirectDrawCreateEx)(GUID *guid, void **ddraw, REFIID iid, IUnknown *outer_unknown);
+
+struct vec3
+{
+    float x, y, z;
+};
+
+struct vec4
+{
+    float x, y, z, w;
+};
+
+static BOOL compare_float(float f, float g, unsigned int ulps)
+{
+    int x = *(int *)&f;
+    int y = *(int *)&g;
+
+    if (x < 0)
+        x = INT_MIN - x;
+    if (y < 0)
+        y = INT_MIN - y;
+
+    if (abs(x - y) > ulps)
+        return FALSE;
+
+    return TRUE;
+}
+
+static BOOL compare_vec3(struct vec3 *vec, float x, float y, float z, unsigned int ulps)
+{
+    return compare_float(vec->x, x, ulps)
+            && compare_float(vec->y, y, ulps)
+            && compare_float(vec->z, z, ulps);
+}
+
+static BOOL compare_vec4(struct vec4 *vec, float x, float y, float z, float w, unsigned int ulps)
+{
+    return compare_float(vec->x, x, ulps)
+            && compare_float(vec->y, y, ulps)
+            && compare_float(vec->z, z, ulps)
+            && compare_float(vec->w, w, ulps);
+}
+
+static IDirect3DDevice7 *create_device(HWND window, DWORD coop_level)
+{
+    IDirect3DDevice7 *device = NULL;
+    IDirectDrawSurface7 *surface;
+    DDSURFACEDESC2 surface_desc;
+    IDirectDraw7 *ddraw;
+    IDirect3D7 *d3d7;
+    HRESULT hr;
+
+    if (FAILED(pDirectDrawCreateEx(NULL, (void **)&ddraw, &IID_IDirectDraw7, NULL)))
+        return NULL;
+
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, coop_level);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    memset(&surface_desc, 0, sizeof(surface_desc));
+    surface_desc.dwSize = sizeof(surface_desc);
+    surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+    surface_desc.dwWidth = 640;
+    surface_desc.dwHeight = 480;
+
+    hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+    if (coop_level & DDSCL_NORMAL)
+    {
+        IDirectDrawClipper *clipper;
+
+        hr = IDirectDraw7_CreateClipper(ddraw, 0, &clipper, NULL);
+        ok(SUCCEEDED(hr), "Failed to create clipper, hr %#x.\n", hr);
+        hr = IDirectDrawClipper_SetHWnd(clipper, 0, window);
+        ok(SUCCEEDED(hr), "Failed to set clipper window, hr %#x.\n", hr);
+        hr = IDirectDrawSurface7_SetClipper(surface, clipper);
+        ok(SUCCEEDED(hr), "Failed to set surface clipper, hr %#x.\n", hr);
+        IDirectDrawClipper_Release(clipper);
+    }
+
+    hr = IDirectDraw7_QueryInterface(ddraw, &IID_IDirect3D7, (void **)&d3d7);
+    IDirectDraw7_Release(ddraw);
+    if (FAILED(hr))
+    {
+        IDirectDrawSurface7_Release(surface);
+        return NULL;
+    }
+
+    hr = IDirect3D7_CreateDevice(d3d7, &IID_IDirect3DTnLHalDevice, surface, &device);
+    IDirect3D7_Release(d3d7);
+    IDirectDrawSurface7_Release(surface);
+    if (FAILED(hr))
+        return NULL;
+
+    return device;
+}
+
+static void test_process_vertices(void)
+{
+    IDirect3DVertexBuffer7 *src_vb, *dst_vb1, *dst_vb2;
+    D3DVERTEXBUFFERDESC vb_desc;
+    IDirect3DDevice7 *device;
+    struct vec4 *dst_data;
+    struct vec3 *dst_data2;
+    struct vec3 *src_data;
+    IDirect3D7 *d3d7;
+    D3DVIEWPORT7 vp;
+    HWND window;
+    HRESULT hr;
+
+    static D3DMATRIX world =
+    {
+        0.0f,  1.0f, 0.0f, 0.0f,
+        1.0f,  0.0f, 0.0f, 0.0f,
+        0.0f,  0.0f, 0.0f, 1.0f,
+        0.0f,  1.0f, 1.0f, 1.0f,
+    };
+    static D3DMATRIX view =
+    {
+        2.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,  0.0f, 0.0f, 3.0f,
+    };
+    static D3DMATRIX proj =
+    {
+        1.0f,  0.0f, 0.0f, 1.0f,
+        0.0f,  1.0f, 1.0f, 0.0f,
+        0.0f,  1.0f, 1.0f, 0.0f,
+        1.0f,  0.0f, 0.0f, 1.0f,
+    };
+
+    window = CreateWindowA("static", "d3d7_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    if (!(device = create_device(window, DDSCL_NORMAL)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        DestroyWindow(window);
+        return;
+    }
+
+    hr = IDirect3DDevice7_GetDirect3D(device, &d3d7);
+    ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr);
+
+    memset(&vb_desc, 0, sizeof(vb_desc));
+    vb_desc.dwSize = sizeof(vb_desc);
+    vb_desc.dwFVF = D3DFVF_XYZ;
+    vb_desc.dwNumVertices = 4;
+    hr = IDirect3D7_CreateVertexBuffer(d3d7, &vb_desc, &src_vb, 0);
+    ok(SUCCEEDED(hr), "Failed to create source vertex buffer, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_Lock(src_vb, 0, (void **)&src_data, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock source vertex buffer, hr %#x.\n", hr);
+    src_data[0].x = 0.0f;
+    src_data[0].y = 0.0f;
+    src_data[0].z = 0.0f;
+    src_data[1].x = 1.0f;
+    src_data[1].y = 1.0f;
+    src_data[1].z = 1.0f;
+    src_data[2].x = -1.0f;
+    src_data[2].y = -1.0f;
+    src_data[2].z = 0.5f;
+    src_data[3].x = 0.5f;
+    src_data[3].y = -0.5f;
+    src_data[3].z = 0.25f;
+    hr = IDirect3DVertexBuffer7_Unlock(src_vb);
+    ok(SUCCEEDED(hr), "Failed to unlock source vertex buffer, hr %#x.\n", hr);
+
+    memset(&vb_desc, 0, sizeof(vb_desc));
+    vb_desc.dwSize = sizeof(vb_desc);
+    vb_desc.dwFVF = D3DFVF_XYZRHW;
+    vb_desc.dwNumVertices = 4;
+    /* MSDN says that the last parameter must be 0 - check that. */
+    hr = IDirect3D7_CreateVertexBuffer(d3d7, &vb_desc, &dst_vb1, 4);
+    ok(SUCCEEDED(hr), "Failed to create vertex buffer, hr %#x.\n", hr);
+
+    memset(&vb_desc, 0, sizeof(vb_desc));
+    vb_desc.dwSize = sizeof(vb_desc);
+    vb_desc.dwFVF = D3DFVF_XYZ;
+    vb_desc.dwNumVertices = 5;
+    /* MSDN says that the last parameter must be 0 - check that. */
+    hr = IDirect3D7_CreateVertexBuffer(d3d7, &vb_desc, &dst_vb2, 12345678);
+    ok(SUCCEEDED(hr), "Failed to create vertex buffer, hr %#x.\n", hr);
+
+    memset(&vp, 0, sizeof(vp));
+    vp.dwX = 64;
+    vp.dwY = 64;
+    vp.dwWidth = 128;
+    vp.dwHeight = 128;
+    vp.dvMinZ = 0.0f;
+    vp.dvMaxZ = 1.0f;
+    hr = IDirect3DDevice7_SetViewport(device, &vp);
+    ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_ProcessVertices(dst_vb1, D3DVOP_TRANSFORM, 0, 4, src_vb, 0, device, 0);
+    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
+    hr = IDirect3DVertexBuffer7_ProcessVertices(dst_vb2, D3DVOP_TRANSFORM, 0, 4, src_vb, 0, device, 0);
+    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_Lock(dst_vb1, 0, (void **)&dst_data, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
+    ok(compare_vec4(&dst_data[0], +1.280e+2f, +1.280e+2f, +0.000e+0f, +1.000e+0f, 4096),
+            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[0].x, dst_data[0].y, dst_data[0].z, dst_data[0].w);
+    ok(compare_vec4(&dst_data[1], +1.920e+2f, +6.400e+1f, +1.000e+0f, +1.000e+0f, 4096),
+            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[1].x, dst_data[1].y, dst_data[1].z, dst_data[1].w);
+    ok(compare_vec4(&dst_data[2], +6.400e+1f, +1.920e+2f, +5.000e-1f, +1.000e+0f, 4096),
+            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[2].x, dst_data[2].y, dst_data[2].z, dst_data[2].w);
+    ok(compare_vec4(&dst_data[3], +1.600e+2f, +1.600e+2f, +2.500e-1f, +1.000e+0f, 4096),
+            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[3].x, dst_data[3].y, dst_data[3].z, dst_data[3].w);
+    hr = IDirect3DVertexBuffer7_Unlock(dst_vb1);
+    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_Lock(dst_vb2, 0, (void **)&dst_data2, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
+    /* Small thing without much practical meaning, but I stumbled upon it,
+     * so let's check for it: If the output vertex buffer has no RHW value,
+     * the RHW value of the last vertex is written into the next vertex. */
+    ok(compare_vec3(&dst_data2[4], +1.000e+0f, +0.000e+0f, +0.000e+0f, 4096),
+            "Got unexpected vertex 4 {%.8e, %.8e, %.8e}.\n",
+            dst_data2[4].x, dst_data2[4].y, dst_data2[4].z);
+    hr = IDirect3DVertexBuffer7_Unlock(dst_vb2);
+    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
+
+    /* Try a more complicated viewport, same vertices. */
+    memset(&vp, 0, sizeof(vp));
+    vp.dwX = 10;
+    vp.dwY = 5;
+    vp.dwWidth = 246;
+    vp.dwHeight = 130;
+    vp.dvMinZ = -2.0f;
+    vp.dvMaxZ = 4.0f;
+    hr = IDirect3DDevice7_SetViewport(device, &vp);
+    ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_ProcessVertices(dst_vb1, D3DVOP_TRANSFORM, 0, 4, src_vb, 0, device, 0);
+    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_Lock(dst_vb1, 0, (void **)&dst_data, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
+    ok(compare_vec4(&dst_data[0], +1.330e+2f, +7.000e+1f, -2.000e+0f, +1.000e+0f, 4096),
+            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[0].x, dst_data[0].y, dst_data[0].z, dst_data[0].w);
+    ok(compare_vec4(&dst_data[1], +2.560e+2f, +5.000e+0f, +4.000e+0f, +1.000e+0f, 4096),
+            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[1].x, dst_data[1].y, dst_data[1].z, dst_data[1].w);
+    ok(compare_vec4(&dst_data[2], +1.000e+1f, +1.350e+2f, +1.000e+0f, +1.000e+0f, 4096),
+            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[2].x, dst_data[2].y, dst_data[2].z, dst_data[2].w);
+    ok(compare_vec4(&dst_data[3], +1.945e+2f, +1.025e+2f, -5.000e-1f, +1.000e+0f, 4096),
+            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[3].x, dst_data[3].y, dst_data[3].z, dst_data[3].w);
+    hr = IDirect3DVertexBuffer7_Unlock(dst_vb1);
+    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
+
+    hr = IDirect3DDevice7_SetTransform(device, D3DTRANSFORMSTATE_WORLD, &world);
+    ok(SUCCEEDED(hr), "Failed to set world transform, hr %#x.\n", hr);
+    hr = IDirect3DDevice7_SetTransform(device, D3DTRANSFORMSTATE_VIEW, &view);
+    ok(SUCCEEDED(hr), "Failed to set view transform, hr %#x.\n", hr);
+    hr = IDirect3DDevice7_SetTransform(device, D3DTRANSFORMSTATE_PROJECTION, &proj);
+    ok(SUCCEEDED(hr), "Failed to set projection transform, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_ProcessVertices(dst_vb1, D3DVOP_TRANSFORM, 0, 4, src_vb, 0, device, 0);
+    ok(SUCCEEDED(hr), "Failed to process vertices, hr %#x.\n", hr);
+
+    hr = IDirect3DVertexBuffer7_Lock(dst_vb1, 0, (void **)&dst_data, NULL);
+    ok(SUCCEEDED(hr), "Failed to lock destination vertex buffer, hr %#x.\n", hr);
+    ok(compare_vec4(&dst_data[0], +2.560e+2f, +7.000e+1f, -2.000e+0f, +3.333e-1f, 4096),
+            "Got unexpected vertex 0 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[0].x, dst_data[0].y, dst_data[0].z, dst_data[0].w);
+    ok(compare_vec4(&dst_data[1], +2.560e+2f, +7.813e+1f, -2.750e+0f, +1.250e-1f, 4096),
+            "Got unexpected vertex 1 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[1].x, dst_data[1].y, dst_data[1].z, dst_data[1].w);
+    ok(compare_vec4(&dst_data[2], +2.560e+2f, +4.400e+1f, +4.000e-1f, +4.000e-1f, 4096),
+            "Got unexpected vertex 2 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[2].x, dst_data[2].y, dst_data[2].z, dst_data[2].w);
+    ok(compare_vec4(&dst_data[3], +2.560e+2f, +8.182e+1f, -3.091e+0f, +3.636e-1f, 4096),
+            "Got unexpected vertex 3 {%.8e, %.8e, %.8e, %.8e}.\n",
+            dst_data[3].x, dst_data[3].y, dst_data[3].z, dst_data[3].w);
+    hr = IDirect3DVertexBuffer7_Unlock(dst_vb1);
+    ok(SUCCEEDED(hr), "Failed to unlock destination vertex buffer, hr %#x.\n", hr);
+
+    IDirect3DVertexBuffer7_Release(dst_vb2);
+    IDirect3DVertexBuffer7_Release(dst_vb1);
+    IDirect3DVertexBuffer7_Release(src_vb);
+    IDirect3D7_Release(d3d7);
+    IDirect3DDevice7_Release(device);
+    DestroyWindow(window);
+}
+
+START_TEST(ddraw7)
+{
+    HMODULE module = GetModuleHandleA("ddraw.dll");
+
+    if (!(pDirectDrawCreateEx = (void *)GetProcAddress(module, "DirectDrawCreateEx")))
+    {
+        win_skip("DirectDrawCreateEx not available, skipping tests.\n");
+        return;
+    }
+
+    test_process_vertices();
+}
-- 
1.7.3.4




More information about the wine-patches mailing list