i->content.visit(*this);
}
- writer.finalize(next_id);
+ writer.finalize(SPIRV_GENERATOR_MSP, next_id);
}
SpirVGenerator::StorageClass SpirVGenerator::get_interface_storage(const string &iface, bool block)
return result_id;
}
-BasicTypeDeclaration &SpirVGenerator::get_element_type(BasicTypeDeclaration &basic)
-{
- if(basic.kind==BasicTypeDeclaration::BOOL || basic.kind==BasicTypeDeclaration::INT || basic.kind==BasicTypeDeclaration::FLOAT)
- return basic;
- else if((basic.kind==BasicTypeDeclaration::VECTOR || basic.kind==BasicTypeDeclaration::MATRIX) && basic.base_type)
- return get_element_type(dynamic_cast<BasicTypeDeclaration &>(*basic.base_type));
- else
- throw invalid_argument("SpirVGenerator::get_element_type");
-}
-
void SpirVGenerator::visit(Block &block)
{
for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
return;
BasicTypeDeclaration &basic = dynamic_cast<BasicTypeDeclaration &>(*unary.expression->type);
- BasicTypeDeclaration &elem = get_element_type(basic);
+ BasicTypeDeclaration &elem = *get_element_type(basic);
if(constant_expression && elem.kind!=BasicTypeDeclaration::BOOL && elem.kind!=BasicTypeDeclaration::INT)
/* SPIR-V allows constant operations on floating-point values only for
BasicTypeDeclaration &basic_left = dynamic_cast<BasicTypeDeclaration &>(*binary.left->type);
BasicTypeDeclaration &basic_right = dynamic_cast<BasicTypeDeclaration &>(*binary.right->type);
// Expression resolver ensures that element types are the same
- BasicTypeDeclaration &elem = get_element_type(basic_left);
+ BasicTypeDeclaration &elem = *get_element_type(basic_left);
if(constant_expression && elem.kind!=BasicTypeDeclaration::BOOL && elem.kind!=BasicTypeDeclaration::INT)
/* SPIR-V allows constant operations on floating-point values only for
for(NodeArray<Expression>::const_iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
if(BasicTypeDeclaration *basic_arg = dynamic_cast<BasicTypeDeclaration *>((*i)->type))
{
- BasicTypeDeclaration &elem_arg = get_element_type(*basic_arg);
+ BasicTypeDeclaration &elem_arg = *get_element_type(*basic_arg);
switch(elem_arg.kind)
{
case BasicTypeDeclaration::BOOL: arg_types += 'b'; break;
return;
}
- BasicTypeDeclaration &elem = get_element_type(*basic);
+ BasicTypeDeclaration &elem = *get_element_type(*basic);
BasicTypeDeclaration &basic_arg0 = dynamic_cast<BasicTypeDeclaration &>(*call.arguments[0]->type);
- BasicTypeDeclaration &elem_arg0 = get_element_type(basic_arg0);
+ BasicTypeDeclaration &elem_arg0 = *get_element_type(basic_arg0);
if(basic->kind==BasicTypeDeclaration::MATRIX)
{