[PATCH 5/5] ddraw: Properly flip through the swap chain in ddraw_surface7_Flip().
Henri Verbeet
hverbeet at codeweavers.com
Thu Dec 5 03:34:18 CST 2013
---
dlls/ddraw/surface.c | 45 +++++++++++++++++++++++++++++++--------------
dlls/ddraw/tests/ddraw1.c | 10 +++++-----
dlls/ddraw/tests/ddraw2.c | 10 +++++-----
dlls/ddraw/tests/ddraw4.c | 10 +++++-----
dlls/ddraw/tests/ddraw7.c | 10 +++++-----
5 files changed, 51 insertions(+), 34 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 59c88c0..0675294 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -1209,27 +1209,44 @@ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDra
return DDERR_NOTFLIPPABLE;
}
}
+
+ if (rt == dst_impl->wined3d_surface)
+ wined3d_device_set_render_target(dst_impl->ddraw->wined3d_device, 0, src_impl->wined3d_surface, FALSE);
+ wined3d_resource_set_parent(wined3d_surface_get_resource(src_impl->wined3d_surface), dst_impl);
+ dst_impl->wined3d_surface = src_impl->wined3d_surface;
+ wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture),
+ wined3d_texture_get_parent(dst_impl->wined3d_texture));
+ dst_impl->wined3d_texture = src_impl->wined3d_texture;
}
else
{
- if (FAILED(hr = ddraw_surface7_GetAttachedSurface(iface, &caps, ¤t)))
+ for (current = iface;;)
{
- ERR("Can't find a flip target\n");
- wined3d_mutex_unlock();
- return DDERR_NOTFLIPPABLE; /* Unchecked */
+ if (FAILED(hr = ddraw_surface7_GetAttachedSurface(current, &caps, ¤t)))
+ {
+ ERR("Can't find a flip target\n");
+ wined3d_mutex_unlock();
+ return DDERR_NOTFLIPPABLE; /* Unchecked */
+ }
+ ddraw_surface7_Release(current);
+ if (current == iface)
+ {
+ dst_impl = impl_from_IDirectDrawSurface7(iface);
+ break;
+ }
+
+ src_impl = impl_from_IDirectDrawSurface7(current);
+ if (rt == dst_impl->wined3d_surface)
+ wined3d_device_set_render_target(dst_impl->ddraw->wined3d_device, 0, src_impl->wined3d_surface, FALSE);
+ wined3d_resource_set_parent(wined3d_surface_get_resource(src_impl->wined3d_surface), dst_impl);
+ dst_impl->wined3d_surface = src_impl->wined3d_surface;
+ wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture),
+ wined3d_texture_get_parent(dst_impl->wined3d_texture));
+ dst_impl->wined3d_texture = src_impl->wined3d_texture;
+ dst_impl = src_impl;
}
- src_impl = impl_from_IDirectDrawSurface7(current);
- ddraw_surface7_Release(current);
}
- if (rt == dst_impl->wined3d_surface)
- wined3d_device_set_render_target(dst_impl->ddraw->wined3d_device, 0, src_impl->wined3d_surface, FALSE);
- wined3d_resource_set_parent(wined3d_surface_get_resource(src_impl->wined3d_surface), dst_impl);
- dst_impl->wined3d_surface = src_impl->wined3d_surface;
- wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture),
- wined3d_texture_get_parent(dst_impl->wined3d_texture));
- dst_impl->wined3d_texture = src_impl->wined3d_texture;
-
/* We don't have to worry about potential texture bindings, since
* flippable surfaces can never be textures. */
if (rt == src_impl->wined3d_surface)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 77f43a0..d447fb7 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -3803,10 +3803,10 @@ static void test_flip(void)
color = get_surface_color(backbuffer1, 320, 240);
/* The testbot seems to just copy the contents of one surface to all the
* others, instead of properly flipping. */
- todo_wine ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
+ ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xffff0000;
hr = IDirectDrawSurface_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -3814,10 +3814,10 @@ static void test_flip(void)
hr = IDirectDrawSurface_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
+ ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xff00ff00;
hr = IDirectDrawSurface_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -3825,7 +3825,7 @@ static void test_flip(void)
hr = IDirectDrawSurface_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
+ ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 879ee39..3728723 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -4484,10 +4484,10 @@ static void test_flip(void)
color = get_surface_color(backbuffer1, 320, 240);
/* The testbot seems to just copy the contents of one surface to all the
* others, instead of properly flipping. */
- todo_wine ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
+ ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xffff0000;
hr = IDirectDrawSurface_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -4495,10 +4495,10 @@ static void test_flip(void)
hr = IDirectDrawSurface_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
+ ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xff00ff00;
hr = IDirectDrawSurface_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -4506,7 +4506,7 @@ static void test_flip(void)
hr = IDirectDrawSurface_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
+ ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index b7e07cb..374b659 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -5088,10 +5088,10 @@ static void test_flip(void)
color = get_surface_color(backbuffer1, 320, 240);
/* The testbot seems to just copy the contents of one surface to all the
* others, instead of properly flipping. */
- todo_wine ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
+ ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xffff0000;
hr = IDirectDrawSurface4_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -5099,10 +5099,10 @@ static void test_flip(void)
hr = IDirectDrawSurface4_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
+ ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xff00ff00;
hr = IDirectDrawSurface4_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -5110,7 +5110,7 @@ static void test_flip(void)
hr = IDirectDrawSurface4_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
+ ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index ca702d9..9758a90 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -4975,10 +4975,10 @@ static void test_flip(void)
color = get_surface_color(backbuffer1, 320, 240);
/* The testbot seems to just copy the contents of one surface to all the
* others, instead of properly flipping. */
- todo_wine ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
+ ok(compare_color(color, 0x0000ff00, 1) || broken(sysmem_primary && compare_color(color, 0x000000ff, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xffff0000;
hr = IDirectDrawSurface7_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -4986,10 +4986,10 @@ static void test_flip(void)
hr = IDirectDrawSurface7_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
+ ok(compare_color(color, 0x000000ff, 1) || broken(sysmem_primary && compare_color(color, 0x00ff0000, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
U5(fx).dwFillColor = 0xff00ff00;
hr = IDirectDrawSurface7_Blt(backbuffer3, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
@@ -4997,7 +4997,7 @@ static void test_flip(void)
hr = IDirectDrawSurface7_Flip(primary, NULL, DDFLIP_WAIT);
ok(SUCCEEDED(hr), "Failed to flip, hr %#x.\n", hr);
color = get_surface_color(backbuffer1, 320, 240);
- todo_wine ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
+ ok(compare_color(color, 0x00ff0000, 1) || broken(sysmem_primary && compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(backbuffer2, 320, 240);
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
--
1.7.10.4
More information about the wine-patches
mailing list