[PATCH 2/4] ddraw: SetSurfaceDesc does not work on primaries.

Stefan Dösinger stefan at codeweavers.com
Wed Dec 11 15:30:44 CST 2013


Combined with the next patch this should rule out flippable user memory
surfaces.
---
 dlls/ddraw/surface.c      |  5 +++--
 dlls/ddraw/tests/ddraw2.c | 23 ++++++++++++++---------
 dlls/ddraw/tests/ddraw4.c | 23 ++++++++++++++---------
 dlls/ddraw/tests/ddraw7.c | 23 ++++++++++++++---------
 4 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 78746ac..30d2c7d 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -4293,8 +4293,9 @@ static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface,
         WARN("Flags is %x, returning DDERR_INVALIDPARAMS\n", Flags);
         return DDERR_INVALIDPARAMS;
     }
-    if (!(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) ||
-            This->surface_desc.ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
+    if (!(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY)
+            || This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE
+            || This->surface_desc.ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
     {
         WARN("Surface is not in system memory, returning DDERR_INVALIDSURFACETYPE.\n");
         return DDERR_INVALIDSURFACETYPE;
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index ccf228e..b6b50c1 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -4580,6 +4580,7 @@ static void test_set_surface_desc(void)
     {
         {DDSCAPS_VIDEOMEMORY, FALSE, "videomemory plain"},
         {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, TRUE, "systemmemory texture"},
+        {DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY, FALSE, "systemmemory primary"},
     };
 
     if (!(ddraw = create_ddraw()))
@@ -4810,16 +4811,20 @@ static void test_set_surface_desc(void)
     for (i = 0; i < sizeof(invalid_caps_tests) / sizeof(*invalid_caps_tests); i++)
     {
         reset_ddsd(&ddsd);
-        ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
-        ddsd.dwWidth = 8;
-        ddsd.dwHeight = 8;
-        ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
-        ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
-        U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
-        U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000;
-        U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00;
-        U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        ddsd.dwFlags = DDSD_CAPS;
         ddsd.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
+        if (!(invalid_caps_tests[i].caps & DDSCAPS_PRIMARYSURFACE))
+        {
+            ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+            ddsd.dwWidth = 8;
+            ddsd.dwHeight = 8;
+            ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
+            ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
+            U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
+            U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000;
+            U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00;
+            U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        }
 
         hr = IDirectDraw_CreateSurface(ddraw, &ddsd, &surface, NULL);
         ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 1689562..fb9f8fe 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -5185,6 +5185,7 @@ static void test_set_surface_desc(void)
         {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, TRUE, "systemmemory texture"},
         {DDSCAPS_TEXTURE, DDSCAPS2_D3DTEXTUREMANAGE, FALSE, "managed texture"},
         {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, FALSE, "managed texture"},
+        {DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY, 0, FALSE, "systemmemory primary"},
     };
 
     if (!(ddraw = create_ddraw()))
@@ -5414,17 +5415,21 @@ static void test_set_surface_desc(void)
     for (i = 0; i < sizeof(invalid_caps_tests) / sizeof(*invalid_caps_tests); i++)
     {
         reset_ddsd(&ddsd);
-        ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
-        ddsd.dwWidth = 8;
-        ddsd.dwHeight = 8;
-        U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
-        U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
-        U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
-        U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00ff0000;
-        U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000ff00;
-        U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        ddsd.dwFlags = DDSD_CAPS;
         ddsd.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
         ddsd.ddsCaps.dwCaps2 = invalid_caps_tests[i].caps2;
+        if (!(invalid_caps_tests[i].caps & DDSCAPS_PRIMARYSURFACE))
+        {
+            ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+            ddsd.dwWidth = 8;
+            ddsd.dwHeight = 8;
+            U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+            U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+            U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+            U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00ff0000;
+            U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000ff00;
+            U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        }
 
         hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL);
         ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 41f1b9b..4f0d9af 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -5072,6 +5072,7 @@ static void test_set_surface_desc(void)
         {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, TRUE, "systemmemory texture"},
         {DDSCAPS_TEXTURE, DDSCAPS2_D3DTEXTUREMANAGE, FALSE, "managed texture"},
         {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, FALSE, "managed texture"},
+        {DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY, 0, FALSE, "systemmemory primary"},
     };
 
     if (!(ddraw = create_ddraw()))
@@ -5302,17 +5303,21 @@ static void test_set_surface_desc(void)
     for (i = 0; i < sizeof(invalid_caps_tests) / sizeof(*invalid_caps_tests); i++)
     {
         reset_ddsd(&ddsd);
-        ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
-        ddsd.dwWidth = 8;
-        ddsd.dwHeight = 8;
-        U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
-        U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
-        U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
-        U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00ff0000;
-        U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000ff00;
-        U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        ddsd.dwFlags = DDSD_CAPS;
         ddsd.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
         ddsd.ddsCaps.dwCaps2 = invalid_caps_tests[i].caps2;
+        if (!(invalid_caps_tests[i].caps & DDSCAPS_PRIMARYSURFACE))
+        {
+            ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+            ddsd.dwWidth = 8;
+            ddsd.dwHeight = 8;
+            U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+            U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+            U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+            U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00ff0000;
+            U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000ff00;
+            U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000ff;
+        }
 
         hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL);
         ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
-- 
1.8.3.2




More information about the wine-patches mailing list