From c585c065b7831eb6ae05e48edc36953d2534db2b Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 11 Apr 2022 14:35:16 +0300 Subject: [PATCH] Preparatory refactoring of the texelFetch implementation --- source/glsl/spirv.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index f8b36b26..61e59378 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -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) -- 2.45.2