Alexander Dorofeyev : ddraw/tests: Extend p8_primary_test.

Alexandre Julliard julliard at winehq.org
Fri Apr 4 06:21:50 CDT 2008


Module: wine
Branch: master
Commit: 18b9c2bb8371365be5a86ae534c3e86cb2dc5916
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=18b9c2bb8371365be5a86ae534c3e86cb2dc5916

Author: Alexander Dorofeyev <alexd4 at inbox.lv>
Date:   Fri Apr  4 01:19:22 2008 +0300

ddraw/tests: Extend p8_primary_test.

Additional tests for blitting and locking.

---

 dlls/ddraw/tests/visual.c |  107 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 105 insertions(+), 2 deletions(-)

diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index ee5bc7f..def235f 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -1733,7 +1733,7 @@ static void p8_surface_fill_rect(IDirectDrawSurface *dest, UINT x, UINT y, UINT
     hr = IDirectDrawSurface_Lock(dest, NULL, &ddsd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL);
     ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
 
-    p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y;
+    p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
 
     for (i = 0; i < h; i++) {
         for (i1 = 0; i1 < w; i1++) {
@@ -1785,12 +1785,14 @@ static void p8_primary_test()
     HRESULT hr;
     PALETTEENTRY entries[256];
     RGBQUAD coltable[256];
-    UINT i;
+    UINT i, i1, i2;
     IDirectDrawPalette *ddprimpal = NULL;
     IDirectDrawSurface *offscreen = NULL;
     WNDCLASS wc = {0};
     DDBLTFX ddbltfx;
     COLORREF color;
+    RECT rect;
+    unsigned differences;
 
     /* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */
     hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
@@ -1917,6 +1919,107 @@ static void p8_primary_test()
             "got R %02X G %02X B %02X, expected R 00 G FF B 00\n",
             GetRValue(color), GetGValue(color), GetBValue(color));
 
+    /* Test blitting and locking patterns that are likely to trigger bugs in opengl renderer (p8
+       surface conversion and uploading/downloading to/from opengl texture). Similar patterns (
+       blitting front buffer areas to/from an offscreen surface mixed with locking) are used by C&C
+       Red Alert I. */
+    IDirectDrawSurface_Release(offscreen);
+
+    memset (&ddsd, 0, sizeof (ddsd));
+    ddsd.dwSize = sizeof (ddsd);
+    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
+    ddsd.dwWidth = 640;
+    ddsd.dwHeight = 480;
+    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+    ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
+    ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
+    U1(ddsd.ddpfPixelFormat).dwRGBBitCount      = 8;
+    hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &offscreen, NULL);
+    ok(hr == DD_OK, "IDirectDraw_CreateSurface returned %08x\n", hr);
+
+    if (FAILED(hr)) goto out;
+
+    /* Test two times, first time front buffer has a palette and second time front buffer
+       has no palette; the latter is somewhat contrived example, but an app could set
+       front buffer palette later. */
+    for (i2 = 0; i2 < 2; i2++) {
+        if (i2 == 1) {
+            hr = IDirectDrawSurface_SetPalette(Surface1, NULL);
+            ok(hr==DD_OK, "IDirectDrawSurface_SetPalette returned: %x\n", hr);
+        }
+
+        memset(&ddsd, 0, sizeof(ddsd));
+        ddsd.dwSize = sizeof(ddsd);
+        hr = IDirectDrawSurface_Lock(Surface1, NULL, &ddsd, DDLOCK_WAIT, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
+
+        for (i = 0; i < 256; i++) {
+            unsigned x = (i % 128) * 4;
+            unsigned y = (i / 128) * 4;
+            BYTE *p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
+
+            for (i1 = 0; i1 < 4; i1++) {
+                p[0] = p[1] = p[2] = p[3] = i;
+                p += ddsd.lPitch;
+            }
+        }
+
+        hr = IDirectDrawSurface_Unlock(Surface1, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
+
+        hr = IDirectDrawSurface_BltFast(offscreen, 0, 0, Surface1, NULL, 0);
+        ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
+
+        /* This ensures offscreen surface contens will be downloaded to system memory. */
+        memset(&ddsd, 0, sizeof(ddsd));
+        ddsd.dwSize = sizeof(ddsd);
+        hr = IDirectDrawSurface_Lock(offscreen, NULL, &ddsd, DDLOCK_WAIT, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
+        hr = IDirectDrawSurface_Unlock(offscreen, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
+
+        /* Offscreen surface data will have to be converted and uploaded to texture. */
+        rect.left = 0;
+        rect.top = 0;
+        rect.right = 16;
+        rect.bottom = 16;
+        hr = IDirectDrawSurface_BltFast(offscreen, 600, 400, Surface1, &rect, 0);
+        ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
+
+        /* This ensures offscreen surface contens will be downloaded to system memory. */
+        memset(&ddsd, 0, sizeof(ddsd));
+        ddsd.dwSize = sizeof(ddsd);
+        hr = IDirectDrawSurface_Lock(offscreen, NULL, &ddsd, DDLOCK_WAIT, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
+        hr = IDirectDrawSurface_Unlock(offscreen, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
+
+        hr = IDirectDrawSurface_BltFast(Surface1, 0, 0, offscreen, NULL, 0);
+        ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
+
+        memset(&ddsd, 0, sizeof(ddsd));
+        ddsd.dwSize = sizeof(ddsd);
+        hr = IDirectDrawSurface_Lock(Surface1, NULL, &ddsd, DDLOCK_WAIT, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
+
+        differences = 0;
+
+        for (i = 0; i < 256; i++) {
+            unsigned x = (i % 128) * 4 + 1;
+            unsigned y = (i / 128) * 4 + 1;
+            BYTE *p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
+
+            if (*p != i) differences++;
+        }
+
+        hr = IDirectDrawSurface_Unlock(Surface1, NULL);
+        ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
+
+        ok(differences == 0, i2 == 0 ? "Pass 1. Unexpected front buffer contens after blit (%u differences)\n" :
+                "Pass 2 (with NULL front buffer palette). Unexpected front buffer contens after blit (%u differences)\n",
+                differences);
+    }
+
     out:
 
     if(ddprimpal) IDirectDrawPalette_Release(ddprimpal);




More information about the wine-cvs mailing list