gallium: make a copy of the vertex shader's token array.
authorBrian <brian.paul@tungstengraphics.com>
Mon, 24 Mar 2008 22:31:15 +0000 (16:31 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 24 Mar 2008 22:35:25 +0000 (16:35 -0600)
This solves problems when the state tracker frees the token array when the
draw module still needs it.

src/gallium/auxiliary/draw/draw_vs_exec.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/draw/draw_vs_sse.c

index 364693e0b491992af4598e6a45b3ef0dd3f1bcee..4e2fa727070a91a2311460eee26c66d5fd08ccfb 100644 (file)
@@ -38,6 +38,8 @@
 #include "draw_context.h"
 #include "draw_vs.h"
 
+#include "tgsi/util/tgsi_parse.h"
+
 
 static INLINE unsigned
 compute_clipmask(const float *clip, /*const*/ float plane[][4], unsigned nr)
@@ -187,6 +189,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
 static void
 vs_exec_delete( struct draw_vertex_shader *dvs )
 {
+   FREE((void*) dvs->state.tokens);
    FREE( dvs );
 }
 
@@ -196,11 +199,13 @@ draw_create_vs_exec(struct draw_context *draw,
                    const struct pipe_shader_state *state)
 {
    struct draw_vertex_shader *vs = CALLOC_STRUCT( draw_vertex_shader );
+   uint nt = tgsi_num_tokens(state->tokens);
 
    if (vs == NULL) 
       return NULL;
 
-   vs->state = *state;
+   /* we make a private copy of the tokens */
+   vs->state.tokens = mem_dup(state->tokens, nt * sizeof(state->tokens[0]));
    vs->prepare = vs_exec_prepare;
    vs->run = vs_exec_run;
    vs->delete = vs_exec_delete;
index 53c260be53a33fa969a387a545051750cf27fcca..bd983f2ddfa52a91962031706d17457874f7a983 100644 (file)
@@ -38,6 +38,8 @@
 #include "draw_context.h"
 #include "draw_vs.h"
 
+#include "tgsi/util/tgsi_parse.h"
+
 #ifdef MESA_LLVM
 
 #include "gallivm/gallivm.h"
@@ -186,6 +188,7 @@ vs_llvm_delete( struct draw_vertex_shader *base )
    /* Do something to free compiled shader:
     */
 
+   FREE( (void*) shader->base.state.tokens );
    FREE( shader );
 }
 
@@ -197,12 +200,14 @@ draw_create_vs_llvm(struct draw_context *draw,
                    const struct pipe_shader_state *templ)
 {
    struct draw_llvm_vertex_shader *vs;
+   uint nt = tgsi_num_tokens(templ->tokens);
 
    vs = CALLOC_STRUCT( draw_llvm_vertex_shader );
    if (vs == NULL) 
       return NULL;
 
-   vs->base.state = templ;
+   /* we make a private copy of the tokens */
+   vs->base.state.tokens = mem_dup(templ->tokens, nt * sizeof(templ->tokens[0]));
    vs->base.prepare = vs_llvm_prepare;
    vs->base.run = vs_llvm_run;
    vs->base.delete = vs_llvm_delete;
index 5ee2adb344761c2dfb3805832410a8e96bc4ff2f..a4503c143edcd09a5ce358938a4ccccd1354978f 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "rtasm/rtasm_x86sse.h"
 #include "tgsi/exec/tgsi_sse2.h"
+#include "tgsi/util/tgsi_parse.h"
 
 
 typedef void (XSTDCALL *codegen_function) (
@@ -204,6 +205,7 @@ vs_sse_delete( struct draw_vertex_shader *base )
    
    x86_release_func( &shader->sse2_program );
 
+   FREE( (void*) shader->base.state.tokens );
    FREE( shader );
 }
 
@@ -213,6 +215,7 @@ draw_create_vs_sse(struct draw_context *draw,
                           const struct pipe_shader_state *templ)
 {
    struct draw_sse_vertex_shader *vs;
+   uint nt = tgsi_num_tokens(templ->tokens);
 
    if (!draw->use_sse) 
       return NULL;
@@ -221,7 +224,8 @@ draw_create_vs_sse(struct draw_context *draw,
    if (vs == NULL) 
       return NULL;
 
-   vs->base.state = *templ;
+   /* we make a private copy of the tokens */
+   vs->base.state.tokens = mem_dup(templ->tokens, nt * sizeof(templ->tokens[0]));
    vs->base.prepare = vs_sse_prepare;
    vs->base.run = vs_sse_run;
    vs->base.delete = vs_sse_delete;