From fc4daa1fe40d0127dbd1e9fdbd4031bade1f7522 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Mon, 4 Mar 2013 22:38:40 +0000 Subject: Ok, première version qui affiche le mesh correctement initializé avec OpenCL et qui affiche même un sinus radial sur un clic de souris mouse1. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reste a capturer les evenements mouse wheel et/ou clavier. git-svn-id: file:///var/svn/2013-gpudataviz/trunk@19 371a6b4a-a258-45f8-9dcc-bdd82ce0ac9d --- src/opencl_mesh_kit.cpp | 61 +++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 25 deletions(-) (limited to 'src/opencl_mesh_kit.cpp') diff --git a/src/opencl_mesh_kit.cpp b/src/opencl_mesh_kit.cpp index a3eb6dc..a9010e8 100644 --- a/src/opencl_mesh_kit.cpp +++ b/src/opencl_mesh_kit.cpp @@ -20,6 +20,7 @@ cl_int OpenCLMeshKit::initCL(intptr_t gl_display, intptr_t gl_context, intptr_t this->meshWidth = meshWidth; this->meshHeight = meshHeight; this->groupSize = groupSize; + this->gl_vbo = gl_vbo; // Get platform count CL_RETURN_VAL_IF_FAIL(10, @@ -154,46 +155,52 @@ cl_int OpenCLMeshKit::compileKernels(std::list names, const char so return 0; } -cl_int OpenCLMeshKit::execKernel(std::string kernelName) { - /*TODO - -cl_int execKernel(cl_context cl_ctx, cl_command_queue commandQueue, cl_kernel kernel, size_t mesh_width, size_t mesh_height, size_t group_size, cl_mem cl_vbo, float time) { +cl_int OpenCLMeshKit::execKernel(std::string kernelName, float time) { cl_int res; cl_event eventND[1]; + size_t globalWorkSize[2], localWorkSize[2]; + cl_kernel kernel; + + std::map::iterator ii=this->kernels.find(kernelName); + if ( ii==this->kernels.end() ) { + std::cerr << "execKernel(\"" << kernelName << "\", " << time << ") failed : no kernel found with this name" << std::endl; + return -1; + } + + kernel=this->kernels[kernelName]; // Set local and global work group sizes - size_t globalWorkSize[2], localWorkSize[2]; - globalWorkSize[0]=mesh_width; - globalWorkSize[1]=mesh_height; - localWorkSize[0]=group_size; + globalWorkSize[0]=this->meshWidth; + globalWorkSize[1]=this->meshHeight; + localWorkSize[0]=this->groupSize; localWorkSize[1]=1; - res=clEnqueueAcquireGLObjects(commandQueue, 1, &cl_vbo, 0, 0, NULL); + res=clEnqueueAcquireGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, NULL); - res=clSetKernelArg(kernel, 0, sizeof(cl_mem), &cl_vbo); // float4 *pos - res=clSetKernelArg(kernel, 1, sizeof(cl_uint), (void *)&mesh_width); - res=clSetKernelArg(kernel, 2, sizeof(cl_uint), (void *)&mesh_height); - res=clSetKernelArg(kernel, 3, sizeof(float), &time); + res=clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&(this->cl_vbo)); // float4 *pos + res=clSetKernelArg(kernel, 1, sizeof(cl_uint), (void *)&(this->meshWidth)); + res=clSetKernelArg(kernel, 2, sizeof(cl_uint), (void *)&(this->meshHeight)); + res=clSetKernelArg(kernel, 3, sizeof(float), (void *)&time); // Execute kernel on given device - res=clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, eventND); + res=clEnqueueNDRangeKernel(this->cl_cq, kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, eventND); if ( res != CL_SUCCESS ) { - fputs("Failed to clEnqueueNDRangeKernel()\n", stderr); + std::cerr << "clEnqueueNDRangeKernel() failed" << std::endl; return 1; } - res=clFlush(commandQueue); + //TODO : return values checking + res=clFlush(this->cl_cq); + + // (CPU) Wait until GPU kernel execution end res=clWaitForEvents(1,eventND); //XXX: SimpleGL utilise une attente active, pourquoi ? res=clReleaseEvent(eventND[0]); - res=clEnqueueReleaseGLObjects(commandQueue, 1, &cl_vbo, 0, 0, 0); - res=clFinish(commandQueue); + res=clEnqueueReleaseGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, 0); + res=clFinish(this->cl_cq); return CL_SUCCESS; } -*/ - return 0; -} void OpenCLMeshKit::releaseKernels() { for (std::map::iterator ii = kernels.begin(); ii != kernels.end(); ++ii ) { @@ -209,7 +216,7 @@ cl_int OpenCLMeshKit::resetVBO() { std::list n; n.push_back("zero_z"); res = compileKernels(n, kernel_src_zero_z, sizeof(kernel_src_zero_z)); - if(res==0) res = execKernel("zero_z"); + if(res==0) res = execKernel("zero_z", 0.0f); releaseKernels(); kernels=user_kernels; @@ -217,9 +224,13 @@ cl_int OpenCLMeshKit::resetVBO() { return res; } -void OpenCLMeshKit::setGroupSize(size_t groupSize) { - this->groupSize=groupSize; -} +size_t OpenCLMeshKit::getMeshWidth() { return this->meshWidth; } +size_t OpenCLMeshKit::getMeshHeight() { return this->meshHeight; } +size_t OpenCLMeshKit::getMeshItemCount() { return this->meshWidth * this->meshHeight; } +size_t OpenCLMeshKit::getGroupSize() { return this->groupSize; } +intptr_t OpenCLMeshKit::getGLVBO() { return this->gl_vbo; } + +void OpenCLMeshKit::setGroupSize(size_t groupSize) { this->groupSize=groupSize; } OpenCLMeshKit::~OpenCLMeshKit() { } -- cgit v1.2.3