Module: wine Branch: master Commit: baf285d46a8d93b673a6368c68f833dbbcbc39f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=baf285d46a8d93b673a6368c68...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Sep 27 00:15:15 2013 +0200
wined3d: Send draw operation through the command stream.
---
dlls/wined3d/cs.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/wined3d/device.c | 9 ++++----- dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 988c8d4..cdd7794 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -27,6 +27,7 @@ enum wined3d_cs_op { WINED3D_CS_OP_PRESENT, WINED3D_CS_OP_CLEAR, + WINED3D_CS_OP_DRAW, };
struct wined3d_cs_present @@ -51,6 +52,16 @@ struct wined3d_cs_clear DWORD stencil; };
+struct wined3d_cs_draw +{ + enum wined3d_cs_op opcode; + UINT start_idx; + UINT index_count; + UINT start_instance; + UINT instance_count; + BOOL indexed; +}; + static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) { const struct wined3d_cs_present *op = data; @@ -111,10 +122,35 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * cs->ops->submit(cs); }
+static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) +{ + const struct wined3d_cs_draw *op = data; + + draw_primitive(cs->device, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); +} + +void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count, + UINT start_instance, UINT instance_count, BOOL indexed) +{ + struct wined3d_cs_draw *op; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_DRAW; + op->start_idx = start_idx; + op->index_count = index_count; + op->start_instance = start_instance; + op->instance_count = instance_count; + op->indexed = indexed; + + 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, + /* WINED3D_CS_OP_DRAW */ wined3d_cs_exec_draw, };
static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 6722990..6d5f913 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3542,9 +3542,8 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT device_invalidate_state(device, STATE_BASEVERTEXINDEX); }
- /* Account for the loading offset due to index buffers. Instead of - * reloading all sources correct it with the startvertex parameter. */ - draw_primitive(device, start_vertex, vertex_count, 0, 0, FALSE); + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE); + return WINED3D_OK; }
@@ -3577,7 +3576,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic device_invalidate_state(device, STATE_BASEVERTEXINDEX); }
- draw_primitive(device, start_idx, index_count, 0, 0, TRUE); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE);
return WINED3D_OK; } @@ -3587,7 +3586,7 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device { TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count);
- draw_primitive(device, start_idx, index_count, start_instance, instance_count, TRUE); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, start_instance, instance_count, TRUE); }
/* This is a helper function for UpdateTexture, there is no UpdateVolume method in D3D. */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 5a4ca29..3ffa4da 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2475,6 +2475,8 @@ 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_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count, + UINT start_instance, UINT instance_count, BOOL indexed) 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;