diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2008-05-20 13:38:45 -0600 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2008-05-20 13:38:45 -0600 | 
| commit | 5c431c22227fdc552b34a5feabf1d339dcfe9848 (patch) | |
| tree | 9623ccf1c0d5e4c0518626a497afdfce63de95ed | |
| parent | 21e614eabc5e6a502504f307f3710b4dd0417923 (diff) | |
gallium: clean-up glDraw/CopyPixels shaders when destroying context
| -rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.c | 39 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.h | 3 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_context.c | 1 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_context.h | 6 | 
4 files changed, 37 insertions, 12 deletions
| diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 56b949cf96..fbbe8d2d64 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -164,14 +164,16 @@ static struct st_fragment_program *  make_fragment_shader_z(struct st_context *st)  {     GLcontext *ctx = st->ctx; -   /* only make programs once and re-use */ -   static struct st_fragment_program *stfp = NULL;     struct gl_program *p;     GLuint ic = 0; -   if (stfp) -      return stfp; +   if (st->drawpix.z_shader) { +      return st->drawpix.z_shader; +   } +   /* +    * Create shader now +    */     p = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);     if (!p)        return NULL; @@ -213,10 +215,10 @@ make_fragment_shader_z(struct st_context *st)     p->OutputsWritten = (1 << FRAG_RESULT_COLR) | (1 << FRAG_RESULT_DEPR);     p->SamplersUsed = 0x1;  /* sampler 0 (bit 0) is used */ -   stfp = (struct st_fragment_program *) p; -   st_translate_fragment_program(st, stfp, NULL); +   st->drawpix.z_shader = (struct st_fragment_program *) p; +   st_translate_fragment_program(st, st->drawpix.z_shader, NULL); -   return stfp; +   return st->drawpix.z_shader;  } @@ -228,16 +230,17 @@ make_fragment_shader_z(struct st_context *st)  static struct st_vertex_program *  st_make_passthrough_vertex_shader(struct st_context *st, GLboolean passColor)  { -   /* only make programs once and re-use */ -   static struct st_vertex_program *progs[2] = { NULL, NULL };     GLcontext *ctx = st->ctx;     struct st_vertex_program *stvp;     struct gl_program *p;     GLuint ic = 0; -   if (progs[passColor]) -      return progs[passColor]; +   if (st->drawpix.vert_shaders[passColor]) +      return st->drawpix.vert_shaders[passColor]; +   /* +    * Create shader now +    */     p = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);     if (!p)        return NULL; @@ -293,7 +296,7 @@ st_make_passthrough_vertex_shader(struct st_context *st, GLboolean passColor)     stvp = (struct st_vertex_program *) p;     st_translate_vertex_program(st, stvp, NULL); -   progs[passColor] = stvp; +   st->drawpix.vert_shaders[passColor] = stvp;     return stvp;  } @@ -1042,3 +1045,15 @@ void st_init_drawpixels_functions(struct dd_function_table *functions)     functions->DrawPixels = st_DrawPixels;     functions->CopyPixels = st_CopyPixels;  } + + +void +st_destroy_drawpix(struct st_context *st) +{ +   st_reference_fragprog(st, &st->drawpix.z_shader, NULL); +   st_reference_fragprog(st, &st->pixel_xfer.combined_prog, NULL); +   st_reference_vertprog(st, &st->drawpix.vert_shaders[0], NULL); +   st_reference_vertprog(st, &st->drawpix.vert_shaders[1], NULL); +} + + diff --git a/src/mesa/state_tracker/st_cb_drawpixels.h b/src/mesa/state_tracker/st_cb_drawpixels.h index 71ba487020..26fe864d18 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.h +++ b/src/mesa/state_tracker/st_cb_drawpixels.h @@ -32,5 +32,8 @@  extern void st_init_drawpixels_functions(struct dd_function_table *functions); +extern void +st_destroy_drawpix(struct st_context *st); +  #endif /* ST_CB_DRAWPIXELS_H */ diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index fb397ea510..b407fd884b 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -168,6 +168,7 @@ static void st_destroy_context_priv( struct st_context *st )     st_destroy_bitmap(st);     st_destroy_blit(st);     st_destroy_clear(st); +   st_destroy_drawpix(st);     _vbo_DestroyContext(st->ctx); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 1ca779d0a9..46c16e45e6 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -152,6 +152,12 @@ struct st_context        struct bitmap_cache *cache;     } bitmap; +   /** for glDraw/CopyPixels */ +   struct { +      struct st_fragment_program *z_shader; +      struct st_vertex_program *vert_shaders[2]; +   } drawpix; +     /** for glClear */     struct {        struct pipe_shader_state vert_shader; | 
