X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=c6f15614f5c8a56a36c7e7236a1c785f081e0a19;hp=b86734f623365e1724a8ec430d33d0cc5e67fbdf;hb=HEAD;hpb=08d3b5a55fad7439b47fc93d8ba604cbeb7e19ca diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index b86734f6..4dceb971 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -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 void SpirVGenerator::visit_builtin_texture_fetch(FunctionCall &call, const vector &argument_ids) { - const ImageTypeDeclaration &image = dynamic_cast(*call.arguments[0]->type); + ImageTypeDeclaration &image = dynamic_cast(*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(n)) if(!var->interface.empty()) - writer.write(get_id(*n)); + writer.write(allocate_forward_id(*n)); writer.end_op(OP_ENTRY_POINT);