diff --git a/libs/gfx/include/psemek/gfx/program.hpp b/libs/gfx/include/psemek/gfx/program.hpp index 1167c097..633210c4 100644 --- a/libs/gfx/include/psemek/gfx/program.hpp +++ b/libs/gfx/include/psemek/gfx/program.hpp @@ -8,7 +8,8 @@ #include #include -#include +#include + #include namespace psemek::gfx @@ -36,7 +37,7 @@ namespace psemek::gfx void reset(); - GLint location(char const * name) const; + GLint location(std::string_view name) const; struct uniform_proxy { @@ -110,11 +111,11 @@ namespace psemek::gfx GLint location_; }; - uniform_proxy operator[] (char const * name) const; + uniform_proxy operator[] (std::string_view name) const; private: GLuint program_; - mutable std::unordered_map uniforms_; + mutable boost::container::flat_map> uniforms_; program(std::nullptr_t) : program_{0} diff --git a/libs/gfx/source/program.cpp b/libs/gfx/source/program.cpp index b4358e48..1bd6a8aa 100644 --- a/libs/gfx/source/program.cpp +++ b/libs/gfx/source/program.cpp @@ -364,19 +364,20 @@ namespace psemek::gfx program_ = 0; } - GLint program::location(char const * name) const + GLint program::location(std::string_view name) const { auto it = uniforms_.find(name); if (it == uniforms_.end()) { - auto l = gl::GetUniformLocation(program_, name); - uniforms_[name] = l; + 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; } return it->second; } - program::uniform_proxy program::operator[] (char const * name) const + program::uniform_proxy program::operator[] (std::string_view name) const { return {location(name)}; }