[Mesa-dev] [PATCH] i965: Save meta blit programs in the context.

Ian Romanick idr at freedesktop.org
Fri Jun 20 11:12:13 PDT 2014


On 06/19/2014 12:02 AM, Kenneth Graunke wrote:
> When the last context in a share group is destroyed, the hash table
> containing all of the shader programs (ctx->Shared->ShaderObjects) is
> destroyed, throwing away all of the shader programs.
> 
> Using a static variable to store program IDs ends up holding on to them
> after this, so we think we still have a compiled program, when it
> actually got destroyed.  _mesa_UseProgram then hits GL errors, since no
> program by that ID exists.
> 
> Instead, store the program IDs in the context, so we know to recompile
> if our context gets destroyed and the application creates another one.

Yikes!

> Fixes es3conform tests when run without -minfmt (where it creates
> separate contexts for testing each visual).
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77865
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Cc: "10.2" <mesa-stable at lists.freedesktop.org>

> ---
>  src/mesa/drivers/dri/i965/brw_context.h           |  3 +++
>  src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c | 18 ++++++++++--------
>  2 files changed, 13 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 283c576..72cf39b 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1115,6 +1115,9 @@ struct brw_context
>  
>     struct brw_cache cache;
>  
> +   /** IDs for meta stencil blit shader programs. */
> +   unsigned meta_stencil_blit_programs[2];
> +
>     /* Whether a meta-operation is in progress. */
>     bool meta_in_progress;
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> index 5d132b7..bdd642b 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> @@ -272,28 +272,30 @@ setup_coord_transform(GLuint prog, const struct blit_dims *dims)
>  }
>  
>  static GLuint
> -setup_program(struct gl_context *ctx, bool msaa_tex)
> +setup_program(struct brw_context *brw, bool msaa_tex)
>  {
> +   struct gl_context *ctx = &brw->ctx;
>     struct blit_state *blit = &ctx->Meta->Blit;
> -   static GLuint prog_cache[] = { 0, 0 };
>     char *fs_source;
>     const struct sampler_and_fetch *sampler = &samplers[msaa_tex];
>  
>     _mesa_meta_setup_vertex_objects(&blit->VAO, &blit->VBO, true, 2, 2, 0);
>  
> -   if (prog_cache[msaa_tex]) {
> -      _mesa_UseProgram(prog_cache[msaa_tex]);
> -      return prog_cache[msaa_tex];
> +   GLuint *prog_id = &brw->meta_stencil_blit_programs[msaa_tex];
> +
> +   if (*prog_id) {
> +      _mesa_UseProgram(*prog_id);
> +      return *prog_id;
>     }
>    
>     fs_source = ralloc_asprintf(NULL, fs_tmpl, sampler->sampler,
>                                 sampler->fetch);
>     _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source,
>                                         "i965 stencil blit",
> -                                       &prog_cache[msaa_tex]);
> +                                       prog_id);
>     ralloc_free(fs_source);
>  
> -   return prog_cache[msaa_tex];
> +   return *prog_id;
>  }
>  
>  /**
> @@ -427,7 +429,7 @@ brw_meta_stencil_blit(struct brw_context *brw,
>     _mesa_TexParameteri(target, GL_DEPTH_STENCIL_TEXTURE_MODE,
>                         GL_STENCIL_INDEX);
>  
> -   prog = setup_program(ctx, target != GL_TEXTURE_2D);
> +   prog = setup_program(brw, target != GL_TEXTURE_2D);
>     setup_bounding_rect(prog, orig_dims);
>     setup_drawing_rect(prog, &dims);
>     setup_coord_transform(prog, orig_dims);
> 



More information about the mesa-dev mailing list