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
--- 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) {
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to