[PATCH 2/5] ddraw/tests: Add Direct3D3 test section

Andrew D'Addesio andrew at fatbag.net
Sun Oct 4 12:46:03 CDT 2015


To avoid confusion, CreateDirect3D/ReleaseDirect3D is also renamed to
CreateDirect3D7/ReleaseDirect3D7.
---
 dlls/ddraw/tests/d3d.c | 167 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 154 insertions(+), 13 deletions(-)

diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index f317ae9..2505196 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -44,6 +44,25 @@ static IDirect3DExecuteBuffer *ExecuteBuffer = NULL;
 static IDirect3DViewport *Viewport = NULL;
 static IDirect3DLight *Light = NULL;
 
+struct d3d3_test_context
+{
+    IDirectDraw *ddraw;
+    IDirectDraw4 *ddraw4;
+    IDirect3D3 *d3d;
+    IDirectDrawSurface4 *surface;
+    IDirect3DDevice3 *device;
+    IDirect3DViewport3 *viewport;
+};
+
+struct d3d2_test_context
+{
+    IDirectDraw *ddraw;
+    IDirect3D2 *d3d;
+    IDirectDrawSurface *surface;
+    IDirect3DDevice2 *device;
+    IDirect3DViewport2 *viewport;
+};
+
 typedef struct {
     int total;
     int rgb;
@@ -91,7 +110,7 @@ static HRESULT WINAPI SurfaceCounter(IDirectDrawSurface7 *surface, DDSURFACEDESC
     return DDENUMRET_OK;
 }
 
-static BOOL CreateDirect3D(void)
+static BOOL CreateDirect3D7(void)
 {
     HRESULT rc;
     DDSURFACEDESC2 ddsd;
@@ -173,7 +192,7 @@ static BOOL CreateDirect3D(void)
     return TRUE;
 }
 
-static void ReleaseDirect3D(void)
+static void ReleaseDirect3D7(void)
 {
     if (lpD3DDevice != NULL)
     {
@@ -3741,15 +3760,6 @@ static void test_get_caps7(void)
     /* There's no dwSize in D3DDEVICEDESC7 */
 }
 
-struct d3d2_test_context
-{
-    IDirectDraw *ddraw;
-    IDirect3D2 *d3d;
-    IDirectDrawSurface *surface;
-    IDirect3DDevice2 *device;
-    IDirect3DViewport2 *viewport;
-};
-
 static void d3d2_release_objects(struct d3d2_test_context *context)
 {
     LONG ref;
@@ -3933,18 +3943,137 @@ static void test_get_caps2(const struct d3d2_test_context *context)
     ok(hr == D3D_OK, "GetCaps with different sizes returned hr %#x, expected D3D_OK.\n", hr);
 }
 
+static void d3d3_release_objects(struct d3d3_test_context *context)
+{
+    LONG ref;
+    HRESULT hr;
+
+    if (context->viewport)
+    {
+        hr = IDirect3DDevice3_DeleteViewport(context->device, context->viewport);
+        ok(hr == D3D_OK, "DeleteViewport returned %08x.\n", hr);
+        ref = IDirect3DViewport3_Release(context->viewport);
+        ok(ref == 0, "Viewport has reference count %d, expected 0.\n", ref);
+    }
+    if (context->device)
+    {
+        ref = IDirect3DDevice3_Release(context->device);
+        ok(ref == 0, "Device has reference count %d, expected 0.\n", ref);
+    }
+    if (context->surface)
+    {
+        ref = IDirectDrawSurface4_Release(context->surface);
+        ok(ref == 0, "Surface has reference count %d, expected 0.\n", ref);
+    }
+    if (context->d3d)
+    {
+        ref = IDirect3D3_Release(context->d3d);
+        ok(ref == 1, "IDirect3D3 has reference count %d, expected 1.\n", ref);
+    }
+    if (context->ddraw4)
+    {
+        ref = IDirectDraw4_Release(context->ddraw4);
+        ok(ref == 0, "DDraw4 has reference count %d, expected 0.\n", ref);
+    }
+    if (context->ddraw)
+    {
+        ref = IDirectDraw_Release(context->ddraw);
+        ok(ref == 0, "DDraw has reference count %d, expected 0.\n", ref);
+    }
+}
+
+static BOOL d3d3_create_objects(struct d3d3_test_context *context)
+{
+    HRESULT hr;
+    DDSURFACEDESC2 ddsd2;
+    D3DVIEWPORT vp_data;
+
+    memset(context, 0, sizeof(*context));
+
+    hr = DirectDrawCreate(NULL, &context->ddraw, NULL);
+    ok(hr == DD_OK || hr == DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate failed: %08x.\n", hr);
+    if (!context->ddraw) goto error;
+
+    hr = IDirectDraw_SetCooperativeLevel(context->ddraw, NULL, DDSCL_NORMAL);
+    ok(hr == DD_OK, "SetCooperativeLevel failed: %08x.\n", hr);
+    if (FAILED(hr)) goto error;
+
+    hr = IDirectDraw_QueryInterface(context->ddraw, &IID_IDirectDraw4, (void**) &context->ddraw4);
+    ok(hr == DD_OK || hr == E_NOINTERFACE, "QueryInterface failed: %08x.\n", hr);
+    if (!context->ddraw4) goto error;
+
+    hr = IDirectDraw_QueryInterface(context->ddraw, &IID_IDirect3D3, (void**) &context->d3d);
+    ok(hr == DD_OK || hr == E_NOINTERFACE, "QueryInterface failed: %08x.\n", hr);
+    if (!context->d3d) goto error;
+
+    memset(&ddsd2, 0, sizeof(ddsd2));
+    ddsd2.dwSize = sizeof(ddsd2);
+    ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+    ddsd2.dwWidth = 256;
+    ddsd2.dwHeight = 256;
+    IDirectDraw4_CreateSurface(context->ddraw4, &ddsd2, &context->surface, NULL);
+    if (!context->surface)
+    {
+        skip("DDSCAPS_3DDEVICE surface not available.\n");
+        goto error;
+    }
+
+    hr = IDirect3D3_CreateDevice(context->d3d, &IID_IDirect3DHALDevice,
+                                 context->surface, &context->device, NULL);
+    ok(hr == D3D_OK  || hr == E_OUTOFMEMORY || hr == E_NOINTERFACE, "CreateDevice failed: %08x.\n", hr);
+    if (!context->device) goto error;
+
+    hr = IDirect3D3_CreateViewport(context->d3d, &context->viewport, NULL);
+    ok(hr == D3D_OK, "CreateViewport failed: %08x.\n", hr);
+    if (!context->viewport) goto error;
+
+    hr = IDirect3DDevice3_AddViewport(context->device, context->viewport);
+    ok(hr == D3D_OK, "AddViewport returned %08x.\n", hr);
+    vp_data.dwSize = sizeof(vp_data);
+    vp_data.dwX = 0;
+    vp_data.dwY = 0;
+    vp_data.dwWidth = 256;
+    vp_data.dwHeight = 256;
+    vp_data.dvScaleX = 1;
+    vp_data.dvScaleY = 1;
+    vp_data.dvMaxX = 256;
+    vp_data.dvMaxY = 256;
+    vp_data.dvMinZ = 0;
+    vp_data.dvMaxZ = 1;
+    hr = IDirect3DViewport3_SetViewport(context->viewport, &vp_data);
+    ok(hr == D3D_OK, "SetViewport returned %08x.\n", hr);
+
+    return TRUE;
+
+error:
+    d3d3_release_objects(context);
+    return FALSE;
+}
+
+static void d3d3_nop_test(const struct d3d3_test_context *context)
+{
+}
+
 START_TEST(d3d)
 {
+    struct d3d3_test_context d3d3_context;
+    void (* const d3d3_tests[])(const struct d3d3_test_context *) =
+    {
+        d3d3_nop_test /* please remove once the first real d3d3 test is added */
+    };
+
     struct d3d2_test_context d3d2_context;
     void (* const d3d2_tests[])(const struct d3d2_test_context *) =
     {
         test_get_caps2
     };
+
     unsigned int i;
 
     init_function_pointers();
 
-    if(!CreateDirect3D()) {
+    if(!CreateDirect3D7()) {
         skip("Skipping d3d7 tests\n");
     } else {
         LightTest();
@@ -3963,7 +4092,19 @@ START_TEST(d3d)
         VertexBufferLockRest();
         z_format_test();
         test_get_caps7();
-        ReleaseDirect3D();
+        ReleaseDirect3D7();
+    }
+
+    for (i = 0; i < (sizeof(d3d3_tests) / sizeof(*d3d3_tests)); i++)
+    {
+        if (!d3d3_create_objects(&d3d3_context))
+        {
+            ok(!i, "Unexpected d3d3 initialization failure.\n");
+            skip("Skipping d3d3 tests.\n");
+            break;
+        }
+        d3d3_tests[i](&d3d3_context);
+        d3d3_release_objects(&d3d3_context);
     }
 
     for (i = 0; i < (sizeof(d3d2_tests) / sizeof(*d3d2_tests)); i++)
-- 
2.4.3




More information about the wine-patches mailing list