Henri Verbeet : wined3d: Handle CS op emission from CS op handlers.
Alexandre Julliard
julliard at winehq.org
Fri Feb 17 14:37:11 CST 2017
Module: wine
Branch: master
Commit: 351e6ddf094256d4de4ffe59d5bd5fe72a5b24a2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=351e6ddf094256d4de4ffe59d5bd5fe72a5b24a2
Author: Henri Verbeet <hverbeet at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
};
More information about the wine-cvs
mailing list