From f7f31e3d4a04aea34383b34e8de2afe0b2dd26c1 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 16 Jul 2023 18:03:33 +0300 Subject: [PATCH] Keep uniform blocks sorted by their hashed name --- source/backends/opengl/program_backend.cpp | 12 +++++++++--- source/core/program.cpp | 8 ++++++-- source/core/reflectdata.h | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/source/backends/opengl/program_backend.cpp b/source/backends/opengl/program_backend.cpp index 279d857f..6f7e41cc 100644 --- a/source/backends/opengl/program_backend.cpp +++ b/source/backends/opengl/program_backend.cpp @@ -199,6 +199,13 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map(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 &uniforms_by_index) @@ -379,7 +385,7 @@ void OpenGLProgram::query_uniform_blocks(const vector(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(ReflectData::DEFAULT_BLOCK), &ReflectData::UniformBlockInfo::bind_point); if(i!=rd.uniform_blocks.end() && !i->uniforms.empty()) { for(const ReflectData::UniformInfo *u: i->uniforms) diff --git a/source/core/program.cpp b/source/core/program.cpp index 91f21565..d678faca 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -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.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(u)->block = &b; + reflect_data.update_layout_hash(); } diff --git a/source/core/reflectdata.h b/source/core/reflectdata.h index 981f45f0..215b01e9 100644 --- a/source/core/reflectdata.h +++ b/source/core/reflectdata.h @@ -48,6 +48,7 @@ struct ReflectData unsigned data_size = 0; int bind_point = DEFAULT_BLOCK; std::vector uniforms; + Tag tag; LayoutHash layout_hash = 0; void sort_uniforms(); -- 2.45.2