[PATCH 2/5] ddraw: SetSurfaceDesc is not allowed on managed textures.

Stefan Dösinger stefan at codeweavers.com
Tue Dec 3 06:44:34 CST 2013


---
 dlls/ddraw/surface.c      |  3 +-
 dlls/ddraw/tests/ddraw2.c | 91 ++++++++++++++++++++++++++++++-----------------
 dlls/ddraw/tests/ddraw4.c | 86 +++++++++++++++++++++++++++++---------------
 dlls/ddraw/tests/ddraw7.c | 88 +++++++++++++++++++++++++++++----------------
 4 files changed, 175 insertions(+), 93 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 8403a32..efa7f66 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -4245,7 +4245,8 @@ 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))
+    if (!(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) ||
+            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 d37cedd..154e1b2 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -4414,6 +4414,18 @@ static void test_set_surface_desc(void)
     IDirectDrawSurface3 *surface3;
     BYTE data[16*16*4];
     ULONG ref;
+    unsigned int i;
+    static const struct
+    {
+        DWORD caps;
+        BOOL supported;
+        const char *name;
+    }
+    invalid_caps_tests[] =
+    {
+        {DDSCAPS_VIDEOMEMORY, FALSE, "videomemory plain"},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, TRUE, "systemmemory texture"},
+    };
 
     if (!(ddraw = create_ddraw()))
     {
@@ -4611,44 +4623,57 @@ static void test_set_surface_desc(void)
 
     IDirectDrawSurface3_Release(surface3);
 
-    /* Need systemmemory surfaces.
+    /* SetSurfaceDesc needs systemmemory surfaces.
      *
      * As a sidenote, fourcc surfaces aren't allowed in sysmem, thus testing DDSD_LINEARSIZE is moot. */
-    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.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
-
-    hr = IDirectDraw_CreateSurface(ddraw, &ddsd, &surface, NULL);
-    ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
-    if (FAILED(hr))
+    for (i = 0; i < sizeof(invalid_caps_tests) / sizeof(*invalid_caps_tests); i++)
     {
-        skip("Cannot create a video memory surface, skipping vidmem SetSurfaceDesc test.\n");
-        goto done;
-    }
-    hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **)&surface3);
-    ok(SUCCEEDED(hr), "Failed to get IDirectDrawSurface3 interface, hr %#x.\n", hr);
-    IDirectDrawSurface_Release(surface);
-
-    reset_ddsd(&ddsd);
-    ddsd.dwFlags = DDSD_LPSURFACE;
-    ddsd.lpSurface = data;
-    hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        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.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
+
+        hr = IDirectDraw_CreateSurface(ddraw, &ddsd, &surface, NULL);
+        ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
+        if (FAILED(hr))
+        {
+            skip("Cannot create a %s surface, skipping vidmem SetSurfaceDesc test.\n",
+                    invalid_caps_tests[i].name);
+            goto done;
+        }
+        hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **)&surface3);
+        ok(SUCCEEDED(hr), "Failed to get IDirectDrawSurface3 interface, hr %#x.\n", hr);
+        IDirectDrawSurface_Release(surface);
 
-    /* Check priority of error conditions. */
-    ddsd.dwFlags = DDSD_WIDTH;
-    hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        reset_ddsd(&ddsd);
+        ddsd.dwFlags = DDSD_LPSURFACE;
+        ddsd.lpSurface = data;
+        hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0);
+        if (invalid_caps_tests[i].supported)
+        {
+            ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr);
+        }
+        else
+        {
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+
+            /* Check priority of error conditions. */
+            ddsd.dwFlags = DDSD_WIDTH;
+            hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0);
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+        }
 
-    IDirectDrawSurface3_Release(surface3);
+        IDirectDrawSurface3_Release(surface3);
+    }
 
 done:
     ref = IDirectDraw2_Release(ddraw);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index e8128a5..6012f73 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -5017,6 +5017,20 @@ static void test_set_surface_desc(void)
     IDirectDrawSurface4 *surface;
     BYTE data[16*16*4];
     ULONG ref;
+    unsigned int i;
+    static const struct
+    {
+        DWORD caps, caps2;
+        BOOL supported;
+        const char *name;
+    }
+    invalid_caps_tests[] =
+    {
+        {DDSCAPS_VIDEOMEMORY, 0, FALSE, "videomemory plain"},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, TRUE, "systemmemory texture"},
+        {DDSCAPS_TEXTURE, DDSCAPS2_D3DTEXTUREMANAGE, FALSE, "managed texture"},
+        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, FALSE, "managed texture"},
+    };
 
     if (!(ddraw = create_ddraw()))
     {
@@ -5210,41 +5224,55 @@ static void test_set_surface_desc(void)
 
     IDirectDrawSurface4_Release(surface);
 
-    /* Need systemmemory surfaces.
+    /* SetSurfaceDesc needs systemmemory surfaces.
      *
      * As a sidenote, fourcc surfaces aren't allowed in sysmem, thus testing DDSD_LINEARSIZE is moot. */
-    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.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
-
-    hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL);
-    ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
-    if (FAILED(hr))
+    for (i = 0; i < sizeof(invalid_caps_tests) / sizeof(*invalid_caps_tests); i++)
     {
-        skip("Cannot create a video memory surface, skipping vidmem SetSurfaceDesc test.\n");
-        goto done;
-    }
+        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.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
+        ddsd.ddsCaps.dwCaps2 = invalid_caps_tests[i].caps2;
 
-    reset_ddsd(&ddsd);
-    ddsd.dwFlags = DDSD_LPSURFACE;
-    ddsd.lpSurface = data;
-    hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL);
+        ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
+        if (FAILED(hr))
+        {
+            skip("Cannot create a %s surface, skipping vidmem SetSurfaceDesc test.\n",
+                    invalid_caps_tests[i].name);
+            goto done;
+        }
 
-    /* Check priority of error conditions. */
-    ddsd.dwFlags = DDSD_WIDTH;
-    hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        reset_ddsd(&ddsd);
+        ddsd.dwFlags = DDSD_LPSURFACE;
+        ddsd.lpSurface = data;
+        hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0);
+        if (invalid_caps_tests[i].supported)
+        {
+            ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr);
+        }
+        else
+        {
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+
+            /* Check priority of error conditions. */
+            ddsd.dwFlags = DDSD_WIDTH;
+            hr = IDirectDrawSurface4_SetSurfaceDesc(surface, &ddsd, 0);
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+        }
 
-    IDirectDrawSurface4_Release(surface);
+        IDirectDrawSurface4_Release(surface);
+    }
 
 done:
     ref = IDirectDraw4_Release(ddraw);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 58bde95..26bb82c 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -4904,6 +4904,20 @@ static void test_set_surface_desc(void)
     IDirectDrawSurface7 *surface;
     BYTE data[16*16*4];
     ULONG ref;
+    unsigned int i;
+    static const struct
+    {
+        DWORD caps, caps2;
+        BOOL supported;
+        const char *name;
+    }
+    invalid_caps_tests[] =
+    {
+        {DDSCAPS_VIDEOMEMORY, 0, FALSE, "videomemory plain"},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, TRUE, "systemmemory texture"},
+        {DDSCAPS_TEXTURE, DDSCAPS2_D3DTEXTUREMANAGE, FALSE, "managed texture"},
+        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, FALSE, "managed texture"},
+    };
 
     if (!(ddraw = create_ddraw()))
     {
@@ -5097,41 +5111,55 @@ static void test_set_surface_desc(void)
 
     IDirectDrawSurface7_Release(surface);
 
-    /* Need systemmemory surfaces.
+    /* SetSurfaceDesc needs systemmemory surfaces.
      *
      * As a sidenote, fourcc surfaces aren't allowed in sysmem, thus testing DDSD_LINEARSIZE is moot. */
-    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.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
-
-    hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL);
-    ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
-    if (FAILED(hr))
-    {
-        skip("Cannot create a video memory surface, skipping vidmem SetSurfaceDesc test.\n");
-        goto done;
-    }
+    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.ddsCaps.dwCaps = invalid_caps_tests[i].caps;
+        ddsd.ddsCaps.dwCaps2 = invalid_caps_tests[i].caps2;
 
-    reset_ddsd(&ddsd);
-    ddsd.dwFlags = DDSD_LPSURFACE;
-    ddsd.lpSurface = data;
-    hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL);
+        ok(SUCCEEDED(hr) || hr == DDERR_NODIRECTDRAWHW, "Failed to create surface, hr %#x.\n", hr);
+        if (FAILED(hr))
+        {
+            skip("Cannot create a %s surface, skipping vidmem SetSurfaceDesc test.\n",
+                    invalid_caps_tests[i].name);
+            goto done;
+        }
 
-    /* Check priority of error conditions. */
-    ddsd.dwFlags = DDSD_WIDTH;
-    hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0);
-    ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a vidmem surface returned %#x.\n", hr);
+        reset_ddsd(&ddsd);
+        ddsd.dwFlags = DDSD_LPSURFACE;
+        ddsd.lpSurface = data;
+        hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0);
+        if (invalid_caps_tests[i].supported)
+        {
+            ok(SUCCEEDED(hr), "Failed to set surface desc, hr %#x.\n", hr);
+        }
+        else
+        {
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+
+            /* Check priority of error conditions. */
+            ddsd.dwFlags = DDSD_WIDTH;
+            hr = IDirectDrawSurface7_SetSurfaceDesc(surface, &ddsd, 0);
+            ok(hr == DDERR_INVALIDSURFACETYPE, "SetSurfaceDesc on a %s surface returned %#x.\n",
+                    invalid_caps_tests[i].name, hr);
+        }
 
-    IDirectDrawSurface7_Release(surface);
+        IDirectDrawSurface7_Release(surface);
+    }
 
 done:
     ref = IDirectDraw7_Release(ddraw);
-- 
1.8.3.2




More information about the wine-patches mailing list