summaryrefslogtreecommitdiff
path: root/src/opencl_mesh_kit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/opencl_mesh_kit.cpp')
-rw-r--r--src/opencl_mesh_kit.cpp61
1 files changed, 36 insertions, 25 deletions
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<std::string> 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<std::string,cl_kernel>::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<std::string,cl_kernel>::iterator ii = kernels.begin(); ii != kernels.end(); ++ii ) {
@@ -209,7 +216,7 @@ cl_int OpenCLMeshKit::resetVBO() {
std::list<std::string> 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() { }