[Mesa-dev] [PATCH 2/5] glsl: Add redeclation flag to ir_variable.

Fabian Bieler fabianbieler at fastmail.fm
Wed May 8 15:50:58 PDT 2013


It is illegal to redeclare builtin variables with incompatible layout
qualifiers in seprerate shader objects that are linked together. Since a
redeclaration without any layout qualifiers can be incompatible with another
redeclartion where no redeclaration wouldn't be, it can be necessary to know
wether a variable was redeclared.
---
 src/glsl/ast_to_hir.cpp | 1 +
 src/glsl/ir.cpp         | 1 +
 src/glsl/ir.h           | 7 +++++++
 src/glsl/ir_clone.cpp   | 1 +
 4 files changed, 10 insertions(+)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 9ef73b5..63fbd5a 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2271,6 +2271,7 @@ get_variable_being_redeclared(ir_variable *var, ast_declaration *decl,
       _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);
    }
 
+   earlier->redeclared = true;
    return earlier;
 }
 
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 2c54525..c535c5e 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1536,6 +1536,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
    this->pixel_center_integer = false;
    this->depth_layout = ir_depth_layout_none;
    this->used = false;
+   this->redeclared = false;
 
    if (type && type->base_type == GLSL_TYPE_SAMPLER)
       this->read_only = true;
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 6783eca..fae0c30 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -415,6 +415,13 @@ public:
    unsigned invariant:1;
 
    /**
+    * Was this variable redeclared?
+    *
+    * This is only maintained in the ast_to_hir.cpp path.
+    */
+   unsigned redeclared:1;
+
+   /**
     * Has this variable been used for reading or writing?
     *
     * Several GLSL semantic checks require knowledge of whether or not a
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index 5b42935..2abf62f 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -47,6 +47,7 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
    var->read_only = this->read_only;
    var->centroid = this->centroid;
    var->invariant = this->invariant;
+   var->redeclared = this->redeclared;
    var->interpolation = this->interpolation;
    var->location = this->location;
    var->index = this->index;
-- 
1.8.1.2



More information about the mesa-dev mailing list