]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/program.cpp
Clear all maps before linking the Program
[libs/gl.git] / source / core / program.cpp
index 23069392a78727b544e9a6dcb7f26a4f3ddf4066..9c2968497f302ccad397ea311be277da98d683e5 100644 (file)
@@ -277,6 +277,8 @@ void Program::link()
                throw invalid_operation("Program::link");
 
        uniforms.clear();
+       uniform_blocks.clear();
+       attributes.clear();
 
        glLinkProgram(id);
        linked = get_program_i(id, GL_LINK_STATUS);
@@ -331,11 +333,8 @@ void Program::query_uniforms()
                                name[len-3] = 0;
 
                        UniformInfo &info = uniforms[name];
-                       info.block = 0;
                        info.name = name;
                        info.array_size = size;
-                       info.array_stride = 0;
-                       info.matrix_stride = 0;
                        info.type = from_gl_type(type);
                        uniforms_by_index[i] = &info;
                }
@@ -345,8 +344,6 @@ void Program::query_uniforms()
                query_uniform_blocks(uniforms_by_index);
 
        UniformBlockInfo &default_block = uniform_blocks[string()];
-       default_block.data_size = 0;
-       default_block.bind_point = -1;
 
        for(UniformMap::iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
                if(!i->second.block)
@@ -363,8 +360,6 @@ void Program::query_uniforms()
 
 void Program::query_uniform_blocks(const vector<UniformInfo *> &uniforms_by_index)
 {
-       uniform_blocks.clear();
-
        std::set<unsigned> used_bind_points;
        unsigned count = get_program_i(id, GL_ACTIVE_UNIFORM_BLOCKS);
        for(unsigned i=0; i<count; ++i)
@@ -461,8 +456,6 @@ void Program::collect_uniforms()
        const SpirVModule &mod = static_cast<const SpirVModule &>(*module);
 
        UniformBlockInfo &default_block = uniform_blocks[string()];
-       default_block.data_size = 0;
-       default_block.bind_point = -1;
 
        const vector<SpirVModule::Variable> &variables = mod.get_variables();
        for(vector<SpirVModule::Variable>::const_iterator i=variables.begin(); i!=variables.end(); ++i)
@@ -488,8 +481,6 @@ void Program::collect_uniforms()
                        info.block = &default_block;
                        info.location = i->location;
                        info.array_size = i->array_size;
-                       info.array_stride = 0;
-                       info.matrix_stride = 0;
                        info.type = i->type;
                        default_block.uniforms.push_back(&info);
                }
@@ -635,6 +626,30 @@ void Program::unbind()
 }
 
 
+Program::UniformInfo::UniformInfo():
+       block(0),
+       location(0),
+       array_size(0),
+       array_stride(0),
+       matrix_stride(0),
+       type(VOID)
+{ }
+
+
+Program::UniformBlockInfo::UniformBlockInfo():
+       data_size(0),
+       bind_point(-1),
+       layout_hash(0)
+{ }
+
+
+Program::AttributeInfo::AttributeInfo():
+       location(-1),
+       array_size(0),
+       type(VOID)
+{ }
+
+
 Program::Loader::Loader(Program &p, Collection &c):
        DataFile::CollectionObjectLoader<Program>(p, &c)
 {