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)
59typedef unsigned GfxResourceHandle;
60#elif defined(USE_FORGE_CUDA_COPY_HELPERS)
61typedef cudaGraphicsResource* GfxResourceHandle;
62#elif defined(USE_FORGE_OPENCL_COPY_HELPERS)
63typedef 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)
124static 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__ ))
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); \
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
void * ComputeResourceHandle
A backend-agnostic handle to a compute memory resource originating from an OpenGL resource.
Definition ComputeCopy.h:73
BufferType
Definition ComputeCopy.h:75
@ FORGE_VERTEX_BUFFER
OpenGL Vertex Buffer Object.
Definition ComputeCopy.h:77
@ FORGE_IMAGE_BUFFER
OpenGL Pixel Buffer Object.
Definition ComputeCopy.h:76
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.
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.
FGAPI fg_err fg_finish()
Sync all rendering operations till this point.
Definition ComputeCopy.h:80
BufferType mTarget
Definition ComputeCopy.h:82
GfxResourceHandle mId
Definition ComputeCopy.h:81