[Mesa-dev] [PATCH 2/6] mesa: set the gl_FragDepth layout in the GLSL linker

Ian Romanick idr at freedesktop.org
Fri Nov 18 12:44:05 PST 2011


On 11/18/2011 11:27 AM, Marek Olšák wrote:
> ---
>   src/glsl/linker.cpp                        |   45 ++++++++++++++++++++++++++++
>   src/mesa/main/mtypes.h                     |    3 ++
>   src/mesa/program/ir_to_mesa.cpp            |   29 ++++--------------
>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp |   23 --------------
>   4 files changed, 54 insertions(+), 46 deletions(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 0ec773d..226aa6f 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -1876,6 +1876,50 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
>   }
>
>   /**
> + * Store the gl_FragDepth layout in the gl_shader_program struct.
> + */
> +static void
> +store_fragdepth_layout(struct gl_shader_program *prog)
> +{
> +   if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
> +      return;
> +   }
> +
> +   struct exec_list *ir = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir;
> +
> +   foreach_list(node, ir) {
> +      ir_variable *const var = ((ir_instruction *) node)->as_variable();
> +
> +      if (var == NULL || var->mode != ir_var_out) {
> +         continue;
> +      }
> +
> +      if (strcmp(var->name, "gl_FragDepth") == 0) {

It's probably worth explaining why you can't just look up gl_FragDepth 
in the symbol table here.  I was going to suggest changing to that, but 
I managed to convince myself that looping over the IR is correct.

With that small change, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> +         switch (var->depth_layout) {
> +         case ir_depth_layout_none:
> +            prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
> +            return;
> +         case ir_depth_layout_any:
> +            prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
> +            return;
> +         case ir_depth_layout_greater:
> +            prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
> +            return;
> +         case ir_depth_layout_less:
> +            prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
> +            return;
> +         case ir_depth_layout_unchanged:
> +            prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
> +            return;
> +         default:
> +            assert(0);
> +            return;
> +         }
> +      }
> +   }
> +}
> +
> +/**
>    * Validate the resources used by a program versus the implementation limits
>    */
>   static bool
> @@ -2177,6 +2221,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>
>      update_array_sizes(prog);
>      link_assign_uniform_locations(prog);
> +   store_fragdepth_layout(prog);
>
>      if (!check_resources(ctx, prog))
>         goto done;
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 285ec07..b3427da 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2218,6 +2218,9 @@ struct gl_shader_program
>      /** Post-link transform feedback info. */
>      struct gl_transform_feedback_info LinkedTransformFeedback;
>
> +   /** Post-link gl_FragDepth layout for ARB_conservative_depth. */
> +   enum gl_frag_depth_layout FragDepthLayout;
> +
>      /** Geometry shader state - copied into gl_geometry_program at link time */
>      struct {
>         GLint VerticesOut;
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index 5cee837..5a68fc5 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -685,29 +685,6 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
>
>         fp->OriginUpperLeft = ir->origin_upper_left;
>         fp->PixelCenterInteger = ir->pixel_center_integer;
> -
> -   } else if (strcmp(ir->name, "gl_FragDepth") == 0) {
> -      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
> -      switch (ir->depth_layout) {
> -      case ir_depth_layout_none:
> -	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
> -	 break;
> -      case ir_depth_layout_any:
> -	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
> -	 break;
> -      case ir_depth_layout_greater:
> -	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
> -	 break;
> -      case ir_depth_layout_less:
> -	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
> -	 break;
> -      case ir_depth_layout_unchanged:
> -	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
> -	 break;
> -      default:
> -	 assert(0);
> -	 break;
> -      }
>      }
>
>      if (ir->mode == ir_var_uniform&&  strncmp(ir->name, "gl_", 3) == 0) {
> @@ -3222,6 +3199,12 @@ get_mesa_program(struct gl_context *ctx,
>      do_set_program_inouts(shader->ir, prog, shader->Type == GL_FRAGMENT_SHADER);
>      count_resources(prog);
>
> +   /* Set the gl_FragDepth layout. */
> +   if (target == GL_FRAGMENT_PROGRAM_ARB) {
> +      struct gl_fragment_program *fp = (struct gl_fragment_program *)prog;
> +      fp->FragDepthLayout = shader_program->FragDepthLayout;
> +   }
> +
>      _mesa_reference_program(ctx,&shader->Program, prog);
>
>      if ((ctx->Shader.Flags&  GLSL_NO_OPT) == 0) {
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 0bf6766..929c7af 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -1017,29 +1017,6 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
>
>         fp->OriginUpperLeft = ir->origin_upper_left;
>         fp->PixelCenterInteger = ir->pixel_center_integer;
> -
> -   } else if (strcmp(ir->name, "gl_FragDepth") == 0) {
> -      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
> -      switch (ir->depth_layout) {
> -      case ir_depth_layout_none:
> -         fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
> -         break;
> -      case ir_depth_layout_any:
> -         fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
> -         break;
> -      case ir_depth_layout_greater:
> -         fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
> -         break;
> -      case ir_depth_layout_less:
> -         fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
> -         break;
> -      case ir_depth_layout_unchanged:
> -         fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
> -         break;
> -      default:
> -         assert(0);
> -         break;
> -      }
>      }
>
>      if (ir->mode == ir_var_uniform&&  strncmp(ir->name, "gl_", 3) == 0) {


More information about the mesa-dev mailing list