Henri Verbeet : wined3d: Send clear operations through the command stream.

Alexandre Julliard julliard at winehq.org
Fri Sep 27 11:33:12 CDT 2013


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Sep 27 00:15:14 2013 +0200

wined3d: Send clear operations through the command stream.

---

 dlls/wined3d/cs.c              |   52 ++++++++++++++++++++++++++++++++++++---
 dlls/wined3d/device.c          |    8 +----
 dlls/wined3d/wined3d_private.h |    5 +++-
 3 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 5f9bb56..988c8d4 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -26,6 +26,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 enum wined3d_cs_op
 {
     WINED3D_CS_OP_PRESENT,
+    WINED3D_CS_OP_CLEAR,
 };
 
 struct wined3d_cs_present
@@ -39,7 +40,18 @@ struct wined3d_cs_present
     DWORD flags;
 };
 
-static void wined3d_cs_exec_present(const void *data)
+struct wined3d_cs_clear
+{
+    enum wined3d_cs_op opcode;
+    DWORD rect_count;
+    const RECT *rects;
+    DWORD flags;
+    const struct wined3d_color *color;
+    float depth;
+    DWORD stencil;
+};
+
+static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data)
 {
     const struct wined3d_cs_present *op = data;
     struct wined3d_swapchain *swapchain;
@@ -69,9 +81,40 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
     cs->ops->submit(cs);
 }
 
-static void (* const wined3d_cs_op_handlers[])(const void *data) =
+static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data)
+{
+    const struct wined3d_cs_clear *op = data;
+    struct wined3d_device *device;
+    RECT draw_rect;
+
+    device = cs->device;
+    wined3d_get_draw_rect(&device->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);
+}
+
+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)
+{
+    struct wined3d_cs_clear *op;
+
+    op = cs->ops->require_space(cs, sizeof(*op));
+    op->opcode = WINED3D_CS_OP_CLEAR;
+    op->rect_count = rect_count;
+    op->rects = rects;
+    op->flags = flags;
+    op->color = color;
+    op->depth = depth;
+    op->stencil = stencil;
+
+    cs->ops->submit(cs);
+}
+
+static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) =
 {
     /* WINED3D_CS_OP_PRESENT                */ wined3d_cs_exec_present,
+    /* WINED3D_CS_OP_CLEAR                  */ wined3d_cs_exec_clear,
 };
 
 static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size)
@@ -94,7 +137,7 @@ static void wined3d_cs_st_submit(struct wined3d_cs *cs)
 {
     enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)cs->data;
 
-    wined3d_cs_op_handlers[opcode](cs->data);
+    wined3d_cs_op_handlers[opcode](cs, cs->data);
 }
 
 static const struct wined3d_cs_ops wined3d_cs_st_ops =
@@ -103,7 +146,7 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops =
     wined3d_cs_st_submit,
 };
 
-struct wined3d_cs *wined3d_cs_create(void)
+struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
 {
     struct wined3d_cs *cs;
 
@@ -111,6 +154,7 @@ struct wined3d_cs *wined3d_cs_create(void)
         return NULL;
 
     cs->ops = &wined3d_cs_st_ops;
+    cs->device = device;
 
     cs->data_size = WINED3D_INITIAL_CS_SIZE;
     if (!(cs->data = HeapAlloc(GetProcessHeap(), 0, cs->data_size)))
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ff23770..6722990 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3466,8 +3466,6 @@ HRESULT CDECL wined3d_device_present(const struct wined3d_device *device, const
 HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_count,
         const RECT *rects, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
 {
-    RECT draw_rect;
-
     TRACE("device %p, rect_count %u, rects %p, flags %#x, color {%.8e, %.8e, %.8e, %.8e}, depth %.8e, stencil %u.\n",
             device, rect_count, rects, flags, color->r, color->g, color->b, color->a, depth, stencil);
 
@@ -3497,9 +3495,7 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou
         }
     }
 
-    wined3d_get_draw_rect(&device->state, &draw_rect);
-    device_clear_render_targets(device, device->adapter->gl_info.limits.buffers,
-            &device->fb, rect_count, rects, &draw_rect, flags, color, depth, stencil);
+    wined3d_cs_emit_clear(device->cs, rect_count, rects, flags, color, depth, stencil);
 
     return WINED3D_OK;
 }
@@ -4982,7 +4978,7 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
     state_init_default(&device->state, &adapter->gl_info);
     device->update_state = &device->state;
 
-    if (!(device->cs = wined3d_cs_create()))
+    if (!(device->cs = wined3d_cs_create(device)))
     {
         WARN("Failed to create command stream.\n");
         state_cleanup(&device->state);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 251de34..5a4ca29 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2464,14 +2464,17 @@ struct wined3d_cs_ops
 struct wined3d_cs
 {
     const struct wined3d_cs_ops *ops;
+    struct wined3d_device *device;
 
     size_t data_size;
     void *data;
 };
 
-struct wined3d_cs *wined3d_cs_create(void) DECLSPEC_HIDDEN;
+struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN;
 void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
 
+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) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain,
         const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override,
         const RGNDATA *dirty_region, DWORD flags) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list