From d84a618d3d724062073fb499dc183e71abccafd9 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 2 Oct 2022 23:44:09 -0500 Subject: [PATCH] Add GlContext base class for MapContext --- scwx-qt/scwx-qt.cmake | 4 +- scwx-qt/source/scwx/qt/gl/gl_context.cpp | 64 ++++++++++++++++++++++ scwx-qt/source/scwx/qt/gl/gl_context.hpp | 39 +++++++++++++ scwx-qt/source/scwx/qt/gl/text_shader.cpp | 8 +-- scwx-qt/source/scwx/qt/gl/text_shader.hpp | 4 +- scwx-qt/source/scwx/qt/map/map_context.cpp | 43 +-------------- scwx-qt/source/scwx/qt/map/map_context.hpp | 10 +--- 7 files changed, 115 insertions(+), 57 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/gl/gl_context.cpp create mode 100644 scwx-qt/source/scwx/qt/gl/gl_context.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index d3c2b421..1c4a0366 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -41,9 +41,11 @@ set(UI_MAIN source/scwx/qt/main/main_window.ui) set(HDR_CONFIG source/scwx/qt/config/radar_site.hpp) set(SRC_CONFIG source/scwx/qt/config/radar_site.cpp) set(HDR_GL source/scwx/qt/gl/gl.hpp + source/scwx/qt/gl/gl_context.hpp source/scwx/qt/gl/shader_program.hpp source/scwx/qt/gl/text_shader.hpp) -set(SRC_GL source/scwx/qt/gl/shader_program.cpp +set(SRC_GL source/scwx/qt/gl/gl_context.cpp + source/scwx/qt/gl/shader_program.cpp source/scwx/qt/gl/text_shader.cpp) set(HDR_GL_DRAW source/scwx/qt/gl/draw/draw_item.hpp source/scwx/qt/gl/draw/geo_line.hpp diff --git a/scwx-qt/source/scwx/qt/gl/gl_context.cpp b/scwx-qt/source/scwx/qt/gl/gl_context.cpp new file mode 100644 index 00000000..3db875a8 --- /dev/null +++ b/scwx-qt/source/scwx/qt/gl/gl_context.cpp @@ -0,0 +1,64 @@ +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace gl +{ + +class GlContext::Impl +{ +public: + explicit Impl() : gl_ {}, shaderProgramMap_ {}, shaderProgramMutex_ {} {} + ~Impl() {} + + gl::OpenGLFunctions gl_; + + std::unordered_map, + std::shared_ptr, + util::hash>> + shaderProgramMap_; + std::mutex shaderProgramMutex_; +}; + +GlContext::GlContext() : p(std::make_unique()) {} +GlContext::~GlContext() = default; + +GlContext::GlContext(GlContext&&) noexcept = default; +GlContext& GlContext::operator=(GlContext&&) noexcept = default; + +gl::OpenGLFunctions& GlContext::gl() +{ + return p->gl_; +} + +std::shared_ptr +GlContext::GetShaderProgram(const std::string& vertexPath, + const std::string& fragmentPath) +{ + const std::pair key {vertexPath, fragmentPath}; + std::shared_ptr shaderProgram; + + std::unique_lock lock(p->shaderProgramMutex_); + + auto it = p->shaderProgramMap_.find(key); + + if (it == p->shaderProgramMap_.end()) + { + shaderProgram = std::make_shared(p->gl_); + shaderProgram->Load(vertexPath, fragmentPath); + p->shaderProgramMap_[key] = shaderProgram; + } + else + { + shaderProgram = it->second; + } + + return shaderProgram; +} + +} // namespace gl +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/gl/gl_context.hpp b/scwx-qt/source/scwx/qt/gl/gl_context.hpp new file mode 100644 index 00000000..cf81262f --- /dev/null +++ b/scwx-qt/source/scwx/qt/gl/gl_context.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace gl +{ + +class GlContext +{ +public: + explicit GlContext(); + virtual ~GlContext(); + + GlContext(const GlContext&) = delete; + GlContext& operator=(const GlContext&) = delete; + + GlContext(GlContext&&) noexcept; + GlContext& operator=(GlContext&&) noexcept; + + gl::OpenGLFunctions& gl(); + + std::shared_ptr + GetShaderProgram(const std::string& vertexPath, + const std::string& fragmentPath); + +private: + class Impl; + + std::unique_ptr p; +}; + +} // namespace gl +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/gl/text_shader.cpp b/scwx-qt/source/scwx/qt/gl/text_shader.cpp index 20f3a60a..ec8cdcf1 100644 --- a/scwx-qt/source/scwx/qt/gl/text_shader.cpp +++ b/scwx-qt/source/scwx/qt/gl/text_shader.cpp @@ -19,7 +19,7 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); class TextShaderImpl { public: - explicit TextShaderImpl(std::shared_ptr context) : + explicit TextShaderImpl(std::shared_ptr context) : context_ {context}, shaderProgram_ {nullptr}, projectionLocation_(GL_INVALID_INDEX) @@ -28,13 +28,13 @@ public: ~TextShaderImpl() {} - std::shared_ptr context_; - std::shared_ptr shaderProgram_; + std::shared_ptr context_; + std::shared_ptr shaderProgram_; GLint projectionLocation_; }; -TextShader::TextShader(std::shared_ptr context) : +TextShader::TextShader(std::shared_ptr context) : p(std::make_unique(context)) { } diff --git a/scwx-qt/source/scwx/qt/gl/text_shader.hpp b/scwx-qt/source/scwx/qt/gl/text_shader.hpp index 83553a08..ed81907a 100644 --- a/scwx-qt/source/scwx/qt/gl/text_shader.hpp +++ b/scwx-qt/source/scwx/qt/gl/text_shader.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -27,7 +27,7 @@ class TextShaderImpl; class TextShader { public: - explicit TextShader(std::shared_ptr context); + explicit TextShader(std::shared_ptr context); ~TextShader(); TextShader(const TextShader&) = delete; diff --git a/scwx-qt/source/scwx/qt/map/map_context.cpp b/scwx-qt/source/scwx/qt/map/map_context.cpp index 1e19d9e6..68b94e8e 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.cpp +++ b/scwx-qt/source/scwx/qt/map/map_context.cpp @@ -1,5 +1,4 @@ #include -#include namespace scwx { @@ -12,31 +11,21 @@ class MapContext::Impl { public: explicit Impl(std::shared_ptr radarProductView) : - gl_ {}, settings_ {}, radarProductView_ {radarProductView}, radarProductGroup_ {common::RadarProductGroup::Unknown}, radarProduct_ {"???"}, - radarProductCode_ {0}, - shaderProgramMap_ {}, - shaderProgramMutex_ {} + radarProductCode_ {0} { } ~Impl() {} - gl::OpenGLFunctions gl_; MapSettings settings_; std::shared_ptr radarProductView_; common::RadarProductGroup radarProductGroup_; std::string radarProduct_; int16_t radarProductCode_; - - std::unordered_map, - std::shared_ptr, - util::hash>> - shaderProgramMap_; - std::mutex shaderProgramMutex_; }; MapContext::MapContext( @@ -49,11 +38,6 @@ MapContext::~MapContext() = default; MapContext::MapContext(MapContext&&) noexcept = default; MapContext& MapContext::operator=(MapContext&&) noexcept = default; -gl::OpenGLFunctions& MapContext::gl() -{ - return p->gl_; -} - MapSettings& MapContext::settings() { return p->settings_; @@ -101,31 +85,6 @@ void MapContext::set_radar_product_code(int16_t radarProductCode) p->radarProductCode_ = radarProductCode; } -std::shared_ptr -MapContext::GetShaderProgram(const std::string& vertexPath, - const std::string& fragmentPath) -{ - const std::pair key {vertexPath, fragmentPath}; - std::shared_ptr shaderProgram; - - std::unique_lock lock(p->shaderProgramMutex_); - - auto it = p->shaderProgramMap_.find(key); - - if (it == p->shaderProgramMap_.end()) - { - shaderProgram = std::make_shared(p->gl_); - shaderProgram->Load(vertexPath, fragmentPath); - p->shaderProgramMap_[key] = shaderProgram; - } - else - { - shaderProgram = it->second; - } - - return shaderProgram; -} - } // namespace map } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/map/map_context.hpp b/scwx-qt/source/scwx/qt/map/map_context.hpp index 95703f4a..47f3cc11 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.hpp +++ b/scwx-qt/source/scwx/qt/map/map_context.hpp @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include #include #include @@ -12,7 +11,7 @@ namespace qt namespace map { -class MapContext +class MapContext : public gl::GlContext { public: explicit MapContext( @@ -25,7 +24,6 @@ public: MapContext(MapContext&&) noexcept; MapContext& operator=(MapContext&&) noexcept; - gl::OpenGLFunctions& gl(); MapSettings& settings(); std::shared_ptr radar_product_view() const; common::RadarProductGroup radar_product_group() const; @@ -38,10 +36,6 @@ public: void set_radar_product(const std::string& radarProduct); void set_radar_product_code(int16_t radarProductCode); - std::shared_ptr - GetShaderProgram(const std::string& vertexPath, - const std::string& fragmentPath); - private: class Impl;