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;
   108 void copyToGLBuffer(
GfxHandle* pGLDestination, ComputeResourceHandle  pSource, 
const size_t pSize)
   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));
   160 void copyToGLBuffer(
GfxHandle* pGLDestination, ComputeResourceHandle  pSource, 
const size_t pSize)
   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");
   216 void copyToGLBuffer(
GfxHandle* pGLDestination, ComputeResourceHandle  pSource, 
const size_t pSize)
   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 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.