X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=13c58a695ab3668d9c0a605ce679f1d00565a997;hb=e98188ff6c9bba9761b71f2a69f3be7eb89ba3da;hp=40e731fe63fa9fcfb384dd61baf8429e34be3382;hpb=efbce87192ce73ba577684369f759693dccec67c;p=libs%2Fgl.git diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index 40e731fe..13c58a69 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -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,12 +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); - - /* It's unclear what should be done if a specialization constant is - initialized with anything other than a literal. GLSL doesn't seem to - prohibit that but SPIR-V says OpSpecConstantOp can't be updated via - specialization. */ + if(spec_id>=0) + { + writer.write_op_decorate(var_id, DECO_SPEC_ID, spec_id); + *spec_var_id = var_id; + } } else {