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

2011-11-18 Thread Marek Olšák
---
 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) {
+ 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 

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

2011-11-18 Thread Ian Romanick

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.roman...@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
--- 

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

2011-11-18 Thread Kenneth Graunke
On 11/18/2011 12:44 PM, Ian Romanick 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.
 
 With that small change, this patch is
 
 Reviewed-by: Ian Romanick ian.d.roman...@intel.com

Agreed.

Reviewed-by: Kenneth Graunke kenn...@whitecape.org

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


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

2011-11-18 Thread Marek Olšák
On Fri, Nov 18, 2011 at 9:44 PM, Ian Romanick i...@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.

Marek


 With that small change, this patch is

 Reviewed-by: Ian Romanick ian.d.roman...@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 = 

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

2011-11-18 Thread Ian Romanick

On 11/18/2011 01:33 PM, Marek Olšák wrote:

On Fri, Nov 18, 2011 at 9:44 PM, Ian Romanicki...@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 Romanickian.d.roman...@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_uniformstrncmp(ir-name, gl_, 3) == 0) {
@@ -3222,6 +3199,12 @@ get_mesa_program(struct gl_context 

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

2011-11-18 Thread Ian Romanick

On 11/18/2011 01:33 PM, Marek Olšák wrote:

On Fri, Nov 18, 2011 at 9:44 PM, Ian Romanicki...@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 Romanickian.d.roman...@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_uniformstrncmp(ir-name, gl_, 3) == 0) {
@@ -3222,6 +3199,12 @@ get_mesa_program(struct gl_context