]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Use emplace_back when a new object is being constructed
[libs/gl.git] / source / glsl / spirv.cpp
index 40e731fe63fa9fcfb384dd61baf8429e34be3382..7f99ebb3d9ecc61b737739542feed5a72994633f 100644 (file)
@@ -135,8 +135,9 @@ SpirVGenerator::SpirVGenerator():
        writer(content)
 { }
 
-void SpirVGenerator::apply(Module &module)
+void SpirVGenerator::apply(Module &module, const Features &f)
 {
+       features = f;
        use_capability(CAP_SHADER);
 
        for(Stage &s: module.stages)
@@ -1591,6 +1592,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 +1605,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
        {
@@ -1740,7 +1746,10 @@ void SpirVGenerator::visit_entry_point(FunctionDeclaration &func, Id func_id)
        writer.end_op(OP_ENTRY_POINT);
 
        if(stage->type==Stage::FRAGMENT)
-               writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_ORIGIN_LOWER_LEFT);
+       {
+               SpirVExecutionMode origin = (features.target_api==VULKAN ? EXEC_ORIGIN_UPPER_LEFT : EXEC_ORIGIN_LOWER_LEFT);
+               writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, origin);
+       }
        else if(stage->type==Stage::GEOMETRY)
                use_capability(CAP_GEOMETRY);