=?UTF-8?Q?Ri=C4=8Dardas=20Barkauskas=20?=: wined3d: Make shader buffer dynamic.

Alexandre Julliard julliard at winehq.org
Tue Feb 26 13:48:15 CST 2013


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

Author: Ričardas Barkauskas <rbarkauskas at codeweavers.com>
Date:   Mon Feb 25 22:49:38 2013 +0200

wined3d: Make shader buffer dynamic.

---

 dlls/wined3d/shader.c          |   28 +++++++++++++++++++++-------
 dlls/wined3d/wined3d_private.h |    3 ++-
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 0616f0a..6444896 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -251,6 +251,7 @@ BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
         ERR("Failed to allocate shader buffer memory.\n");
         return FALSE;
     }
+    buffer->buffer_size = SHADER_PGMSIZE;
 
     shader_buffer_clear(buffer);
     return TRUE;
@@ -265,15 +266,28 @@ int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va
 {
     char *base = buffer->buffer + buffer->content_size;
     int rc;
+    char *new_buffer;
 
-    rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->content_size, format, args);
-
-    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->content_size /* C99 */)
+    while(1)
     {
-        ERR("The buffer allocated for the shader program string "
-            "is too small at %d bytes.\n", SHADER_PGMSIZE);
-        buffer->content_size = SHADER_PGMSIZE - 1;
-        return -1;
+        rc = vsnprintf(base, buffer->buffer_size - buffer->content_size, format, args);
+        if (rc < 0 /* C89 */ || (unsigned int)rc >= buffer->buffer_size - buffer->content_size /* C99 */)
+        {
+            new_buffer = HeapReAlloc(GetProcessHeap(), 0, buffer->buffer, buffer->buffer_size * 2);
+            if (!new_buffer)
+            {
+                ERR("The buffer allocated for the shader program string is too small at %d bytes.\n", buffer->buffer_size);
+                buffer->content_size = buffer->buffer_size - 1;
+                return -1;
+            }
+            buffer->buffer = new_buffer;
+            buffer->buffer_size = buffer->buffer_size * 2;
+            base = buffer->buffer + buffer->content_size;
+        }
+        else
+        {
+            break;
+        }
     }
 
     if (buffer->newline)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1e9a3a9..b81e018 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -402,11 +402,12 @@ enum wined3d_shader_rel_op
  * Shader model 3 according to msdn (and for software shaders) */
 #define MAX_LABELS 16
 
-#define SHADER_PGMSIZE 65535
+#define SHADER_PGMSIZE 16384
 
 struct wined3d_shader_buffer
 {
     char *buffer;
+    unsigned int buffer_size;
     unsigned int content_size;
     unsigned int lineNo;
     BOOL newline;




More information about the wine-cvs mailing list