From 363a59b3e3edc74c2bae2d0bf4b20411550f198f Mon Sep 17 00:00:00 2001 From: kallaballa Date: Tue, 13 Dec 2022 13:19:40 +0100 Subject: [PATCH] use scopes for context lifetimes wherever possible --- src/common/clglcontext.cpp | 5 ++--- src/common/clglcontext.hpp | 19 +++++++++++++++---- src/common/clvacontext.cpp | 6 ++++-- src/common/clvacontext.hpp | 1 - src/common/nanovgcontext.cpp | 3 +-- src/common/nanovgcontext.hpp | 2 -- src/common/viz2d.cpp | 3 +-- src/common/viz2d.hpp | 1 + 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/common/clglcontext.cpp b/src/common/clglcontext.cpp index bb46968bc..2ff973f0e 100644 --- a/src/common/clglcontext.cpp +++ b/src/common/clglcontext.cpp @@ -45,7 +45,8 @@ cv::Size CLGLContext::getSize() { void CLGLContext::opencl(std::function fn) { CLExecScope_t clExecScope(getCLExecContext()); - CLGLContext::Scope fbScope(*this, frameBuffer_); + CLGLContext::GLScope glScope(*this); + CLGLContext::FrameBufferScope fbScope(*this, frameBuffer_); fn(frameBuffer_); } @@ -85,7 +86,6 @@ void CLGLContext::end() { } void CLGLContext::acquireFromGL(cv::UMat &m) { - begin(); GL_CHECK(cv::ogl::convertFromGLTexture2D(getTexture2D(), m)); //FIXME cv::flip(m, m, 0); @@ -95,7 +95,6 @@ void CLGLContext::releaseToGL(cv::UMat &m) { //FIXME cv::flip(m, m, 0); GL_CHECK(cv::ogl::convertToGLTexture2D(m, getTexture2D())); - end(); } } /* namespace kb */ diff --git a/src/common/clglcontext.hpp b/src/common/clglcontext.hpp index 4c6d3639e..aee7db0a5 100644 --- a/src/common/clglcontext.hpp +++ b/src/common/clglcontext.hpp @@ -21,7 +21,6 @@ class Viz2D; class CLGLContext { friend class CLVAContext; friend class NanoVGContext; - friend class Viz2D; cv::ogl::Texture2D *frameBufferTex_; GLuint frameBufferID; GLuint renderBufferID; @@ -29,19 +28,31 @@ class CLGLContext { CLExecContext_t context_; cv::Size frameBufferSize_; public: - class Scope { + class FrameBufferScope { CLGLContext& ctx_; cv::UMat& m_; public: - Scope(CLGLContext& ctx, cv::UMat& m) : ctx_(ctx), m_(m) { + FrameBufferScope(CLGLContext& ctx, cv::UMat& m) : ctx_(ctx), m_(m) { ctx_.acquireFromGL(m_); } - ~Scope() { + ~FrameBufferScope() { ctx_.releaseToGL(m_); } }; + class GLScope { + CLGLContext& ctx_; + public: + GLScope(CLGLContext& ctx) : ctx_(ctx) { + ctx_.begin(); + } + + ~GLScope() { + ctx_.end(); + } + }; + CLGLContext(const cv::Size& frameBufferSize); virtual ~CLGLContext(); cv::ogl::Texture2D& getFrameBufferTexture(); diff --git a/src/common/clvacontext.cpp b/src/common/clvacontext.cpp index d900676f7..4af967429 100644 --- a/src/common/clvacontext.cpp +++ b/src/common/clvacontext.cpp @@ -29,7 +29,8 @@ bool CLVAContext::capture(std::function fn) { } { CLExecScope_t scope(clglContext_.getCLExecContext()); - CLGLContext::Scope fbScope(clglContext_, frameBuffer_); + CLGLContext::GLScope glScope(clglContext_); + CLGLContext::FrameBufferScope fbScope(clglContext_, frameBuffer_); if (videoFrame_.empty()) return false; @@ -46,7 +47,8 @@ void CLVAContext::write(std::function fn) { cv::Size fbSize = clglContext_.getSize(); { CLExecScope_t scope(clglContext_.getCLExecContext()); - CLGLContext::Scope fbScope(clglContext_, frameBuffer_); + CLGLContext::GLScope glScope(clglContext_); + CLGLContext::FrameBufferScope fbScope(clglContext_, frameBuffer_); cv::cvtColor(frameBuffer_, rgbBuffer_, cv::COLOR_BGRA2RGB); cv::resize(rgbBuffer_, videoFrame_, videoFrameSize_); diff --git a/src/common/clvacontext.hpp b/src/common/clvacontext.hpp index 4aed0eb07..1817fc40b 100644 --- a/src/common/clvacontext.hpp +++ b/src/common/clvacontext.hpp @@ -8,7 +8,6 @@ namespace kb { class Viz2D; class CLVAContext { - friend class Viz2D; CLExecContext_t context_; CLGLContext &clglContext_; cv::UMat frameBuffer_; diff --git a/src/common/nanovgcontext.cpp b/src/common/nanovgcontext.cpp index 5d20b7038..bf2776647 100644 --- a/src/common/nanovgcontext.cpp +++ b/src/common/nanovgcontext.cpp @@ -16,12 +16,12 @@ NanoVGContext::NanoVGContext(Viz2D &v2d, NVGcontext *context, CLGLContext &fbCon void NanoVGContext::render(std::function fn) { CLExecScope_t scope(clglContext_.getCLExecContext()); + CLGLContext::GLScope glScope(clglContext_); NanoVGContext::Scope nvgScope(*this); fn(context_, clglContext_.getSize()); } void NanoVGContext::begin() { - clglContext_.begin(); float w = v2d_.getVideoFrameSize().width; float h = v2d_.getVideoFrameSize().height; float r = v2d_.getXPixelRatio(); @@ -34,6 +34,5 @@ void NanoVGContext::begin() { void NanoVGContext::end() { nvgEndFrame(context_); nvgRestore(context_); - clglContext_.end(); } } /* namespace kb */ diff --git a/src/common/nanovgcontext.hpp b/src/common/nanovgcontext.hpp index a7d93e67a..3e3de2646 100644 --- a/src/common/nanovgcontext.hpp +++ b/src/common/nanovgcontext.hpp @@ -8,8 +8,6 @@ #include "util.hpp" namespace kb { -class Viz2D; - class NanoVGContext { Viz2D& v2d_; NVGcontext *context_; diff --git a/src/common/viz2d.cpp b/src/common/viz2d.cpp index 5a92c0b6f..0d504e6e1 100644 --- a/src/common/viz2d.cpp +++ b/src/common/viz2d.cpp @@ -167,9 +167,8 @@ void Viz2D::setVideoFrameSize(const cv::Size& sz) { void Viz2D::opengl(std::function fn) { CLExecScope_t scope(clglContext_->getCLExecContext()); - clglContext_->begin(); + CLGLContext::GLScope glScope(*clglContext_); fn(getFrameBufferSize()); - clglContext_->end(); } void Viz2D::opencl(std::function fn) { diff --git a/src/common/viz2d.hpp b/src/common/viz2d.hpp index 6adf617cd..0d3d4aac0 100644 --- a/src/common/viz2d.hpp +++ b/src/common/viz2d.hpp @@ -4,6 +4,7 @@ #include #include #include + #include "clglcontext.hpp" #include "clvacontext.hpp" #include "nanovgcontext.hpp"