]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Avoid emitting duplicate specialization constants in SPIR-V
[libs/gl.git] / source / glsl / spirv.cpp
index 40e731fe63fa9fcfb384dd61baf8429e34be3382..7f0d0b702d1ba3c75d2e3465308dc090bc83e6a0 100644 (file)
@@ -1591,6 +1591,12 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                        throw internal_error("const variable without initializer");
 
                int spec_id = get_layout_value(var.layout.get(), "constant_id");
+               Id *spec_var_id = (spec_id>=0 ? &declared_spec_ids[spec_id] : 0);
+               if(spec_id>=0 && *spec_var_id)
+               {
+                       insert_unique(declared_ids, &var, Declaration(*spec_var_id, type_id));
+                       return;
+               }
 
                SetFlag set_const(constant_expression);
                SetFlag set_spec(spec_constant, spec_id>=0);
@@ -1598,7 +1604,11 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                var.init_expression->visit(*this);
                var_id = r_expression_result_id;
                insert_unique(declared_ids, &var, Declaration(var_id, type_id));
-               writer.write_op_decorate(var_id, DECO_SPEC_ID, spec_id);
+               if(spec_id>=0)
+               {
+                       writer.write_op_decorate(var_id, DECO_SPEC_ID, spec_id);
+                       *spec_var_id = var_id;
+               }
 
                /* It's unclear what should be done if a specialization constant is
                initialized with anything other than a literal.  GLSL doesn't seem to