Module: wine Branch: master Commit: cf12f51b1520546dc855e8e8e43135a06e7a0cbf URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf12f51b1520546dc855e8e8e4...
Author: Ričardas Barkauskas rbarkauskas@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;