Henri Verbeet : wined3d: Synchronise WINED3D_CS_OP_CLEAR resource access.

Alexandre Julliard julliard at winehq.org
Sun Jul 10 08:57:09 CDT 2016


Module: wine
Branch: master
Commit: ff584b98a7962d33c5ea85317e6816a61b16ef48
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ff584b98a7962d33c5ea85317e6816a61b16ef48

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Sun Jul 10 15:09:17 2016 +0200

wined3d: Synchronise WINED3D_CS_OP_CLEAR resource access.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/cs.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 21f783a..c456b5b 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -304,20 +304,36 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
 static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data)
 {
     const struct wined3d_cs_clear *op = data;
+    const struct wined3d_state *state;
     struct wined3d_device *device;
+    unsigned int i;
     RECT draw_rect;
 
     device = cs->device;
-    wined3d_get_draw_rect(&device->state, &draw_rect);
+    state = &device->state;
+    wined3d_get_draw_rect(state, &draw_rect);
     device_clear_render_targets(device, device->adapter->gl_info.limits.buffers,
             &device->fb, op->rect_count, op->rects, &draw_rect, op->flags,
             &op->color, op->depth, op->stencil);
+
+    if (op->flags & WINED3DCLEAR_TARGET)
+    {
+        for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
+        {
+            if (state->fb->render_targets[i])
+                wined3d_resource_release(state->fb->render_targets[i]->resource);
+        }
+    }
+    if (op->flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL))
+        wined3d_resource_release(state->fb->depth_stencil->resource);
 }
 
 void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
         DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
 {
+    const struct wined3d_state *state = &cs->device->state;
     struct wined3d_cs_clear *op;
+    unsigned int i;
 
     op = cs->ops->require_space(cs, FIELD_OFFSET(struct wined3d_cs_clear, rects[rect_count]));
     op->opcode = WINED3D_CS_OP_CLEAR;
@@ -328,6 +344,17 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
     op->rect_count = rect_count;
     memcpy(op->rects, rects, sizeof(*rects) * rect_count);
 
+    if (flags & WINED3DCLEAR_TARGET)
+    {
+        for (i = 0; i < cs->device->adapter->gl_info.limits.buffers; ++i)
+        {
+            if (state->fb->render_targets[i])
+                wined3d_resource_acquire(state->fb->render_targets[i]->resource);
+        }
+    }
+    if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL))
+        wined3d_resource_acquire(state->fb->depth_stencil->resource);
+
     cs->ops->submit(cs);
 }
 




More information about the wine-cvs mailing list