]> git.tdb.fi Git - libs/gl.git/commitdiff
Keep uniform blocks sorted by their hashed name
authorMikko Rasa <tdb@tdb.fi>
Sun, 16 Jul 2023 15:03:33 +0000 (18:03 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 16 Jul 2023 23:15:44 +0000 (02:15 +0300)
source/backends/opengl/program_backend.cpp
source/core/program.cpp
source/core/reflectdata.h

index 279d857f81f5ede2bd818217252602e2812f4857..6f7e41cc005fa6913e839a99efc639c4870fec7e 100644 (file)
@@ -199,6 +199,13 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map<string, int
                        }
                }
        }
+
+       sort_member(rd.uniform_blocks, &ReflectData::UniformBlockInfo::tag);
+       for(ReflectData::UniformBlockInfo &b: rd.uniform_blocks)
+               for(const ReflectData::UniformInfo *u: b.uniforms)
+                       const_cast<ReflectData::UniformInfo *>(u)->block = &b;
+
+       rd.update_layout_hash();
 }
 
 void OpenGLProgram::compile_glsl_stage(const GlslModule &mod, unsigned stage_id)
@@ -361,7 +368,6 @@ void OpenGLProgram::query_uniforms()
 
        default_block.sort_uniforms();
        default_block.update_layout_hash();
-       rd.update_layout_hash();
 }
 
 void OpenGLProgram::query_uniform_blocks(const vector<ReflectData::UniformInfo *> &uniforms_by_index)
@@ -379,7 +385,7 @@ void OpenGLProgram::query_uniform_blocks(const vector<ReflectData::UniformInfo *
                glGetActiveUniformBlockName(id, i, sizeof(name), &len, name);
                rd.uniform_blocks.emplace_back();
                ReflectData::UniformBlockInfo &info = rd.uniform_blocks.back();
-               info.name = name;
+               info.tag = info.name = name;
 
                int value;
                glGetActiveUniformBlockiv(id, i, GL_UNIFORM_BLOCK_DATA_SIZE, &value);
@@ -470,7 +476,7 @@ void OpenGLProgram::finalize_uniforms()
 {
        ReflectData &rd = static_cast<Program *>(this)->reflect_data;
 
-       auto i = find_if(rd.uniform_blocks, [](const ReflectData::UniformBlockInfo &b){ return b.bind_point<0; });
+       auto i = find_member(rd.uniform_blocks, static_cast<int>(ReflectData::DEFAULT_BLOCK), &ReflectData::UniformBlockInfo::bind_point);
        if(i!=rd.uniform_blocks.end() && !i->uniforms.empty())
        {
                for(const ReflectData::UniformInfo *u: i->uniforms)
index 91f215651b57df64b834315c13aa89b86d57d546..d678faca25366c492e8f67d85e0b2d04fd704d79 100644 (file)
@@ -84,7 +84,7 @@ void Program::collect_uniforms(const SpirVModule &mod)
                {
                        reflect_data.uniform_blocks.emplace_back();
                        ReflectData::UniformBlockInfo &info = reflect_data.uniform_blocks.back();
-                       info.name = v.struct_type->name;
+                       info.tag = info.name = v.struct_type->name;
                        info.data_size = v.struct_type->size;
                        if(v.storage==SpirVModule::PUSH_CONSTANT)
                        {
@@ -138,12 +138,16 @@ void Program::collect_uniforms(const SpirVModule &mod)
                        // The element is already known to be present
                        ReflectData::UniformInfo &uni = *lower_bound_member(reflect_data.uniforms, Tag(n), &ReflectData::UniformInfo::tag);
                        block.uniforms.push_back(&uni);
-                       uni.block = &block;
                }
                block.sort_uniforms();
                block.update_layout_hash();
        }
 
+       sort_member(reflect_data.uniform_blocks, &ReflectData::UniformBlockInfo::tag);
+       for(ReflectData::UniformBlockInfo &b: reflect_data.uniform_blocks)
+               for(const ReflectData::UniformInfo *u: b.uniforms)
+                       const_cast<ReflectData::UniformInfo *>(u)->block = &b;
+
        reflect_data.update_layout_hash();
 }
 
index 981f45f000f7b02d926af39d64dd19efaf990508..215b01e9a00157822cef4cbc78c6775a82b42651 100644 (file)
@@ -48,6 +48,7 @@ struct ReflectData
                unsigned data_size = 0;
                int bind_point = DEFAULT_BLOCK;
                std::vector<const UniformInfo *> uniforms;
+               Tag tag;
                LayoutHash layout_hash = 0;
 
                void sort_uniforms();