]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/module.cpp
Fix handling of constants in Spir-V reflection
[libs/gl.git] / source / core / module.cpp
index 15bd750cf0b299bd7ea8440ed6d0be5adc3788d1..116c6241a184d321b6408122713873b16657412e 100644 (file)
@@ -96,41 +96,6 @@ void GlslModule::compile(SL::Compiler &compiler)
 }
 
 
-SpirVModule::SpirVModule(const SpirVModule &other):
-       code(other.code),
-       entry_points(other.entry_points),
-       structs(other.structs),
-       variables(other.variables)
-{
-       remap_pointers_from(other);
-}
-
-SpirVModule &SpirVModule::operator=(const SpirVModule &other)
-{
-       code = other.code;
-       entry_points = other.entry_points;
-       structs = other.structs;
-       variables = other.variables;
-       remap_pointers_from(other);
-       return *this;
-}
-
-void SpirVModule::remap_pointers_from(const SpirVModule &other)
-{
-       for(EntryPoint &e: entry_points)
-               for(const Variable *&v: e.globals)
-                       v = &variables[v-&other.variables.front()];
-
-       for(Variable &v: variables)
-               if(v.struct_type)
-                       v.struct_type = &structs[v.struct_type-&other.structs.front()];
-
-       for(Structure &s: structs)
-               for(StructMember &m: s.members)
-                       if(m.struct_type)
-                               m.struct_type = &structs[m.struct_type-&other.structs.front()];
-}
-
 void SpirVModule::load_code(IO::Base &io)
 {
        uint32_t buffer[1024];
@@ -411,7 +376,7 @@ void SpirVModule::Reflection::reflect_image_type(CodeIterator op)
        unsigned dimensions = *(op+3);
        bool depth = *(op+4)==1;
        bool array = *(op+5);
-       type.type = static_cast<DataType>((depth*0x200000) | (array*0x80000) | (dimensions+1) | sample);
+       type.type = static_cast<DataType>((depth*0x200000) | (array*0x80000) | ((dimensions+1)<<16) | sample);
 }
 
 void SpirVModule::Reflection::reflect_sampled_image_type(CodeIterator op)
@@ -463,13 +428,14 @@ void SpirVModule::Reflection::reflect_pointer_type(CodeIterator op)
 
 void SpirVModule::Reflection::reflect_constant(CodeIterator op)
 {
+       unsigned opcode = get_opcode(*op);
        unsigned id = *(op+2);
        Constant &cnst = constants[id];
        cnst.name = names[id];
        cnst.type = types[*(op+1)].type;
-       if(*op==OP_CONSTANT_TRUE || *op==OP_SPEC_CONSTANT_TRUE)
+       if(opcode==OP_CONSTANT_TRUE || opcode==OP_SPEC_CONSTANT_TRUE)
                cnst.i_value = true;
-       else if(*op==OP_CONSTANT_FALSE || *op==OP_SPEC_CONSTANT_FALSE)
+       else if(opcode==OP_CONSTANT_FALSE || opcode==OP_SPEC_CONSTANT_FALSE)
                cnst.i_value = false;
        else if(cnst.type==INT || cnst.type==UNSIGNED_INT)
                cnst.i_value = *(op+3);