void checkCLFun(cl_int cErr, char* file, int line) { if (cErr != CL_SUCCESS) { const char* err = getOpenCLErrorString(cErr); fprintf(stderr, "%s line: %d\n", err, line); if (cErr != CL_BUILD_PROGRAM_FAILURE) exit(1); } }
/* * Update Texture - requires valid OpenGL Context */ void TextureUpdate::updateTexture(const Measurement::ImageMeasurement& image) { #ifdef HAVE_OPENCV // access OCL Manager and initialize if needed Vision::OpenCLManager& oclManager = Vision::OpenCLManager::singleton(); if (!image) { // LOG4CPP_WARN ?? return; } // if OpenCL is enabled and image is on GPU, then use OCL codepath bool image_isOnGPU = oclManager.isInitialized() & image->isOnGPU(); if ( m_bTextureInitialized ) { // check if received image fits into the allocated texture // find out texture format int umatConvertCode = -1; GLenum glFormat = GL_LUMINANCE; GLenum glDatatype = GL_UNSIGNED_BYTE; int numOfChannels = 1; Image::ImageFormatProperties fmtSrc, fmtDst; image->getFormatProperties(fmtSrc); image->getFormatProperties(fmtDst); getImageFormat(fmtSrc, fmtDst, image_isOnGPU, umatConvertCode, glFormat, glDatatype); if (image_isOnGPU) { #ifdef HAVE_OPENCL glBindTexture( GL_TEXTURE_2D, m_texture ); // @todo this probably causes unwanted delay - .. except when executed on gpu ... if (umatConvertCode != -1) { cv::cvtColor(image->uMat(), m_convertedImage, umatConvertCode ); } else { m_convertedImage = image->uMat(); } cv::ocl::finish(); glFinish(); cl_command_queue commandQueue = oclManager.getCommandQueue(); cl_int err; clFinish(commandQueue); err = clEnqueueAcquireGLObjects(commandQueue, 1, &(m_clImage), 0, NULL, NULL); if(err != CL_SUCCESS) { LOG4CPP_ERROR( logger, "error at clEnqueueAcquireGLObjects:" << getOpenCLErrorString(err) ); } cl_mem clBuffer = (cl_mem) m_convertedImage.handle(cv::ACCESS_READ); cl_command_queue cv_ocl_queue = (cl_command_queue)cv::ocl::Queue::getDefault().ptr(); size_t offset = 0; size_t dst_origin[3] = {0, 0, 0}; size_t region[3] = {static_cast<size_t>(m_convertedImage.cols), static_cast<size_t>(m_convertedImage.rows), 1}; err = clEnqueueCopyBufferToImage(cv_ocl_queue, clBuffer, m_clImage, offset, dst_origin, region, 0, NULL, NULL); if (err != CL_SUCCESS) { LOG4CPP_ERROR( logger, "error at clEnqueueCopyBufferToImage:" << getOpenCLErrorString(err) ); } err = clEnqueueReleaseGLObjects(commandQueue, 1, &m_clImage, 0, NULL, NULL); if(err != CL_SUCCESS) { LOG4CPP_ERROR( logger, "error at clEnqueueReleaseGLObjects:" << getOpenCLErrorString(err) ); } cv::ocl::finish(); #else // HAVE_OPENCL LOG4CPP_ERROR( logger, "Image isOnGPU but OpenCL is disabled!!"); #endif // HAVE_OPENCL } else { // load image from CPU buffer into texture glBindTexture( GL_TEXTURE_2D, m_texture ); glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, image->width(), image->height(), glFormat, glDatatype, image->Mat().data ); } } #endif // HAVE_OPENCV }
void TextureUpdate::initializeTexture(const Measurement::ImageMeasurement& image, const GLuint tex_id) { #ifdef HAVE_OPENCV if (!image) { return; } if ( !m_bTextureInitialized ) { // access OCL Manager and initialize if needed Vision::OpenCLManager& oclManager = Vision::OpenCLManager::singleton(); // if OpenCL is enabled and image is on GPU, then use OCL codepath bool image_isOnGPU = oclManager.isEnabled() & image->isOnGPU(); // find out texture format int umatConvertCode = -1; GLenum glFormat = GL_LUMINANCE; GLenum glDatatype = GL_UNSIGNED_BYTE; int numOfChannels = 1; Image::ImageFormatProperties fmtSrc, fmtDst; image->getFormatProperties(fmtSrc); image->getFormatProperties(fmtDst); getImageFormat(fmtSrc, fmtDst, image_isOnGPU, umatConvertCode, glFormat, glDatatype); // generate power-of-two sizes m_pow2Width = 1; while ( m_pow2Width < (unsigned)image->width() ) m_pow2Width <<= 1; m_pow2Height = 1; while ( m_pow2Height < (unsigned)image->height() ) m_pow2Height <<= 1; m_texture = tex_id; glBindTexture( GL_TEXTURE_2D, m_texture ); // define texture parameters glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); // load empty texture image (defines texture size) glTexImage2D( GL_TEXTURE_2D, 0, fmtDst.channels, m_pow2Width, m_pow2Height, 0, glFormat, glDatatype, 0 ); LOG4CPP_DEBUG( logger, "glTexImage2D( width=" << m_pow2Width << ", height=" << m_pow2Height << " ): " << glGetError() ); LOG4CPP_INFO( logger, "initalized texture ( " << glFormat << " ) OnGPU: " << image_isOnGPU); if (oclManager.isInitialized()) { #ifdef HAVE_OPENCL //Get an image Object from the OpenGL texture cl_int err; // windows specific or opencl version specific ?? #ifdef WIN32 m_clImage = clCreateFromGLTexture2D( oclManager.getContext(), CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, m_texture, &err); #else m_clImage = clCreateFromGLTexture( oclManager.getContext(), CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, m_texture, &err); #endif if (err != CL_SUCCESS) { LOG4CPP_ERROR( logger, "error at clCreateFromGLTexture2D:" << getOpenCLErrorString(err) ); } #endif } m_bTextureInitialized = true; } #endif // HAVE_OPENCV }
static inline void ___openCLSafeCall(int err, const char *file, const int line, const char *func = "") { if( CL_SUCCESS != err) cv::ocl::error(getOpenCLErrorString(err), file, line, func); }