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