Stefan Dösinger : ddraw: Set dwZBufferBitDepth in old z buffers.

Alexandre Julliard julliard at winehq.org
Wed Aug 31 13:19:26 CDT 2011


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Aug 30 12:46:41 2011 +0200

ddraw: Set dwZBufferBitDepth in old z buffers.

---

 dlls/ddraw/tests/dsurface.c |   12 ++++++------
 dlls/ddraw/utils.c          |   15 +++++++++++++--
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index e06956e..75646d6 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -3950,7 +3950,7 @@ static void zbufferbitdepth_test(void)
         IDirectDrawSurface_Release(surface);
 
         ok(ddsd.dwFlags & DDSD_ZBUFFERBITDEPTH, "DDSD_ZBUFFERBITDEPTH is not set\n");
-        todo_wine ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
+        ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
         /* Yet the ddpfPixelFormat member contains valid data */
         if (memcmp(&ddsd.ddpfPixelFormat, &test_data[i].pf, ddsd.ddpfPixelFormat.dwSize))
         {
@@ -3982,8 +3982,8 @@ static void zbufferbitdepth_test(void)
     ok(ddsd.ddpfPixelFormat.dwZBufferBitDepth == 16, "Expected a 16bpp depth buffer, got %ubpp\n",
         ddsd.ddpfPixelFormat.dwZBufferBitDepth);
     ok(ddsd.dwFlags & DDSD_ZBUFFERBITDEPTH, "DDSD_ZBUFFERBITDEPTH is not set\n");
-    todo_wine ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
-    todo_wine ok(ddsd.dwZBufferBitDepth == 16, "Expected dwZBufferBitDepth=16, got %u\n",
+    ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
+    ok(ddsd.dwZBufferBitDepth == 16, "Expected dwZBufferBitDepth=16, got %u\n",
         ddsd.dwZBufferBitDepth);
 
     /* DDSD_PIXELFORMAT vs invalid ZBUFFERBITDEPTH */
@@ -4021,9 +4021,9 @@ static void zbufferbitdepth_test(void)
     IDirectDrawSurface_Release(surface);
     ok(ddsd.ddpfPixelFormat.dwZBufferBitDepth == 16, "Expected a 16bpp depth buffer, got %ubpp\n",
         ddsd.ddpfPixelFormat.dwZBufferBitDepth);
-    todo_wine ok(ddsd.dwFlags & DDSD_ZBUFFERBITDEPTH, "DDSD_ZBUFFERBITDEPTH is not set\n");
-    todo_wine ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
-    todo_wine ok(ddsd.dwZBufferBitDepth == 16, "Expected dwZBufferBitDepth=16, got %u\n",
+    ok(ddsd.dwFlags & DDSD_ZBUFFERBITDEPTH, "DDSD_ZBUFFERBITDEPTH is not set\n");
+    ok(!(ddsd.dwFlags & DDSD_PIXELFORMAT), "DDSD_PIXELFORMAT is set\n");
+    ok(ddsd.dwZBufferBitDepth == 16, "Expected dwZBufferBitDepth=16, got %u\n",
         ddsd.dwZBufferBitDepth);
 }
 
diff --git a/dlls/ddraw/utils.c b/dlls/ddraw/utils.c
index fce00eb..63c6a5e 100644
--- a/dlls/ddraw/utils.c
+++ b/dlls/ddraw/utils.c
@@ -1192,7 +1192,7 @@ void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out)
      * though. Don't forget to set ddsCaps.dwCaps2/3/4 to 0 when removing this */
     memset(out, 0x00, sizeof(*out));
     out->dwSize = sizeof(*out);
-    out->dwFlags = in->dwFlags;
+    out->dwFlags = in->dwFlags & ~DDSD_ZBUFFERBITDEPTH;
     if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
     if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
     if (in->dwFlags & DDSD_PIXELFORMAT) out->u4.ddpfPixelFormat = in->ddpfPixelFormat;
@@ -1236,7 +1236,18 @@ void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out)
     out->dwFlags = in->dwFlags;
     if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
     if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
-    if (in->dwFlags & DDSD_PIXELFORMAT) out->ddpfPixelFormat = in->u4.ddpfPixelFormat;
+    if (in->dwFlags & DDSD_PIXELFORMAT)
+    {
+        out->ddpfPixelFormat = in->u4.ddpfPixelFormat;
+        if ((in->dwFlags & DDSD_CAPS) && (in->ddsCaps.dwCaps & DDSCAPS_ZBUFFER))
+        {
+            /* Z buffers have DDSD_ZBUFFERBITDEPTH set, but not DDSD_PIXELFORMAT. They do
+             * have valid data in ddpfPixelFormat though */
+            out->dwFlags &= ~DDSD_PIXELFORMAT;
+            out->dwFlags |= DDSD_ZBUFFERBITDEPTH;
+            out->u2.dwZBufferBitDepth = in->u4.ddpfPixelFormat.u1.dwZBufferBitDepth;
+        }
+    }
     /* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
     out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
     if (in->dwFlags & DDSD_PITCH) out->u1.lPitch = in->u1.lPitch;




More information about the wine-cvs mailing list