gallium: change draw_vertex_shader->state from pointer to struct
authorBrian <brian@poulsbo.localnet.net>
Wed, 12 Mar 2008 19:20:29 +0000 (13:20 -0600)
committerBrian <brian@poulsbo.localnet.net>
Wed, 12 Mar 2008 19:20:29 +0000 (13:20 -0600)
We were sometimes keeping a pointer to a stack-allocated object.
Now make a copy of the pipe_shader_state object.
This should fix some seemingly random memory errors/crashes.

src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_vs_exec.c
src/gallium/auxiliary/draw/draw_vs_sse.c

index 25fa8c09c2f034df9472f1c4b774a7e83ec55976..4147472d451879b44bcd90f740b587a855302346 100644 (file)
@@ -133,7 +133,7 @@ struct draw_vertex_shader {
 
    /* This member will disappear shortly:
     */
-   const struct pipe_shader_state   *state;
+   struct pipe_shader_state   state;
 
    struct tgsi_shader_info info;
 
index 514303e0eac5a751bc8bec721e9cf4281d0e1ec7..55bec14116a978ab4b2e333aa4ee4a0e943041ee 100644 (file)
@@ -71,7 +71,7 @@ vs_exec_prepare( struct draw_vertex_shader *shader,
 {
    /* specify the vertex program to interpret/execute */
    tgsi_exec_machine_bind_shader(&draw->machine,
-                                shader->state->tokens,
+                                shader->state.tokens,
                                 PIPE_MAX_SAMPLERS,
                                 NULL /*samplers*/ );
 
@@ -187,7 +187,7 @@ draw_create_vs_exec(struct draw_context *draw,
    if (vs == NULL) 
       return NULL;
 
-   vs->state = state;
+   vs->state = *state;
    vs->prepare = vs_exec_prepare;
    vs->run = vs_exec_run;
    vs->delete = vs_exec_delete;
index e5c1a40cca6eb06f387b041502c03380f371af1b..5ee2adb344761c2dfb3805832410a8e96bc4ff2f 100644 (file)
@@ -221,14 +221,14 @@ draw_create_vs_sse(struct draw_context *draw,
    if (vs == NULL) 
       return NULL;
 
-   vs->base.state = templ;
+   vs->base.state = *templ;
    vs->base.prepare = vs_sse_prepare;
    vs->base.run = vs_sse_run;
    vs->base.delete = vs_sse_delete;
    
    x86_init_func( &vs->sse2_program );
 
-   if (!tgsi_emit_sse2( (struct tgsi_token *) vs->base.state->tokens,
+   if (!tgsi_emit_sse2( (struct tgsi_token *) vs->base.state.tokens,
                        &vs->sse2_program )) 
       goto fail;