[2/3] d3dx9/tests: Add tests for ID3DXRenderToSurface interface.

Józef Kucia joseph.kucia at gmail.com
Thu Jun 7 09:52:00 CDT 2012


---
 dlls/d3dx9_36/tests/core.c |  192 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 181 insertions(+), 11 deletions(-)

diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 41b282d..75c4568 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -500,30 +500,200 @@ void test_D3DXCreateRenderToSurface(IDirect3DDevice9 *device)
     if (SUCCEEDED(hr)) ID3DXRenderToSurface_Release(render);
 }
 
-static void test_ID3DXRenderToSurface(IDirect3DDevice9 *device)
+/* runs a set of tests for the ID3DXRenderToSurface interface created with given parameters */
+static void check_ID3DXRenderToSurface(IDirect3DDevice9 *device, UINT width, UINT height, D3DFORMAT format,
+        BOOL depth_stencil, D3DFORMAT depth_stencil_format, BOOL render_target)
 {
     HRESULT hr;
-    ULONG ref_count;
-    IDirect3DDevice9 *out_device;
+    D3DFORMAT fmt;
+    HRESULT expected_value;
+    IDirect3DSurface9 *surface;
     ID3DXRenderToSurface *render;
+    D3DVIEWPORT9 viewport = { 0, 0, width, height, 0.0, 1.0 };
 
-    hr = D3DXCreateRenderToSurface(device, 256, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN, &render);
+    hr = D3DXCreateRenderToSurface(device, width, height, format, depth_stencil, depth_stencil_format, &render);
     if (FAILED(hr))
     {
         skip("Failed to create ID3DXRenderToSurface\n");
         return;
     }
 
-    /* GetDevice */
-    hr = ID3DXRenderToSurface_GetDevice(render, NULL /* device */);
-    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::GetDevice returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+    if (render_target)
+        hr = IDirect3DDevice9_CreateRenderTarget(device, width, height, format, D3DMULTISAMPLE_NONE, 0, FALSE, &surface, NULL);
+    else
+        hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, width, height, format, D3DPOOL_DEFAULT, &surface, NULL);
+    if (FAILED(hr))
+    {
+        skip("Failed to create surface\n");
+        ID3DXRenderToSurface_Release(render);
+        return;
+    }
 
-    ref_count = get_ref((IUnknown *)device);
-    hr = ID3DXRenderToSurface_GetDevice(render, &out_device);
-    ok(hr == D3D_OK, "ID3DXRenderToSurface::GetDevice returned %#x, expected %#x\n", hr, D3D_OK);
-    check_release((IUnknown *)out_device, ref_count);
+    /* viewport */
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == D3D_OK, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3D_OK);
+    check_ref((IUnknown *)surface, 2);
+    if (SUCCEEDED(hr)) ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+
+    /* invalid viewport */
+    viewport.Width = 2 * width;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+    viewport.X = width / 2;
+    viewport.Width = width;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+    viewport.X = width;
+    viewport.Width = width;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+    /* rendering to a part of a surface is only allowed for render target surfaces */
+    expected_value = render_target ? D3D_OK : D3DERR_INVALIDCALL;
+
+    viewport.X = 0;
+    viewport.Width = width / 2;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == expected_value, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, expected_value);
+    if (SUCCEEDED(hr)) ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+
+    viewport.X = width / 2;
+    viewport.Width = width - width / 2;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == expected_value, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, expected_value);
+    if (SUCCEEDED(hr)) ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+
+    check_release((IUnknown *)surface, 0);
+
+    /* surfaces with different sizes */
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, width / 2, width / 2, format, D3DPOOL_DEFAULT, &surface, NULL);
+    if (FAILED(hr))
+    {
+        skip("Failed to create surface\n");
+        ID3DXRenderToSurface_Release(render);
+        return;
+    }
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, NULL);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+    check_release((IUnknown *)surface, 0);
+
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 2 * width, 2 * height, format, D3DPOOL_DEFAULT, &surface, NULL);
+    if (FAILED(hr))
+    {
+        skip("Failed to create surface\n");
+        ID3DXRenderToSurface_Release(render);
+        return;
+    }
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, NULL);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+    viewport.X = 0;
+    viewport.Y = 0;
+    viewport.Width = width;
+    viewport.Height = height;
+    hr = ID3DXRenderToSurface_BeginScene(render, surface, &viewport);
+    ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+    check_release((IUnknown *)surface, 0);
+
+    /* surfaces with different formats */
+    for (fmt = D3DFMT_A8R8G8B8; fmt <= D3DFMT_X8R8G8B8; fmt++)
+    {
+        HRESULT expected_result = (fmt != format) ? D3DERR_INVALIDCALL : D3D_OK;
+
+        hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, width, height, fmt, D3DPOOL_DEFAULT, &surface, NULL);
+        if (FAILED(hr))
+        {
+            skip("Failed to create surface\n");
+            continue;
+        }
+
+        hr = ID3DXRenderToSurface_BeginScene(render, surface, NULL);
+        ok(hr == expected_result, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, expected_result);
+
+        if (SUCCEEDED(hr)) ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+        check_release((IUnknown *)surface, 0);
+    }
+
+    check_release((IUnknown *)render, 0);
+}
+
+static void test_ID3DXRenderToSurface(IDirect3DDevice9 *device)
+{
+    int i;
+    HRESULT hr;
+    ULONG ref_count;
+    IDirect3DDevice9 *out_device;
+    ID3DXRenderToSurface *render;
+    IDirect3DSurface9 *surface;
+    D3DVIEWPORT9 viewport = { 0, 0, 256, 256, 0.0, 1.0 };
+    D3DXRTS_DESC tests[] = {
+        { 256, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN },
+        { 256, 256, D3DFMT_A8R8G8B8, TRUE, D3DFMT_D24S8 },
+        { 256, 256, D3DFMT_A8R8G8B8, TRUE, D3DFMT_D24X8 },
+        { 512, 512, D3DFMT_X8R8G8B8, FALSE, D3DFMT_X8R8G8B8 },
+        { 1024, 1024, D3DFMT_X8R8G8B8, TRUE, D3DFMT_D24S8 }
+    };
+
+    hr = D3DXCreateRenderToSurface(device, 256, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN, &render);
+    ok(hr == D3D_OK, "D3DXCreateRenderToSurface returned %#x, expected %#x\n", hr, D3D_OK);
+    if (FAILED(hr)) return;
+
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 256, 256, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface, NULL);
+    if (SUCCEEDED(hr))
+    {
+        ID3DXRenderToSurface *render_surface;
+
+        /* GetDevice */
+        hr = ID3DXRenderToSurface_GetDevice(render, NULL /* device */);
+        ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::GetDevice returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+        ref_count = get_ref((IUnknown *)device);
+        hr = ID3DXRenderToSurface_GetDevice(render, &out_device);
+        ok(hr == D3D_OK, "ID3DXRenderToSurface::GetDevice returned %#x, expected %#x\n", hr, D3D_OK);
+        check_release((IUnknown *)out_device, ref_count);
+
+        /* BeginScene and EndScene */
+        hr = ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+        ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::EndScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+        hr = ID3DXRenderToSurface_BeginScene(render, NULL /* surface */, &viewport);
+        ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+        ref_count = get_ref((IUnknown *)surface);
+        hr = ID3DXRenderToSurface_BeginScene(render, surface, NULL);
+        ok(hr == D3D_OK, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3D_OK);
+        if (SUCCEEDED(hr))
+        {
+            check_ref((IUnknown *)surface, ref_count + 1);
+
+            hr = ID3DXRenderToSurface_BeginScene(render, surface, NULL);
+            ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+            hr = ID3DXRenderToSurface_EndScene(render, D3DX_FILTER_NONE);
+            ok(hr == D3D_OK, "ID3DXRenderToSurface::EndScene returned %#x, expected %#x\n", hr, D3D_OK);
+
+            check_ref((IUnknown *)surface, ref_count);
+        }
+
+        /* error handling is deferred to BeginScene */
+        hr = D3DXCreateRenderToSurface(device, 256, 256, D3DFMT_A8R8G8B8, TRUE, D3DFMT_UNKNOWN, &render_surface);
+        ok(hr == D3D_OK, "D3DXCreateRenderToSurface returned %#x, expected %#x\n", hr, D3D_OK);
+        hr = ID3DXRenderToSurface_BeginScene(render_surface, surface, NULL);
+        ok(hr == D3DERR_INVALIDCALL, "ID3DXRenderToSurface::BeginScene returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+        check_release((IUnknown *)render_surface, 0);
+
+        check_release((IUnknown *)surface, 0);
+    }
+    else skip("Failed to create surface\n");
 
     check_release((IUnknown *)render, 0);
+
+    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+    {
+        check_ID3DXRenderToSurface(device, tests[i].Width, tests[i].Height, tests[i].Format, tests[i].DepthStencil, tests[i].DepthStencilFormat, TRUE);
+        check_ID3DXRenderToSurface(device, tests[i].Width, tests[i].Height, tests[i].Format, tests[i].DepthStencil, tests[i].DepthStencilFormat, FALSE);
+    }
 }
 
 START_TEST(core)
-- 
1.7.8.6




More information about the wine-patches mailing list