[Mesa-dev] [PATCH] r600: don't use shader key without verifying shader type (v2)

Edward O'Callaghan edward.ocallaghan at koparo.com
Mon Sep 7 18:30:39 PDT 2015


LGTM, thanks for catching this!

-- 
  Edward O'Callaghan
  edward.ocallaghan at koparo.com

On Tue, Sep 8, 2015, at 09:32 AM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> Since 7a32652231f96eac14c4bfce02afe77b4132fb77
> r600: Turn 'r600_shader_key' struct into union
> 
> we were accessing key fields that might be aliased in the union
> with other fields, so we should check what shader type we are
> compiling for before using key values from it.
> 
> v1.1: make it compile
> v2: have caffiene, make it work - we don't set type
> until later, so don't reference it until we've set it.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/drivers/r600/r600_shader.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c
> b/src/gallium/drivers/r600/r600_shader.c
> index 78904da..f2c9e16 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -143,7 +143,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
>  	bool dump = r600_can_dump_shader(&rctx->screen->b, sel->tokens);
>  	unsigned use_sb = !(rctx->screen->b.debug_flags & DBG_NO_SB);
>  	unsigned sb_disasm = use_sb || (rctx->screen->b.debug_flags & DBG_SB_DISASM);
> -       unsigned export_shader = key.vs.as_es;
> +       unsigned export_shader;
>  
>  	shader->shader.bc.isa = rctx->isa;
>  
> @@ -224,6 +224,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
>  		}
>  		break;
>  	case TGSI_PROCESSOR_VERTEX:
> +               export_shader = key.vs.as_es;
>  		if (rctx->b.chip_class >= EVERGREEN) {
>  			if (export_shader)
>  				evergreen_update_es_state(ctx, shader);
> @@ -1901,8 +1902,6 @@ static int r600_shader_from_tgsi(struct
> r600_context *rctx,
>  	ctx.shader = shader;
>  	ctx.native_integers = true;
>  
> -       shader->vs_as_gs_a = key.vs.as_gs_a;
> -       shader->vs_as_es = key.vs.as_es;
>  
>  	r600_bytecode_init(ctx.bc, rscreen->b.chip_class, rscreen->b.family,
>  			   rscreen->has_compressed_msaa_texturing);
> @@ -1918,9 +1917,14 @@ static int r600_shader_from_tgsi(struct
> r600_context *rctx,
>  	shader->processor_type = ctx.type;
>  	ctx.bc->type = shader->processor_type;
>  
> -       ring_outputs = key.vs.as_es || (ctx.type ==
> TGSI_PROCESSOR_GEOMETRY);
> +       if (ctx.type == TGSI_PROCESSOR_VERTEX) {
> +               shader->vs_as_gs_a = key.vs.as_gs_a;
> +               shader->vs_as_es = key.vs.as_es;
> +       }
> +
> +       ring_outputs = shader->vs_as_es || ctx.type ==
> TGSI_PROCESSOR_GEOMETRY;
>  
> -       if (key.vs.as_es) {
> +       if (shader->vs_as_es) {
>  		ctx.gs_for_vs = &rctx->gs_shader->current->shader;
>  	} else {
>  		ctx.gs_for_vs = NULL;
> @@ -1941,7 +1945,8 @@ static int r600_shader_from_tgsi(struct
> r600_context *rctx,
>  	shader->nr_ps_color_exports = 0;
>  	shader->nr_ps_max_color_exports = 0;
>  
> -       shader->two_side = key.ps.color_two_side;
> +       if (ctx.type == TGSI_PROCESSOR_FRAGMENT)
> +               shader->two_side = key.ps.color_two_side;
>  
>  	/* register allocations */
>  	/* Values [0,127] correspond to GPR[0..127].
> @@ -2327,7 +2332,7 @@ static int r600_shader_from_tgsi(struct
> r600_context *rctx,
>  	convert_edgeflag_to_int(&ctx);
>  
>  	if (ring_outputs) {
> -               if (key.vs.as_es) {
> +               if (shader->vs_as_es) {
>  			ctx.gs_export_gpr_tregs[0] = r600_get_temp(&ctx);
>  			ctx.gs_export_gpr_tregs[1] = -1;
>  			ctx.gs_export_gpr_tregs[2] = -1;
> -- 
> 2.4.3
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list