From a439d33b0f6266d6748359d5476b4f72be513dec Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 22 Jun 2022 18:03:04 +0300 Subject: [PATCH] Support setting uniform block indices in gfx::program --- libs/gfx/include/psemek/gfx/program.hpp | 5 ++++ libs/gfx/source/program.cpp | 33 ++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/libs/gfx/include/psemek/gfx/program.hpp b/libs/gfx/include/psemek/gfx/program.hpp index 3c30644f..f4f21aee 100644 --- a/libs/gfx/include/psemek/gfx/program.hpp +++ b/libs/gfx/include/psemek/gfx/program.hpp @@ -115,9 +115,14 @@ namespace psemek::gfx uniform_proxy operator[] (std::string_view name) const; uniform_proxy operator[] (GLint location) const; + GLuint uniform_block_index(std::string_view name) const; + void uniform_block_binding(std::string_view name, GLuint binding) const; + void uniform_block_binding(GLuint index, GLuint binding) const; + private: GLuint program_; mutable boost::container::flat_map> uniforms_; + mutable boost::container::flat_map> uniform_blocks_; program(std::nullptr_t) : program_{0} diff --git a/libs/gfx/source/program.cpp b/libs/gfx/source/program.cpp index 4291e4d8..7401a8cb 100644 --- a/libs/gfx/source/program.cpp +++ b/libs/gfx/source/program.cpp @@ -374,10 +374,10 @@ namespace psemek::gfx auto it = uniforms_.find(name); if (it == uniforms_.end()) { - std::string name_str(name.begin(), name.end()); - auto l = gl::GetUniformLocation(program_, name_str.c_str()); - uniforms_[std::move(name_str)] = l; - return l; + std::string name_str(name); + auto location = gl::GetUniformLocation(program_, name_str.data()); + uniforms_[std::move(name_str)] = location; + return location; } return it->second; } @@ -392,4 +392,29 @@ namespace psemek::gfx return {location}; } + GLuint program::uniform_block_index(std::string_view name) const + { + auto it = uniform_blocks_.find(name); + if (it == uniform_blocks_.end()) + { + std::string name_str(name); + auto index = gl::GetUniformBlockIndex(program_, name.data()); + if (index == gl::INVALID_INDEX) + throw std::runtime_error("Unknown uniform block: " + name_str); + uniform_blocks_[std::move(name_str)] = index; + return index; + } + return it->second; + } + + void program::uniform_block_binding(std::string_view name, GLuint binding) const + { + gl::UniformBlockBinding(program_, uniform_block_index(name), binding); + } + + void program::uniform_block_binding(GLuint index, GLuint binding) const + { + gl::UniformBlockBinding(program_, index, binding); + } + }