]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Use forward references for entry point interfaces in SPIR-V
[libs/gl.git] / source / glsl / spirv.cpp
index 1fc9799ff6418ee7b153610f47c71465fb53c876..404ffaf3735fe3f575ea62e8c93037095f78a781 100644 (file)
@@ -1605,6 +1605,7 @@ void SpirVGenerator::visit(ImageTypeDeclaration &image)
                return;
 
        Id type_id = allocate_id(image, 0);
+       SpirVFormat format = get_format(image.format);
 
        Id image_id = (image.sampled ? next_id++ : type_id);
        writer.begin_op(content.globals, OP_TYPE_IMAGE, 9);
@@ -1615,7 +1616,7 @@ void SpirVGenerator::visit(ImageTypeDeclaration &image)
        writer.write(image.array);
        writer.write(image.multisample);
        writer.write(image.sampled ? 1 : 2);
-       writer.write(get_format(image.format));
+       writer.write(format);
        writer.end_op(OP_TYPE_IMAGE);
 
        if(image.sampled)
@@ -1632,6 +1633,9 @@ void SpirVGenerator::visit(ImageTypeDeclaration &image)
 
        if(image.multisample && !image.sampled)
                use_capability(CAP_STORAGE_IMAGE_MULTISAMPLE);
+
+       if(format>=FORMAT_RG32F && format<=FORMAT_R8_SNORM)
+               use_capability(CAP_STORAGE_IMAGE_EXTENDED_FORMATS);
 }
 
 void SpirVGenerator::visit(StructDeclaration &strct)
@@ -1828,7 +1832,7 @@ void SpirVGenerator::visit_entry_point(FunctionDeclaration &func, Id func_id)
        for(Node *n: dependencies)
                if(const VariableDeclaration *var = dynamic_cast<const VariableDeclaration *>(n))
                        if(!var->interface.empty())
-                               writer.write(get_id(*n));
+                               writer.write(allocate_forward_id(*n));
 
        writer.end_op(OP_ENTRY_POINT);