Module: wine Branch: master Commit: 351e6ddf094256d4de4ffe59d5bd5fe72a5b24a2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=351e6ddf094256d4de4ffe59d5...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Feb 17 14:08:15 2017 +0100
wined3d: Handle CS op emission from CS op handlers.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/cs.c | 37 +++++++++++++++++++++++++++++-------- dlls/wined3d/wined3d_private.h | 2 +- 2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 55706cd..10905c0 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1576,26 +1576,47 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void
static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) { - if (size > cs->data_size) + if (size > (cs->data_size - cs->end)) { + size_t new_size; void *new_data;
- size = max( size, cs->data_size * 2 ); - if (!(new_data = HeapReAlloc(GetProcessHeap(), 0, cs->data, size))) + new_size = max(size, cs->data_size * 2); + if (!cs->end) + new_data = HeapReAlloc(GetProcessHeap(), 0, cs->data, new_size); + else + new_data = HeapAlloc(GetProcessHeap(), 0, new_size); + if (!new_data) return NULL;
- cs->data_size = size; + cs->data_size = new_size; + cs->start = cs->end = 0; cs->data = new_data; }
- return cs->data; + cs->end += size; + + return (BYTE *)cs->data + cs->start; }
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, cs->data); + enum wined3d_cs_op opcode; + size_t start; + BYTE *data; + + data = cs->data; + start = cs->start; + cs->start = cs->end; + opcode = *(const enum wined3d_cs_op *)&data[start]; + wined3d_cs_op_handlers[opcode](cs, &data[start]); + if (!start) + { + if (cs->data != data) + HeapFree(GetProcessHeap(), 0, data); + else + cs->start = cs->end = 0; + } }
static void wined3d_cs_st_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 54adf26..49fba06 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3170,7 +3170,7 @@ struct wined3d_cs struct wined3d_fb_state fb; struct wined3d_state state;
- size_t data_size; + size_t data_size, start, end; void *data; };