void SpirVGenerator::visit_builtin_texel_fetch(FunctionCall &call, const vector<Id> &argument_ids)
{
- if(argument_ids.size()!=3)
- throw internal_error("invalid texelFetch call");
-
const ImageTypeDeclaration &image = dynamic_cast<const ImageTypeDeclaration &>(*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<Id> &argument_ids)