]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / glsl / spirv.cpp
index b86734f623365e1724a8ec430d33d0cc5e67fbdf..4dceb9719a638c8ba6048b1a3509eb5b8555046c 100644 (file)
@@ -917,9 +917,10 @@ void SpirVGenerator::visit(BinaryExpression &binary)
 
                                compare_id = write_construct(bool_vec_type_id, column_ids, n_elems);
                        }
+                       else
+                               throw internal_error("unsupported types for non-scalar equality comparison");
 
-                       if(compare_id)
-                               r_expression_result_id = write_expression(combine_op, result_type_id, compare_id);
+                       r_expression_result_id = write_expression(combine_op, result_type_id, compare_id);
                        return;
                }
        }
@@ -1443,7 +1444,7 @@ void SpirVGenerator::visit_builtin_texture(FunctionCall &call, const vector<Id>
 
 void SpirVGenerator::visit_builtin_texture_fetch(FunctionCall &call, const vector<Id> &argument_ids)
 {
-       const ImageTypeDeclaration &image = dynamic_cast<const ImageTypeDeclaration &>(*call.arguments[0]->type);
+       ImageTypeDeclaration &image = dynamic_cast<ImageTypeDeclaration &>(*call.arguments[0]->type);
 
        Opcode opcode;
        if(call.name=="texelFetch")
@@ -1459,9 +1460,18 @@ void SpirVGenerator::visit_builtin_texture_fetch(FunctionCall &call, const vecto
        if(argument_ids.size()!=2U+need_sample+need_lod)
                throw internal_error("invalid texture fetch call");
 
+       Id image_id;
+       if(image.sampled)
+       {
+               Id image_type_id = get_item(image_type_ids, get_id(image));
+               image_id = write_expression(OP_IMAGE, image_type_id, argument_ids[0]);
+       }
+       else
+               image_id = argument_ids[0];
+
        r_expression_result_id = begin_expression(opcode, get_id(*call.type), 2+(need_lod|need_sample)+need_lod+need_sample);
-       for(unsigned i=0; i<2; ++i)
-               writer.write(argument_ids[i]);
+       writer.write(image_id);
+       writer.write(argument_ids[1]);
        if(need_lod || need_sample)
        {
                writer.write(need_lod*0x02 | need_sample*0x40);
@@ -1596,6 +1606,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);
@@ -1606,7 +1617,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)
@@ -1623,6 +1634,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)
@@ -1781,7 +1795,7 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                        BuiltinSemantic semantic = get_builtin_semantic(var.name);
                        writer.write_op_decorate(var_id, DECO_BUILTIN, semantic);
                }
-               if(var.sampling=="flat")
+               if(var.interpolation=="flat")
                        writer.write_op_decorate(var_id, DECO_FLAT);
                if(var.sampling=="centroid")
                        writer.write_op_decorate(var_id, DECO_CENTROID);
@@ -1819,7 +1833,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);