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