X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=61e5937856b30d7abc38afc2d5143b03e1ca4b1e;hb=c585c065b7831eb6ae05e48edc36953d2534db2b;hp=61e2d594e6c641105379dfd6c671a82b1991f5fa;hpb=215d5bed27ad3de92557ae1b631695a036d29741;p=libs%2Fgl.git diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index 61e2d594..61e59378 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -1304,7 +1304,7 @@ void SpirVGenerator::visit_builtin_texture_query(FunctionCall &call, const vecto ImageTypeDeclaration &image_arg0 = dynamic_cast(*call.arguments[0]->type); Id image_id; - if(image_arg0.sampled) + if(image_arg0.sampled && opcode!=OP_IMAGE_QUERY_LOD) { Id image_type_id = get_item(image_type_ids, get_id(image_arg0)); image_id = write_expression(OP_IMAGE, image_type_id, argument_ids[0]); @@ -1371,17 +1371,25 @@ void SpirVGenerator::visit_builtin_texture(FunctionCall &call, const vector void SpirVGenerator::visit_builtin_texel_fetch(FunctionCall &call, const vector &argument_ids) { - if(argument_ids.size()!=3) - throw internal_error("invalid texelFetch call"); - const ImageTypeDeclaration &image = dynamic_cast(*call.arguments[0]->type); - r_expression_result_id = begin_expression(OP_IMAGE_FETCH, get_id(*call.type), 4); + Opcode opcode = OP_IMAGE_FETCH; + + bool need_sample = image.multisample; + bool need_lod = !need_sample; + + if(argument_ids.size()!=2U+need_sample+need_lod) + throw internal_error("invalid texture fetch call"); + + 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.multisample ? 0x40 : 0x02); // Sample or Lod - writer.write(argument_ids.back()); - end_expression(OP_IMAGE_FETCH); + if(need_lod || need_sample) + { + writer.write(need_lod*0x02 | need_sample*0x40); + writer.write(argument_ids.back()); + } + end_expression(opcode); } void SpirVGenerator::visit_builtin_interpolate(FunctionCall &call, const vector &argument_ids)