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

Ian Romanick idr at freedesktop.org
Fri Nov 18 14:57:13 PST 2011


On 11/18/2011 01:33 PM, Marek Olšák wrote:
> On Fri, Nov 18, 2011 at 9:44 PM, Ian Romanick<idr at freedesktop.org>  wrote:
>> 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.
>
> The reason is I didn't know there is actually any other way to look up
> a variable than walking over the IR. You might have been right that I
> should have used the look-up you are talking about.

If gl_FragDepth is not used in the shader, it will be removed from the 
IR.  However, it won't be removed from the symbol table.  I had a couple 
patches a month or two ago related to this issue.  See 7bbcc0b.  I'd 
swear that there was another patch around that same time, but I don't 
see it.

> Marek
>
>>
>> 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