[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