void procOCL_OCV(int tex, int w, int h) { int64_t t = getTimeMs(); cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex); std::vector < cl::Memory > images(1, imgIn); theQueue.enqueueAcquireGLObjects(&images); theQueue.finish(); cv::UMat uIn, uOut, uTmp; cv::ocl::convertFromImage(imgIn(), uIn); LOGD("loading texture data to OpenCV UMat costs %d ms", getTimeInterval(t)); theQueue.enqueueReleaseGLObjects(&images); t = getTimeMs(); //cv::blur(uIn, uOut, cv::Size(5, 5)); cv::Laplacian(uIn, uTmp, CV_8U); cv:multiply(uTmp, 10, uOut); cv::ocl::finish(); LOGD("OpenCV processing costs %d ms", getTimeInterval(t)); t = getTimeMs(); cl::ImageGL imgOut(theContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, tex); images.clear(); images.push_back(imgOut); theQueue.enqueueAcquireGLObjects(&images); cl_mem clBuffer = (cl_mem)uOut.handle(cv::ACCESS_READ); cl_command_queue q = (cl_command_queue)cv::ocl::Queue::getDefault().ptr(); size_t offset = 0; size_t origin[3] = { 0, 0, 0 }; size_t region[3] = { w, h, 1 }; CV_Assert(clEnqueueCopyBufferToImage (q, clBuffer, imgOut(), offset, origin, region, 0, NULL, NULL) == CL_SUCCESS); theQueue.enqueueReleaseGLObjects(&images); cv::ocl::finish(); LOGD("uploading results to texture costs %d ms", getTimeInterval(t)); }
void procOCL_I2I(int texIn, int texOut, int w, int h) { if(!haveOpenCL) return; LOGD("procOCL_I2I(%d, %d, %d, %d)", texIn, texOut, w, h); cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, texIn); cl::ImageGL imgOut(theContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texOut); std::vector < cl::Memory > images; images.push_back(imgIn); images.push_back(imgOut); int64_t t = getTimeMs(); theQueue.enqueueAcquireGLObjects(&images); theQueue.finish(); LOGD("enqueueAcquireGLObjects() costs %d ms", getTimeInterval(t)); t = getTimeMs(); cl::Kernel Laplacian(theProgI2I, "Laplacian"); //TODO: may be done once Laplacian.setArg(0, imgIn); Laplacian.setArg(1, imgOut); theQueue.finish(); LOGD("Kernel() costs %d ms", getTimeInterval(t)); t = getTimeMs(); theQueue.enqueueNDRangeKernel(Laplacian, cl::NullRange, cl::NDRange(w, h), cl::NullRange); theQueue.finish(); LOGD("enqueueNDRangeKernel() costs %d ms", getTimeInterval(t)); t = getTimeMs(); theQueue.enqueueReleaseGLObjects(&images); theQueue.finish(); LOGD("enqueueReleaseGLObjects() costs %d ms", getTimeInterval(t)); }
void updateParticles(float timeDelta) { try { vector<cl::Memory> glBuffers; glBuffers.push_back(m_positions); glBuffers.push_back(m_colors); //this will update our system by calculating new velocity and updating the positions of our particles //Make sure OpenGL is done using our VBOs glFinish(); // map OpenGL buffer object for writing from OpenCL // this passes in the vector of VBO buffer objects (position and color) m_queue.enqueueAcquireGLObjects(&glBuffers); m_particleKernel.setArg(5, timeDelta); //pass in the timestep //execute the kernel m_queue.enqueueNDRangeKernel(m_particleKernel, cl::NullRange, cl::NDRange(m_numParticles), cl::NullRange); //Release the VBOs so OpenGL can play with them m_queue.enqueueReleaseGLObjects(&glBuffers, NULL); m_queue.finish(); } catch(cl::Error &error) { LOG_ERROR << error.what() << "(" << oclErrorString(error.err()) << ")"; } }
void MetaBallsApp::update() { std::vector<cl::Memory> acquire( { mClParticleBuf, mClMarchingRenderBuffer, mClMarchingDebugBuffer } ); mClCommandQueue.enqueueAcquireGLObjects( &acquire ); updateParticles(); updateMarching(); mClCommandQueue.enqueueReleaseGLObjects( &acquire ); }
void PTWeekend::draw() { /* * BEGIN - each frame part */ /* Enqueue kernel for execution */ glm::vec3 origin,lower_left, hor, ver; float theta = camera.getFov() * M_PI / 180.0f; float half_height = tan(theta / 2.0f); float half_width = camera.getAspectRatio() * half_height; origin = camera.getEyePoint(); glm::vec3 u, v, w; w = -glm::normalize(camera.getViewDirection()); //odd... u = glm::normalize(glm::cross(glm::vec3(0,1,0), w)); v = glm::cross(w, u); lower_left = origin - half_width * u - half_height * v - w; hor = 2.0f * half_width * u; ver = 2.0f * half_height * v; pt_assert(cl_set_pinhole_cam_arg(origin, lower_left, hor, ver, cam_buffer, cmd_queue), "Could not fill camera buffer"); clStatus = cmd_queue.enqueueAcquireGLObjects(&img_buffer, NULL, NULL); pt_assert(clStatus, "Could not acquire gl objects"); cl::Event profiling_evt; clStatus = cmd_queue.enqueueNDRangeKernel(kernel, cl::NDRange(0,0), cl::NDRange(img_width, img_height), cl::NDRange(local_width,local_height), NULL, &profiling_evt); profiling_evt.wait(); pt_assert(clStatus, "Could not enqueue the kernel"); clStatus = cmd_queue.enqueueReleaseGLObjects(&img_buffer, NULL, NULL); pt_assert(clStatus, "Could not release gl objects"); cmd_queue.finish(); cl_ulong time_start = profiling_evt.getProfilingInfo<CL_PROFILING_COMMAND_START>(); cl_ulong time_end = profiling_evt.getProfilingInfo<CL_PROFILING_COMMAND_END>(); cl_ulong total_time = time_end - time_start; std::cout << "Total time: " << total_time * 0.001 * 0.001 << " ms \n"; /* * END - each frame part */ gl::draw(imgTex, Rectf(0, 0, getWindowWidth(), getWindowHeight())); }
void mainLoop( cl::CommandQueue& queue, cl::Context& context, cl::Kernel kernel, cl::Buffer clImgDesc, cl::Buffer clCamera ){ cl::Event eAcquire, eRelease, eExecute; cl_int err; glFinish(); checkGLErr( "glFinish()" ); queue.enqueueWriteBuffer( clImgDesc, CL_TRUE, 0, 1 * sizeof(ImageDescriptor), (const void*)&imgDesc); err = queue.enqueueAcquireGLObjects( vSharedUnits, NULL, &eAcquire ); checkErr(err, "CommandQueue::enqueueAcquireGLObjects()"); eAcquire.wait(); err = queue.enqueueNDRangeKernel( kernel, cl::NullRange, cl::NDRange(WIDTH, HEIGHT), cl::NullRange, NULL, &eExecute); checkErr(err, "CommandQueue::enqueueNDRangeKernel()"); //std::cout<<"Kernel executing"<< std::endl ; clock_t ti = clock(); eExecute.wait(); clock_t tf = clock(); queue.finish(); err = queue.enqueueReleaseGLObjects( vSharedUnits, NULL, &eRelease ); checkErr(err, "CommandQueue::enqueueReleaseGLObjects()"); eRelease.wait(); imgDesc.numSamples += SAMPLES; pAccumulator->glBind( GL_DRAW_FRAMEBUFFER ); checkGLErr( "glBind GL_DRAW_FRAMEBUFFER, Accumulator " ); pCLTarget->glBind( GL_READ_FRAMEBUFFER ); checkGLErr( "glBind GL_READ_FRAMEBUFFER, Main Target " ); glBlitFramebuffer( 0, 0, WIDTH, HEIGHT, 0, 0, WIDTH, HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST ); checkGLErr( "glBlitFramebuffer" ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); checkGLErr( "glBind GL_DRAW_FRAMEBUFFER, 0 " ); pCLTarget->glBind( GL_READ_FRAMEBUFFER ); checkGLErr( "glBind GL_READ_FRAMEBUFFER, something " ); glBlitFramebuffer( 0, 0, WIDTH, HEIGHT, 0, 0, WIDTH, HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST ); checkGLErr( "glBlitFramebuffer" ); glfwPollEvents(); pCamera->glfwHandleCursor( ((float)(tf - ti))/(CLOCKS_PER_SEC * 1.0f) ); if( sceneChanged() ){ //printf("scene changed..!"); imgDesc.numSamples = 0; CLCamera* cam = pCamera->getCLCamera(); queue.enqueueWriteBuffer( clCamera, CL_TRUE, 0, 1 * sizeof(CLCamera), (const void*)cam ); delete cam; } glfwSwapBuffers( window ); checkGLErr( "glSwapBuffers" ); //Block for a while. //int i; //std::cin >> i; //float timeTaken = ( (float)(tf - ti) ) / (float)CLOCKS_PER_SEC; //std::cout<<"Time taken: "<< timeTaken * 1000 << "ms" << std::endl; //std::cout<<"Predicted FPS: "<< 1 / timeTaken << " FPS"<< std::endl; if( imgDesc.numSamples % 10 == 0 ) std::cout<<"numSamples: "<<imgDesc.numSamples<<std::endl; //handleFrameCounter(); }