22 #include "ndNewtonStdafx.h"
25 #define D_USE_GPU_DEVICE
28 #define D_OPENCL_BUFFER_SIZE 1024
39 void SyncSize(cl_context context, ndInt32 size);
40 void ReadData(cl_command_queue commandQueue);
41 void WriteData(cl_command_queue commandQueue);
65 void CopyToGpu(cl_command_queue commandQueue,
const ndArray<ndInt32>& bodyArray);
68 #ifdef D_DEBUG_GPU_KERNELS
69 dVector MakeQuat(
const dVector& axis,
float angle);
70 dVector MultiplyQuat(
const dVector& r,
const dVector& q);
71 dVector NormalizeQuat(
const dVector& r);
93 size_t m_workWroupSize;
100 cl_program CompileProgram();
103 void SetKernel(
const char*
const name,
ndKernel& kerner);
109 char m_platformName[128];
112 cl_context m_context;
113 cl_device_id m_device;
114 cl_program m_solverProgram;
115 cl_command_queue m_commandQueue;
119 ndKernel m_integrateUnconstrainedBodies;
120 static const char* m_kernelSource;
121 ndInt32 m_computeUnits;
127 ,m_gpuBuffer(nullptr)
135 ndAssert(!m_gpuBuffer);
143 cl_int err = CL_SUCCESS;
144 err = clReleaseMemObject(m_gpuBuffer);
145 ndAssert(err == CL_SUCCESS);
148 m_gpuBuffer =
nullptr;
154 cl_int err = CL_SUCCESS;
156 if (m_gpuBuffer ==
nullptr)
158 if (m_flags & CL_MEM_USE_HOST_PTR)
166 m_gpuBuffer = clCreateBuffer(context, m_flags,
sizeof(T) * size,
nullptr, &err);
168 ndAssert(err == CL_SUCCESS);
180 cl_int err = CL_SUCCESS;
181 void*
const destination = &(*this)[0];
182 err = clEnqueueReadBuffer(
183 commandQueue, m_gpuBuffer,
185 0,
nullptr,
nullptr);
186 ndAssert(err == CL_SUCCESS);
192 const void*
const source = &(*this)[0];
194 cl_int err = CL_SUCCESS;
195 err = clEnqueueWriteBuffer(
196 commandQueue, m_gpuBuffer,
198 0,
nullptr,
nullptr);
199 ndAssert(err == CL_SUCCESS);