reorganize CL-GL sharing calls

pull/3471/head
kallaballa 2 years ago
parent 6553b9fb2c
commit a9d74bc1f6
  1. 39
      modules/viz2d/src/detail/framebuffercontext.cpp
  2. 1
      modules/viz2d/src/detail/framebuffercontext.hpp

@ -78,27 +78,27 @@ void FrameBufferContext::toGLTexture2D(cv::UMat& u, cv::ogl::Texture2D& texture)
cl_context context = (cl_context) ctx.ptr(); cl_context context = (cl_context) ctx.ptr();
cl_int status = 0; cl_int status = 0;
static bool first = true; cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr();
static cl_mem clImage = clCreateFromGLTexture(context, CL_MEM_WRITE_ONLY, 0x0DE1, 0,
texture.texId(), &status); if (clImage_ == nullptr) {
clImage_ = clCreateFromGLTexture(context, CL_MEM_WRITE_ONLY, 0x0DE1, 0, texture.texId(),
&status);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,
("OpenCL: clCreateFromGLTexture failed: %d", status)); ("OpenCL: clCreateFromGLTexture failed: %d", status));
cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ); status = clEnqueueAcquireGLObjects(q, 1, &clImage_, 0, NULL, NULL);
cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr();
if (first) {
first = false;
status = clEnqueueAcquireGLObjects(q, 1, &clImage, 0, NULL, NULL);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,
("OpenCL: clEnqueueAcquireGLObjects failed: %d", status)); ("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 dst_origin[3] = { 0, 0, 0 };
size_t region[3] = { (size_t) u.cols, (size_t) u.rows, 1 }; 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); NULL);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,
@ -117,28 +117,29 @@ void FrameBufferContext::fromGLTexture2D(const cv::ogl::Texture2D& texture, cv::
u.create(texture.size(), textureType); u.create(texture.size(), textureType);
} }
cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr();
cl_int status = 0; cl_int status = 0;
static bool first = true; if(clImage_ == nullptr) {
static cl_mem clImage = clCreateFromGLTexture(context, CL_MEM_READ_ONLY, 0x0DE1, 0, clImage_ = clCreateFromGLTexture(context, CL_MEM_READ_ONLY, 0x0DE1, 0,
texture.texId(), &status); texture.texId(), &status);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,
("OpenCL: clCreateFromGLTexture failed: %d", status)); ("OpenCL: clCreateFromGLTexture failed: %d", status));
cl_mem clBuffer = (cl_mem) u.handle(ACCESS_READ);
cl_command_queue q = (cl_command_queue) Queue::getDefault().ptr(); status = clEnqueueAcquireGLObjects(q, 1, &clImage_, 0, NULL, NULL);
if (first) {
first = false;
status = clEnqueueAcquireGLObjects(q, 1, &clImage, 0, NULL, NULL);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,
("OpenCL: clEnqueueAcquireGLObjects failed: %d", status)); ("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 src_origin[3] = { 0, 0, 0 };
size_t region[3] = { (size_t) u.cols, (size_t) u.rows, 1 }; 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); NULL);
if (status != CL_SUCCESS) if (status != CL_SUCCESS)
CV_Error_(cv::Error::OpenCLApiCallError, CV_Error_(cv::Error::OpenCLApiCallError,

@ -45,6 +45,7 @@ class FrameBufferContext {
GLuint textureID_ = 0; GLuint textureID_ = 0;
GLuint renderBufferID_ = 0; GLuint renderBufferID_ = 0;
GLint viewport_[4]; GLint viewport_[4];
cl_mem clImage_ = nullptr;
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
CLExecContext_t context_; CLExecContext_t context_;
#endif #endif

Loading…
Cancel
Save