]> 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 7f0d0b702d1ba3c75d2e3465308dc090bc83e6a0..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)
@@ -1609,11 +1610,6 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                        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
-               prohibit that but SPIR-V says OpSpecConstantOp can't be updated via
-               specialization. */
        }
        else
        {
@@ -1750,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);