}
}
- for(map<unsigned, SpecConstant>::const_iterator i=reflection.spec_constants.begin(); i!=reflection.spec_constants.end(); ++i)
- spec_constants.push_back(i->second);
+ for(map<unsigned, Constant>::const_iterator i=reflection.constants.begin(); i!=reflection.constants.end(); ++i)
+ if(i->second->constant_id>=0)
+ spec_constants.push_back(i->second);
}
case OP_TYPE_ARRAY: reflect_array_type(op); break;
case OP_TYPE_STRUCT: reflect_struct_type(op); break;
case OP_TYPE_POINTER: reflect_pointer_type(op); break;
- case OP_CONSTANT_TRUE: constants[*(op+2)] = true; break;
- case OP_CONSTANT_FALSE: constants[*(op+2)] = false; break;
- case OP_CONSTANT: reflect_constant(op); break;
+ case OP_CONSTANT_TRUE:
+ case OP_CONSTANT_FALSE:
+ case OP_CONSTANT:
case OP_SPEC_CONSTANT_TRUE:
case OP_SPEC_CONSTANT_FALSE:
- case OP_SPEC_CONSTANT: reflect_spec_constant(op); break;
+ case OP_SPEC_CONSTANT: reflect_constant(op); break;
case OP_VARIABLE: reflect_variable(op); break;
case OP_DECORATE: reflect_decorate(op); break;
case OP_MEMBER_DECORATE: reflect_member_decorate(op); break;
const TypeInfo &elem = types[*(op+2)];
type.type = elem.type;
type.struct_type = elem.struct_type;
- const Variant &size = constants[*(op+3)];
- if(size.check_type<int>())
- type.array_size = size.value<int>();
- else if(size.check_type<unsigned>())
- type.array_size = size.value<unsigned>();
+
+ const Constant &size = constants[*(op+3)];
+ if(size.type==INT || size.type==UNSIGNED_INT)
+ type.array_size = size.i_value;
}
void SpirVModule::Reflection::reflect_struct_type(CodeIterator op)
}
void SpirVModule::Reflection::reflect_constant(CodeIterator op)
-{
- const TypeInfo &type = types[*(op+1)];
- unsigned id = *(op+2);
- if(type.type==INT)
- constants[id] = static_cast<int>(*(op+3));
- else if(type.type==UNSIGNED_INT)
- constants[id] = static_cast<unsigned>(*(op+3));
- else if(type.type==FLOAT)
- constants[id] = *reinterpret_cast<const float *>(&*(op+3));
-}
-
-void SpirVModule::Reflection::reflect_spec_constant(CodeIterator op)
{
unsigned id = *(op+2);
- SpecConstant &spec = spec_constants[id];
- spec.name = names[id];
- spec.type = types[*(op+1)].type;
+ Constant &cnst = constants[id];
+ cnst.name = names[id];
+ cnst.type = types[*(op+1)].type;
+ if(*op==OP_CONSTANT_TRUE || *op==OP_SPEC_CONSTANT_TRUE)
+ cnst.i_value = true;
+ else if(*op==OP_CONSTANT_FALSE || *op==OP_SPEC_CONSTANT_FALSE)
+ cnst.i_value = false;
+ else if(cnst.type==INT || cnst.type==UNSIGNED_INT)
+ cnst.i_value = *(op+3);
+ else if(cnst.type==FLOAT)
+ cnst.f_value = *reinterpret_cast<const float *>(&*(op+3));
}
void SpirVModule::Reflection::reflect_variable(CodeIterator op)
switch(decoration)
{
case DECO_SPEC_ID:
- spec_constants[id].constant_id = *op;
+ constants[id].constant_id = *op;
break;
case DECO_ARRAY_STRIDE:
types[id].array_stride = *op;