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 #pragma GCC diagnostic push
182 #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
184 #define FORGE_OCL_CHECK(cl_status, message) \
185 if(cl_status != CL_SUCCESS) \
187 printf("Error: %s \nError Code: %d\n", message, cl_status);\
188 printf("Location: %s:%i\n", __FILE__, __LINE__);\
189 exit(EXIT_FAILURE); \
193 void createGLBuffer(
GfxHandle** pOut,
const unsigned pResourceId,
const BufferType pTarget)
199 cl_int returnCode = CL_SUCCESS;
201 temp->
mId = clCreateFromGLBuffer(getContext(), CL_MEM_WRITE_ONLY, pResourceId, &returnCode);
203 FORGE_OCL_CHECK(returnCode,
"Failed in clCreateFromGLBuffer");
211 FORGE_OCL_CHECK(clReleaseMemObject(pHandle->
mId),
"Failed in clReleaseMemObject");
220 cl_command_queue queue = getCommandQueue();
224 cl_mem src = (cl_mem)pSource;
225 cl_mem dst = pGLDestination->
mId;
229 FORGE_OCL_CHECK(clEnqueueAcquireGLObjects(queue, 1, &dst, 0, NULL, &waitEvent),
230 "Failed in clEnqueueAcquireGLObjects");
232 FORGE_OCL_CHECK(clWaitForEvents(1, &waitEvent),
233 "Failed in clWaitForEvents after clEnqueueAcquireGLObjects");
235 FORGE_OCL_CHECK(clEnqueueCopyBuffer(queue, src, dst, 0, 0, pSize, 0, NULL, &waitEvent),
236 "Failed in clEnqueueCopyBuffer");
238 FORGE_OCL_CHECK(clEnqueueReleaseGLObjects(queue, 1, &dst, 0, NULL, &waitEvent),
239 "Failed in clEnqueueReleaseGLObjects");
241 FORGE_OCL_CHECK(clWaitForEvents(1, &waitEvent),
242 "Failed in clWaitForEvents after clEnqueueReleaseGLObjects");
245 #pragma GCC diagnostic pop