gallium: clean-up glDraw/CopyPixels shaders when destroying context
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 20 May 2008 19:38:45 +0000 (13:38 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 20 May 2008 19:38:45 +0000 (13:38 -0600)
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_drawpixels.h
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h

index 56b949cf9609801d9a4ff1cc37e9837eac6520d3..fbbe8d2d64ecf8de4f749b4cff7a26f229777787 100644 (file)
@@ -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);
+}
+
+
index 71ba487020090f08e8e9c28678c915a05733cf9e..26fe864d185599590ff289991fe49fef7b035ca6 100644 (file)
@@ -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 */
index fb397ea510d5f18d8588235fc0cc35790c6de52c..b407fd884bc2b16f4a2f7bdcca1fe32c9a3791dd 100644 (file)
@@ -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);
 
index 1ca779d0a98e5eb2d2a4db787d4a046a84b18547..46c16e45e66e817d9a26de57e048bd300249ec91 100644 (file)
@@ -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;