d3d9/tests: Add test for surface format conversion

Bjørnar Hansen tilbjornar at gmail.com
Mon Jul 5 13:47:22 CDT 2010


This adds a test of the surface format conversion implemented in
wined3d/surface_base.c.
-------------- next part --------------
From b8987d96c288e79278426b88a9a8a088dbfd2abe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B8rnar=20Hansen?= <tilbjornar at gmail.com>
Date: Sun, 4 Jul 2010 20:51:39 +0200
Subject: d3d9/tests: Add test for surface format conversion.

I've added tests for surface format conversions. The first test fails in Windows XP but
succeeds in Wine, so I've marked it with todo_wine.
---
 dlls/d3d9/tests/visual.c |  120 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 113 insertions(+), 7 deletions(-)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 1da7cca..e1c7891 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -89,10 +89,17 @@ static DWORD getPixelColorFromSurface(IDirect3DSurface9 *surface, UINT x, UINT y
             color = ((DWORD *) lockedRect.pBits)[0] & 0xffffffff;
             break;
         }
+        case D3DFMT_X8R8G8B8:
+        {
+            color = ((DWORD *) lockedRect.pBits)[0] | 0xff000000;
+            break;
+        }
         default:
+        {
             trace("Error: unknown surface format: %d\n", desc.Format);
             color = 0xdeadbeef;
             break;
+        }
     }
     hr = IDirect3DSurface9_UnlockRect(surface);
     if(FAILED(hr))
@@ -2279,7 +2286,8 @@ static void fill_surface(IDirect3DSurface9 *surface, DWORD color)
     D3DLOCKED_RECT l;
     HRESULT hr;
     unsigned int x, y;
-    DWORD *mem;
+    WORD  *mem16;
+    DWORD *mem32;
 
     memset(&desc, 0, sizeof(desc));
     memset(&l, 0, sizeof(l));
@@ -2289,14 +2297,40 @@ static void fill_surface(IDirect3DSurface9 *surface, DWORD color)
     ok(hr == D3D_OK, "IDirect3DSurface9_LockRect failed with %08x\n", hr);
     if(FAILED(hr)) return;
 
-    for(y = 0; y < desc.Height; y++)
-    {
-        mem = (DWORD *) ((BYTE *) l.pBits + y * l.Pitch);
-        for(x = 0; x < l.Pitch / sizeof(DWORD); x++)
+    switch(desc.Format){
+        case D3DFMT_R5G6B5: /* 16-bit formats */
+        {
+            for(y = 0; y < desc.Height; y++)
+            {
+                mem16 = (WORD *) ((BYTE *) l.pBits + y * l.Pitch);
+                for(x = 0; x < l.Pitch / sizeof(WORD); x++)
+                {
+                    mem16[x] = color;
+                }
+            }
+            break;
+        }
+        case D3DFMT_YUY2:
+        case D3DFMT_A8R8G8B8:
+        case D3DFMT_X8R8G8B8: /* 32-bit formats */
+        {
+            for(y = 0; y < desc.Height; y++)
+            {
+                mem32 = (DWORD *) ((BYTE *) l.pBits + y * l.Pitch);
+                for(x = 0; x < l.Pitch / sizeof(DWORD); x++)
+                {
+                    mem32[x] = color;
+                }
+            }
+            break;
+        }
+        default:
         {
-            mem[x] = color;
+            trace("Error: unknown surface format %d\n", desc.Format);
+            break;
         }
     }
+
     hr = IDirect3DSurface9_UnlockRect(surface);
     ok(hr == D3D_OK, "IDirect3DSurface9_UnlockRect failed with %08x\n", hr);
 }
@@ -2321,6 +2355,21 @@ static void stretchrect_test(IDirect3DDevice9 *device)
     RECT dst_rect64 = {0, 0, 64, 64};
     RECT dst_rect64_flipy = {0, 64, 64, 0};
 
+    unsigned int i;
+    struct {
+        const char *from_name;
+        const char *to_name;
+        D3DFORMAT from;
+        D3DFORMAT to;
+        unsigned long long color_in;
+        DWORD color_out;
+    } convert[] = {
+        { "D3DFMT_R5G6B5",        "D3DFMT_X8R8G8B8", D3DFMT_R5G6B5,        D3DFMT_X8R8G8B8,             0xa408, 0xffa58242 },
+        { "D3DFMT_A8R8G8B",       "D3DFMT_X8R8G8B8", D3DFMT_A8R8G8B8,      D3DFMT_X8R8G8B8,         0xaa996633, 0xff996633 },
+        { "D3DFMT_YUY2",          "D3DFMT_X8R8G8B8", D3DFMT_YUY2,          D3DFMT_X8R8G8B8,         0xd0b4987a, 0xfffb31ac },
+    };
+
+
     hr = IDirect3DDevice9_GetRenderTarget(device, 0, &orig_rt);
     ok(hr == D3D_OK, "Can't get render target, hr = %08x\n", hr);
     if(!orig_rt) {
@@ -2910,8 +2959,65 @@ static void stretchrect_test(IDirect3DDevice9 *device)
         todo_wine ok( hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
     }
 
-    /* TODO: Test format conversions */
+    /***************************************
+     * Tests for surface format conversion *
+     ***************************************/
+
+    /* First release the surfaces we will use */
+    if(surf_offscreen64)
+        IDirect3DSurface9_Release(surf_offscreen64);
+    if(surf_offscreen_dest64)
+        IDirect3DSurface9_Release(surf_offscreen_dest64);
+
+    /* Convert D3DFMT_R32F => D3DFMT_R16F, this is not allowed */
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 64, 64, D3DFMT_R32F, D3DPOOL_DEFAULT, &surf_offscreen64, NULL);
+    ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface with format %s failed with %08x\n",
+        "D3DFMT_R32F", hr);
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 64, 64, D3DFMT_R16F, D3DPOOL_DEFAULT, &surf_offscreen_dest64, NULL);
+    ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface with format %s failed with %08x\n",
+        "D3DFMT_R16F", hr);
 
+    if(surf_offscreen64 && surf_offscreen_dest64)
+    {
+        hr = IDirect3DDevice9_StretchRect(device, surf_offscreen64, NULL, surf_offscreen_dest64, NULL, 0);
+        todo_wine ok( hr == D3DERR_INVALIDCALL, "Conversion from %s to %s succeeded, shouldn't happen (todo)"
+            "(code: %08x)\n", "D3DFMT_R32F", "D3DFMT_R16F", hr);
+    }
+
+    /* Now the rest */
+    for(i = 0; i < (sizeof(convert) / sizeof(convert[0])); i++)
+    {
+        if(surf_offscreen64)
+            IDirect3DSurface9_Release(surf_offscreen64);
+        if(surf_offscreen_dest64)
+            IDirect3DSurface9_Release(surf_offscreen_dest64);
+
+        hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 64, 64, convert[i].from,
+            D3DPOOL_DEFAULT, &surf_offscreen64, NULL);
+        ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface with format %s failed with %08x\n",
+            convert[i].from_name, hr);
+        hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 64, 64, convert[i].to, 
+            D3DPOOL_DEFAULT, &surf_offscreen_dest64, NULL);
+        ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface with format %s failed with %08x\n",
+            convert[i].to_name, hr);
+
+        if(surf_offscreen64)
+            fill_surface(surf_offscreen64, convert[i].color_in); 
+
+        if(surf_offscreen64 && surf_offscreen_dest64)
+        {
+            hr = IDirect3DDevice9_StretchRect(device, surf_offscreen64, NULL, surf_offscreen_dest64, NULL, 0);
+            ok(hr == D3D_OK, "IDirect3DDevice9_StretchRect from surface with format %s to surface "
+                "with format %s failed with %08x\n", convert[i].from_name, convert[i].to_name, hr);
+
+            if (hr == D3D_OK) 
+            {
+                color = getPixelColorFromSurface(surf_offscreen_dest64, 32, 32);
+                ok(color_match(color, convert[i].color_out, 1), "Conversion from %s to %s: Got color 0x%08x, expected 0x%08x.\n",
+                    convert[i].from_name, convert[i].to_name, color, convert[i].color_out);
+            }
+        }
+    }
 
 out:
     /* Clean up */
-- 
1.7.1.1


More information about the wine-patches mailing list