Commit b712d6c8 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

ddraw: Sync to sysmem after performing a color fill.

parent 48ecde18
...@@ -1531,6 +1531,33 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2 ...@@ -1531,6 +1531,33 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2
src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags); src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags);
} }
/* Emperor: Rise of the Middle Kingdom accesses the map pointer outside of
* Lock()/Unlock(), and expects those updates to be propagated by a Blt().
* It also blits to the surface, and color-fills it.
*
* This function is called after a color-fill that might update the GPU side.
* We need to make sure the sysmem surface is synchronized. */
static void ddraw_surface_sync_pinned_sysmem(struct ddraw_surface *surface)
{
RECT rect;
if (!surface->draw_texture)
return;
if (!(surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY))
return;
SetRect(&rect, 0, 0, surface->surface_desc.dwWidth, surface->surface_desc.dwHeight);
wined3d_device_context_blt(surface->ddraw->immediate_context,
surface->wined3d_texture, surface->sub_resource_idx, &rect,
surface->draw_texture, surface->sub_resource_idx, &rect,
WINED3D_BLT_SYNCHRONOUS, NULL, WINED3D_TEXF_POINT);
/* The sysmem surface may be updated at any time, so we must invalidate the
* draw texture location here. */
surface->texture_location = DDRAW_SURFACE_LOCATION_DEFAULT;
}
static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *dst_rect, static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *dst_rect,
struct ddraw_surface *src_surface, const RECT *src_rect, DWORD flags, DWORD fill_colour, struct ddraw_surface *src_surface, const RECT *src_rect, DWORD flags, DWORD fill_colour,
const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter) const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter)
...@@ -1539,6 +1566,7 @@ static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT * ...@@ -1539,6 +1566,7 @@ static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *
struct wined3d_device *wined3d_device = ddraw->wined3d_device; struct wined3d_device *wined3d_device = ddraw->wined3d_device;
struct wined3d_color colour; struct wined3d_color colour;
DWORD wined3d_flags; DWORD wined3d_flags;
HRESULT hr;
if (flags & DDBLT_COLORFILL) if (flags & DDBLT_COLORFILL)
{ {
...@@ -1552,9 +1580,11 @@ static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT * ...@@ -1552,9 +1580,11 @@ static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *
wined3d_device_apply_stateblock(wined3d_device, ddraw->state); wined3d_device_apply_stateblock(wined3d_device, ddraw->state);
ddraw_surface_get_draw_texture(dst_surface, dst_rect ? DDRAW_SURFACE_RW : DDRAW_SURFACE_WRITE); ddraw_surface_get_draw_texture(dst_surface, dst_rect ? DDRAW_SURFACE_RW : DDRAW_SURFACE_WRITE);
return wined3d_device_context_clear_rendertarget_view(ddraw->immediate_context, hr = wined3d_device_context_clear_rendertarget_view(ddraw->immediate_context,
ddraw_surface_get_rendertarget_view(dst_surface), ddraw_surface_get_rendertarget_view(dst_surface),
dst_rect, wined3d_flags, &colour, 0.0f, 0); dst_rect, wined3d_flags, &colour, 0.0f, 0);
ddraw_surface_sync_pinned_sysmem(dst_surface);
return hr;
} }
if (flags & DDBLT_DEPTHFILL) if (flags & DDBLT_DEPTHFILL)
......
...@@ -15507,7 +15507,7 @@ static void test_pinned_sysmem(void) ...@@ -15507,7 +15507,7 @@ static void test_pinned_sysmem(void)
ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(hr == S_OK, "Got hr %#lx.\n", hr);
color = ((unsigned short *)surface_desc.lpSurface)[0]; color = ((unsigned short *)surface_desc.lpSurface)[0];
todo_wine ok(color == 0xface, "Got color %04x.\n", color); ok(color == 0xface, "Got color %04x.\n", color);
memset(surface_desc.lpSurface, 0x55, 32 * 16 * 2); memset(surface_desc.lpSurface, 0x55, 32 * 16 * 2);
...@@ -15517,7 +15517,7 @@ static void test_pinned_sysmem(void) ...@@ -15517,7 +15517,7 @@ static void test_pinned_sysmem(void)
hr = IDirectDrawSurface_Lock(surface2, NULL, &surface_desc, DDLOCK_WAIT, NULL); hr = IDirectDrawSurface_Lock(surface2, NULL, &surface_desc, DDLOCK_WAIT, NULL);
ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(hr == S_OK, "Got hr %#lx.\n", hr);
color = ((unsigned short *)surface_desc.lpSurface)[0]; color = ((unsigned short *)surface_desc.lpSurface)[0];
todo_wine ok(color == 0x5555, "Got color %04x.\n", color); ok(color == 0x5555, "Got color %04x.\n", color);
color = ((unsigned short *)surface_desc.lpSurface)[32 * 16]; color = ((unsigned short *)surface_desc.lpSurface)[32 * 16];
ok(color == 0xface, "Got color %04x.\n", color); ok(color == 0xface, "Got color %04x.\n", color);
hr = IDirectDrawSurface_Unlock(surface2, NULL); hr = IDirectDrawSurface_Unlock(surface2, NULL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment