[PATCH 2/3] ddraw: Only do asynchronous clears when the application asked for them.

Henri Verbeet hverbeet at codeweavers.com
Thu Sep 27 10:30:34 CDT 2018


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/ddraw/surface.c   | 12 ++++++++++--
 dlls/wined3d/cs.c      |  2 ++
 include/wine/wined3d.h |  1 +
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index fc120e390eb..d201d9d4146 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -1458,24 +1458,32 @@ static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *
 
     if (flags & DDBLT_COLORFILL)
     {
+        wined3d_flags = WINED3DCLEAR_TARGET;
+        if (!(flags & DDBLT_ASYNC))
+            wined3d_flags |= WINED3DCLEAR_SYNCHRONOUS;
+
         if (!wined3d_colour_from_ddraw_colour(&dst_surface->surface_desc.u4.ddpfPixelFormat,
                 dst_surface->palette, fill_colour, &colour))
             return DDERR_INVALIDPARAMS;
 
         return wined3d_device_clear_rendertarget_view(wined3d_device,
                 ddraw_surface_get_rendertarget_view(dst_surface),
-                dst_rect, WINED3DCLEAR_TARGET, &colour, 0.0f, 0);
+                dst_rect, wined3d_flags, &colour, 0.0f, 0);
     }
 
     if (flags & DDBLT_DEPTHFILL)
     {
+        wined3d_flags = WINED3DCLEAR_ZBUFFER;
+        if (!(flags & DDBLT_ASYNC))
+            wined3d_flags |= WINED3DCLEAR_SYNCHRONOUS;
+
         if (!wined3d_colour_from_ddraw_colour(&dst_surface->surface_desc.u4.ddpfPixelFormat,
                 dst_surface->palette, fill_colour, &colour))
             return DDERR_INVALIDPARAMS;
 
         return wined3d_device_clear_rendertarget_view(wined3d_device,
                 ddraw_surface_get_rendertarget_view(dst_surface),
-                dst_rect, WINED3DCLEAR_ZBUFFER, NULL, colour.r, 0);
+                dst_rect, wined3d_flags, NULL, colour.r, 0);
     }
 
     wined3d_flags = flags & ~DDBLT_ASYNC;
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index ecfce418123..ff4d562f106 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -671,6 +671,8 @@ void wined3d_cs_emit_clear_rendertarget_view(struct wined3d_cs *cs, struct wined
     wined3d_resource_acquire(view->resource);
 
     cs->ops->submit(cs, WINED3D_CS_QUEUE_DEFAULT);
+    if (flags & WINED3DCLEAR_SYNCHRONOUS)
+        cs->ops->finish(cs, WINED3D_CS_QUEUE_DEFAULT);
 }
 
 static void acquire_shader_resources(const struct wined3d_state *state, unsigned int shader_mask)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index dc613fff2b2..e2e6a72c846 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1015,6 +1015,7 @@ enum wined3d_shader_type
 #define WINED3DCLEAR_TARGET                                     0x00000001
 #define WINED3DCLEAR_ZBUFFER                                    0x00000002
 #define WINED3DCLEAR_STENCIL                                    0x00000004
+#define WINED3DCLEAR_SYNCHRONOUS                                0x80000000
 
 /* Stream source flags */
 #define WINED3DSTREAMSOURCE_INDEXEDDATA                         (1u << 30)
-- 
2.11.0




More information about the wine-devel mailing list