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;
}
}
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")
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);
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);
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)
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)
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);
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);