]> 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 a81d80ae378ca457adb70817474109b3d3fc10c3..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)
@@ -226,15 +228,24 @@ 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);
 }
 
 Program::LayoutHash Program::compute_layout_hash(const vector<const UniformInfo *> &uniforms)
@@ -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