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 OpenGL Pixel Buffer Object.
Definition: ComputeCopy.h:76
OpenGL Vertex Buffer Object.
Definition: ComputeCopy.h:77
GfxResourceHandle mId
Definition: ComputeCopy.h:81
void * ComputeResourceHandle
A backend-agnostic handle to a compute memory resource originating from an OpenGL resource...
Definition: ComputeCopy.h:73
FGAPI fg_err fg_update_pixel_buffer(const unsigned pBufferId, const size_t pBufferSize, const void *pBufferData)
Update backend specific pixel buffer from given host side memory.
Definition: ComputeCopy.h:80
FGAPI fg_err fg_update_vertex_buffer(const unsigned pBufferId, const size_t pBufferSize, const void *pBufferData)
Update backend specific vertex buffer from given host side memory.
BufferType mTarget
Definition: ComputeCopy.h:82
BufferType
Definition: ComputeCopy.h:75
FGAPI fg_err fg_finish()
Sync all rendering operations till this point.