]> git.tdb.fi Git - libs/gl.git/blobdiff - source/program.cpp
Rework ProgramData to do less unnecessary work
[libs/gl.git] / source / program.cpp
index e16776f8f53f078a2ae53c39b482326a9e8b16cc..a4358acb4d6d74e048c1c416107540f4fb9bdce9 100644 (file)
@@ -157,6 +157,8 @@ void Program::link()
 
        if(ARB_uniform_buffer_object)
        {
+               uniform_blocks.clear();
+
                std::set<unsigned> used_bind_points;
                count = get_program_i(id, GL_ACTIVE_UNIFORM_BLOCKS);
                for(unsigned i=0; i<count; ++i)
@@ -196,7 +198,7 @@ void Program::link()
                        {
                                glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_ARRAY_STRIDE, &values[0]);
                                for(unsigned j=0; j<indices2.size(); ++j)
-                                       uniforms_by_index[indices[j]]->array_stride = values[j];
+                                       uniforms_by_index[indices2[j]]->array_stride = values[j];
                        }
 
                        indices2.clear();
@@ -212,7 +214,7 @@ void Program::link()
                        {
                                glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_MATRIX_STRIDE, &values[0]);
                                for(unsigned j=0; j<indices2.size(); ++j)
-                                       uniforms_by_index[indices[j]]->matrix_stride = values[j];
+                                       uniforms_by_index[indices2[j]]->matrix_stride = values[j];
                        }
 
                        sort(info.uniforms.begin(), info.uniforms.end(), uniform_location_compare);
@@ -226,18 +228,27 @@ void Program::link()
                }
        }
 
-       vector<const UniformInfo *> blockless_uniforms;
+       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)
                {
                        i->second.location = glGetUniformLocation(id, i->second.name.c_str());
-                       blockless_uniforms.push_back(&i->second);
+                       i->second.block = &default_block;
+                       default_block.uniforms.push_back(&i->second);
                }
 
-       uniform_layout_hash = compute_layout_hash(blockless_uniforms);
+       default_block.layout_hash = compute_layout_hash(default_block.uniforms);
+
+       string layout_descriptor;
+       for(UniformBlockMap::const_iterator i=uniform_blocks.begin(); i!=uniform_blocks.end(); ++i)
+               layout_descriptor += format("%d:%x\n", i->second.bind_point, i->second.layout_hash);
+       uniform_layout_hash = hash32(layout_descriptor);
 }
 
-unsigned Program::compute_layout_hash(const vector<const UniformInfo *> &uniforms)
+Program::LayoutHash Program::compute_layout_hash(const vector<const UniformInfo *> &uniforms)
 {
        string layout_descriptor;
        for(vector<const UniformInfo *>::const_iterator i = uniforms.begin(); i!=uniforms.end(); ++i)
@@ -285,14 +296,14 @@ int Program::get_uniform_location(const string &n) const
                                add an offset. */
                                unsigned offset = lexical_cast<unsigned>(n.substr(open_bracket+1, n.size()-2-open_bracket));
                                i = uniforms.find(n.substr(0, open_bracket));
-                               if(i!=uniforms.end() && !i->second.block && offset<i->second.size)
+                               if(i!=uniforms.end() && i->second.block->bind_point<0 && offset<i->second.size)
                                        return i->second.location+offset;
                        }
                }
                return -1;
        }
 
-       return i->second.block ? -1 : i->second.location;
+       return i->second.block->bind_point<0 ? i->second.location : -1;
 }
 
 void Program::bind() const