10 #ifndef __COMPUTE_DATA_COPY_H__
11 #define __COMPUTE_DATA_COPY_H__
20 #if defined(USE_FORGE_CPU_COPY_HELPERS)
24 #elif defined(USE_FORGE_CUDA_COPY_HELPERS)
38 #include <cuda_runtime.h>
39 #include <cuda_gl_interop.h>
41 #elif defined(USE_FORGE_OPENCL_COPY_HELPERS)
47 #error "Invalid Compute model, exiting."
58 #if defined(USE_FORGE_CPU_COPY_HELPERS)
59 typedef unsigned GfxResourceHandle;
60 #elif defined(USE_FORGE_CUDA_COPY_HELPERS)
61 typedef cudaGraphicsResource* GfxResourceHandle;
62 #elif defined(USE_FORGE_OPENCL_COPY_HELPERS)
63 typedef cl_mem GfxResourceHandle;
81 GfxResourceHandle
mId;
88 #if defined(USE_FORGE_CPU_COPY_HELPERS)
95 temp->
mId = pResourceId;
122 #if defined(USE_FORGE_CUDA_COPY_HELPERS)
124 static void handleCUDAError(cudaError_t err,
const char *file,
int line)
126 if (err != cudaSuccess) {
127 printf(
"%s in %s at line %d\n", cudaGetErrorString(err), file, line);
132 #define FORGE_CUDA_CHECK(err) (handleCUDAError(err, __FILE__, __LINE__ ))
135 void createGLBuffer(
GfxHandle** pOut,
const unsigned pResourceId,
const BufferType pTarget)
141 cudaGraphicsResource *cudaImageResource;
143 FORGE_CUDA_CHECK(cudaGraphicsGLRegisterBuffer(&cudaImageResource,
145 cudaGraphicsMapFlagsWriteDiscard));
147 temp->
mId = cudaImageResource;
155 FORGE_CUDA_CHECK(cudaGraphicsUnregisterResource(pHandle->
mId));
163 void* pointer = NULL;
165 cudaGraphicsResource *cudaResource = pGLDestination->
mId;
167 FORGE_CUDA_CHECK(cudaGraphicsMapResources(1, &cudaResource, 0));
169 FORGE_CUDA_CHECK(cudaGraphicsResourceGetMappedPointer(&pointer, &numBytes, cudaResource));
171 FORGE_CUDA_CHECK(cudaMemcpy(pointer, pSource, numBytes, cudaMemcpyDeviceToDevice));
173 FORGE_CUDA_CHECK(cudaGraphicsUnmapResources(1, &cudaResource, 0));
179 #if defined(USE_FORGE_OPENCL_COPY_HELPERS)
181 #if defined(__GNUC__)
182 #pragma GCC diagnostic push
183 #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
186 #define FORGE_OCL_CHECK(cl_status, message) \
187 if(cl_status != CL_SUCCESS) \
189 printf("Error: %s \nError Code: %d\n", message, cl_status);\
190 printf("Location: %s:%i\n", __FILE__, __LINE__);\
191 exit(EXIT_FAILURE); \
195 void createGLBuffer(
GfxHandle** pOut,
const unsigned pResourceId,
const BufferType pTarget)
201 cl_int returnCode = CL_SUCCESS;
203 temp->
mId = clCreateFromGLBuffer(getContext(), CL_MEM_WRITE_ONLY, pResourceId, &returnCode);
205 FORGE_OCL_CHECK(returnCode,
"Failed in clCreateFromGLBuffer");
213 FORGE_OCL_CHECK(clReleaseMemObject(pHandle->
mId),
"Failed in clReleaseMemObject");
222 cl_command_queue queue = getCommandQueue();
226 cl_mem src = (cl_mem)pSource;
227 cl_mem dst = pGLDestination->
mId;
231 FORGE_OCL_CHECK(clEnqueueAcquireGLObjects(queue, 1, &dst, 0, NULL, &waitEvent),
232 "Failed in clEnqueueAcquireGLObjects");
234 FORGE_OCL_CHECK(clWaitForEvents(1, &waitEvent),
235 "Failed in clWaitForEvents after clEnqueueAcquireGLObjects");
237 FORGE_OCL_CHECK(clEnqueueCopyBuffer(queue, src, dst, 0, 0, pSize, 0, NULL, &waitEvent),
238 "Failed in clEnqueueCopyBuffer");
240 FORGE_OCL_CHECK(clEnqueueReleaseGLObjects(queue, 1, &dst, 0, NULL, &waitEvent),
241 "Failed in clEnqueueReleaseGLObjects");
243 FORGE_OCL_CHECK(clWaitForEvents(1, &waitEvent),
244 "Failed in clWaitForEvents after clEnqueueReleaseGLObjects");
247 #if defined(__GNUC__)
248 #pragma GCC diagnostic pop