Extend the following functions to support the type qualifiers added by the
extension:
  - apply_type_qualifier_to_variable()
  - ast_declarator_list::hir()
---
 src/glsl/ast_to_hir.cpp |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 15e1afc..6e80e96 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1813,6 +1813,31 @@ apply_type_qualifier_to_variable(const struct 
ast_type_qualifier *qual,
       }
    }
 
+   // Layout qualifiers enabled by AMD_conservative_depth.
+   var->depth_any = qual->flags.q.depth_any;
+   var->depth_greater = qual->flags.q.depth_greater;
+   var->depth_less = qual->flags.q.depth_less;
+   var->depth_unchanged = qual->flags.q.depth_unchanged;
+   {
+       int count = var->depth_any
+               + var->depth_greater
+               + var->depth_less
+               + var->depth_unchanged;
+       if (count > 0 && !state->AMD_conservative_depth_enable) {
+           _mesa_glsl_error(loc, state,
+                   "Extension GL_AMD_conservative_depth must be enabled to "
+                   "use depth layout qualifiers");
+       } else if (count > 0 && strcmp(var->name, "gl_FragDepth") != 0) {
+           _mesa_glsl_error(loc, state,
+                   "depth layout qualifiers can be applied only to "
+                    "gl_FragDepth");
+       } else if (count > 1 && strcmp(var->name, "gl_FragDepth") == 0) {
+           _mesa_glsl_error(loc, state,
+                   "At most one depth layout qualifier can be applied to "
+                   "gl_FragDepth");
+       }
+   }
+
    if (var->type->is_array() && state->language_version != 110) {
       var->array_lvalue = true;
    }
@@ -2219,6 +2244,16 @@ ast_declarator_list::hir(exec_list *instructions,
             */
            earlier->origin_upper_left = var->origin_upper_left;
            earlier->pixel_center_integer = var->pixel_center_integer;
+        } else if (state->AMD_conservative_depth_enable
+                   && strcmp(var->name, "gl_FragDepth") == 0
+                   && earlier->type == var->type
+                   && earlier->mode == var->mode) {
+            /* Allow redeclaration of gl_FragDepth for AMD_conservative_depth
+             * qualifiers. */
+            earlier->depth_any = var->depth_any;
+            earlier->depth_greater = var->depth_greater;
+            earlier->depth_less = var->depth_less;
+            earlier->depth_unchanged = var->depth_unchanged;
         } else {
            YYLTYPE loc = this->get_location();
            _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);
-- 
1.7.1

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

Reply via email to