From a9d74bc1f6e1a50281482c4024b9a0e263bf1bdc Mon Sep 17 00:00:00 2001 From: kallaballa Date: Tue, 11 Apr 2023 19:30:54 +0200 Subject: [PATCH] reorganize CL-GL sharing calls --- .../viz2d/src/detail/framebuffercontext.cpp | 39 ++++++++++--------- .../viz2d/src/detail/framebuffercontext.hpp | 1 + 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/viz2d/src/detail/framebuffercontext.cpp b/modules/viz2d/src/detail/framebuffercontext.cpp index 7f0b4eda4..ff4f941f0 100644 --- a/modules/viz2d/src/detail/framebuffercontext.cpp +++ b/modules/viz2d/src/detail/framebuffercontext.cpp @@ -78,27 +78,27 @@ void FrameBufferContext::toGLTexture2D(cv::UMat& u, cv::ogl::Texture2D& texture) cl_context context = (cl_context) ctx.ptr(); cl_int status = 0; - static bool first = true; - static cl_mem clImage = clCreateFromGLTexture(context, CL_MEM_WRITE_ONLY, 0x0DE1, 0, - texture.texId(), &status); + cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr(); + + if (clImage_ == nullptr) { + clImage_ = clCreateFromGLTexture(context, CL_MEM_WRITE_ONLY, 0x0DE1, 0, texture.texId(), + &status); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, ("OpenCL: clCreateFromGLTexture failed: %d", status)); - cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ); - cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr(); - if (first) { - first = false; - status = clEnqueueAcquireGLObjects(q, 1, &clImage, 0, NULL, NULL); + status = clEnqueueAcquireGLObjects(q, 1, &clImage_, 0, NULL, NULL); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, ("OpenCL: clEnqueueAcquireGLObjects failed: %d", status)); } - size_t offset = 0; // TODO + cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ); + + size_t offset = 0; size_t dst_origin[3] = { 0, 0, 0 }; size_t region[3] = { (size_t) u.cols, (size_t) u.rows, 1 }; - status = clEnqueueCopyBufferToImage(q, clBuffer, clImage, offset, dst_origin, region, 0, NULL, + status = clEnqueueCopyBufferToImage(q, clBuffer, clImage_, offset, dst_origin, region, 0, NULL, NULL); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, @@ -117,28 +117,29 @@ void FrameBufferContext::fromGLTexture2D(const cv::ogl::Texture2D& texture, cv:: u.create(texture.size(), textureType); } + cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr(); + cl_int status = 0; - static bool first = true; - static cl_mem clImage = clCreateFromGLTexture(context, CL_MEM_READ_ONLY, 0x0DE1, 0, + if(clImage_ == nullptr) { + clImage_ = clCreateFromGLTexture(context, CL_MEM_READ_ONLY, 0x0DE1, 0, texture.texId(), &status); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, ("OpenCL: clCreateFromGLTexture failed: %d", status)); - cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ); - cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr(); - if (first) { - first = false; - status = clEnqueueAcquireGLObjects(q, 1, &clImage, 0, NULL, NULL); + + status = clEnqueueAcquireGLObjects(q, 1, &clImage_, 0, NULL, NULL); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, ("OpenCL: clEnqueueAcquireGLObjects failed: %d", status)); } - size_t offset = 0; // TODO + cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ); + + size_t offset = 0; size_t src_origin[3] = { 0, 0, 0 }; size_t region[3] = { (size_t) u.cols, (size_t) u.rows, 1 }; - status = clEnqueueCopyImageToBuffer(q, clImage, clBuffer, src_origin, region, offset, 0, NULL, + status = clEnqueueCopyImageToBuffer(q, clImage_, clBuffer, src_origin, region, offset, 0, NULL, NULL); if (status != CL_SUCCESS) CV_Error_(cv::Error::OpenCLApiCallError, diff --git a/modules/viz2d/src/detail/framebuffercontext.hpp b/modules/viz2d/src/detail/framebuffercontext.hpp index af9684d0a..67049a68f 100644 --- a/modules/viz2d/src/detail/framebuffercontext.hpp +++ b/modules/viz2d/src/detail/framebuffercontext.hpp @@ -45,6 +45,7 @@ class FrameBufferContext { GLuint textureID_ = 0; GLuint renderBufferID_ = 0; GLint viewport_[4]; + cl_mem clImage_ = nullptr; #ifndef __EMSCRIPTEN__ CLExecContext_t context_; #endif