summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/draw/draw_vs_sse.c
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2008-03-24 16:31:15 -0600
committerBrian <brian.paul@tungstengraphics.com>2008-03-24 16:35:25 -0600
commitae146e4bc86aeade59d018100e39e160f7553994 (patch)
treeecd4019e22dab520ce99bb15405152be75b261a7 /src/gallium/auxiliary/draw/draw_vs_sse.c
parent7f430293772f201a59bcf62edd1ed4f942f8be29 (diff)
gallium: make a copy of the vertex shader's token array.
This solves problems when the state tracker frees the token array when the draw module still needs it.
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_vs_sse.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_sse.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/draw/draw_vs_sse.c b/src/gallium/auxiliary/draw/draw_vs_sse.c
index 5ee2adb344..a4503c143e 100644
--- a/src/gallium/auxiliary/draw/draw_vs_sse.c
+++ b/src/gallium/auxiliary/draw/draw_vs_sse.c
@@ -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;