27#ifndef PX_CUDA_CONTEXT_MANAGER_H
28#define PX_CUDA_CONTEXT_MANAGER_H
30#include "foundation/PxPreprocessor.h"
32#if PX_SUPPORT_GPU_PHYSX
34#include "foundation/PxSimpleTypes.h"
35#include "foundation/PxErrorCallback.h"
36#include "foundation/PxFlags.h"
38#include "PxCudaTypes.h"
48struct PxCudaInteropMode
64struct PxCudaInteropRegisterFlag
70 eWRITE_DISCARD = 0x02,
72 eTEXTURE_GATHER = 0x08
79class PxDeviceAllocatorCallback
89 virtual bool memAlloc(
void** ptr,
size_t size) = 0;
96 virtual bool memFree(
void* ptr) = 0;
99 virtual ~PxDeviceAllocatorCallback() {}
106typedef PxFlags<PxCudaInteropRegisterFlag::Enum, uint32_t> PxCudaInteropRegisterFlags;
107PX_FLAGS_OPERATORS(PxCudaInteropRegisterFlag::Enum, uint32_t)
110class PxCudaContextManagerDesc
139 void* graphicsDevice;
157 PxDeviceAllocatorCallback* deviceAllocator;
166 PxCudaInteropMode::Enum interopMode;
170 graphicsDevice (NULL),
172 deviceAllocator (NULL),
173 interopMode (PxCudaInteropMode::NO_INTEROP)
184 const char* functionName;
197class PxCudaContextManager
206 void clearDeviceBufferAsync(T* deviceBuffer, PxU32 numElements, CUstream stream, PxI32 value = 0)
208 clearDeviceBufferAsyncInternal(deviceBuffer, numElements *
sizeof(T), stream, value);
217 void copyDToH(T* hostBuffer,
const T* deviceBuffer, PxU32 numElements)
219 copyDToHInternal(hostBuffer, deviceBuffer, numElements *
sizeof(T));
228 void copyHToD(T* deviceBuffer,
const T* hostBuffer, PxU32 numElements)
230 copyHToDInternal(deviceBuffer, hostBuffer, numElements *
sizeof(T));
239 void copyDToHAsync(T* hostBuffer,
const T* deviceBuffer, PxU32 numElements, CUstream stream)
241 copyDToHAsyncInternal(hostBuffer, deviceBuffer, numElements *
sizeof(T), stream);
250 void copyHToDAsync(T* deviceBuffer,
const T* hostBuffer, PxU32 numElements, CUstream stream)
252 copyHToDAsyncInternal(deviceBuffer, hostBuffer, numElements *
sizeof(T), stream);
261 void copyDToDAsync(T* dstDeviceBuffer,
const T* srcDeviceBuffer, PxU32 numElements, CUstream stream)
263 copyDToDAsyncInternal(dstDeviceBuffer, srcDeviceBuffer, numElements *
sizeof(T), stream);
272 void allocDeviceBuffer(T*& deviceBuffer, PxU32 numElements,
const char* filename = __FILE__, PxI32 line = __LINE__)
274 void* ptr = allocDeviceBufferInternal(numElements *
sizeof(T), filename, line);
275 deviceBuffer =
reinterpret_cast<T*
>(ptr);
284 T* allocDeviceBuffer(PxU32 numElements,
const char* filename = __FILE__, PxI32 line = __LINE__)
286 void* ptr = allocDeviceBufferInternal(numElements *
sizeof(T), filename, line);
287 return reinterpret_cast<T*
>(ptr);
296 void freeDeviceBuffer(T*& deviceBuffer)
298 freeDeviceBufferInternal(deviceBuffer);
310 void allocPinnedHostBuffer(T*& pinnedHostBuffer, PxU32 numElements,
const char* filename = __FILE__, PxI32 line = __LINE__)
312 void* ptr = allocPinnedHostBufferInternal(numElements *
sizeof(T), filename, line);
313 pinnedHostBuffer =
reinterpret_cast<T*
>(ptr);
324 T* allocPinnedHostBuffer(PxU32 numElements,
const char* filename = __FILE__, PxI32 line = __LINE__)
326 void* ptr = allocPinnedHostBufferInternal(numElements *
sizeof(T), filename, line);
327 return reinterpret_cast<T*
>(ptr);
336 void freePinnedHostBuffer(T*& pinnedHostBuffer)
338 freePinnedHostBufferInternal(pinnedHostBuffer);
339 pinnedHostBuffer = NULL;
349 virtual CUdeviceptr getMappedDevicePtr(
void* pinnedHostBuffer) = 0;
360 virtual void acquireContext() = 0;
368 virtual void releaseContext() = 0;
373 virtual CUcontext getContext() = 0;
378 virtual PxCudaContext* getCudaContext() = 0;
387 virtual bool contextIsValid()
const = 0;
391 virtual bool supportsArchSM10()
const = 0;
392 virtual bool supportsArchSM11()
const = 0;
393 virtual bool supportsArchSM12()
const = 0;
394 virtual bool supportsArchSM13()
const = 0;
395 virtual bool supportsArchSM20()
const = 0;
396 virtual bool supportsArchSM30()
const = 0;
397 virtual bool supportsArchSM35()
const = 0;
398 virtual bool supportsArchSM50()
const = 0;
399 virtual bool supportsArchSM52()
const = 0;
400 virtual bool supportsArchSM60()
const = 0;
401 virtual bool isIntegrated()
const = 0;
402 virtual bool canMapHostMemory()
const = 0;
403 virtual int getDriverVersion()
const = 0;
404 virtual size_t getDeviceTotalMemBytes()
const = 0;
405 virtual int getMultiprocessorCount()
const = 0;
406 virtual unsigned int getClockRate()
const = 0;
407 virtual int getSharedMemPerBlock()
const = 0;
408 virtual int getSharedMemPerMultiprocessor()
const = 0;
409 virtual unsigned int getMaxThreadsPerBlock()
const = 0;
410 virtual const char *getDeviceName()
const = 0;
411 virtual CUdevice getDevice()
const = 0;
412 virtual PxCudaInteropMode::Enum getInteropMode()
const = 0;
414 virtual void setUsingConcurrentStreams(
bool) = 0;
415 virtual bool getUsingConcurrentStreams()
const = 0;
438 virtual bool registerResourceInCudaGL(CUgraphicsResource& resource, uint32_t buffer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0;
460 virtual bool registerResourceInCudaD3D(CUgraphicsResource& resource,
void* resourcePointer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0;
469 virtual bool unregisterResourceInCuda(CUgraphicsResource resource) = 0;
478 virtual int usingDedicatedGPU()
const = 0;
484 virtual CUmodule* getCuModules() = 0;
496 virtual void release() = 0;
503 virtual ~PxCudaContextManager() {}
505 virtual void* allocDeviceBufferInternal(PxU32 numBytes,
const char* filename = NULL, PxI32 line = -1) = 0;
506 virtual void* allocPinnedHostBufferInternal(PxU32 numBytes,
const char* filename = NULL, PxI32 line = -1) = 0;
508 virtual void freeDeviceBufferInternal(
void* deviceBuffer) = 0;
509 virtual void freePinnedHostBufferInternal(
void* pinnedHostBuffer) = 0;
511 virtual void clearDeviceBufferAsyncInternal(
void* deviceBuffer, PxU32 numBytes, CUstream stream, PxI32 value) = 0;
513 virtual void copyDToHAsyncInternal(
void* hostBuffer,
const void* deviceBuffer, PxU32 numBytes, CUstream stream) = 0;
514 virtual void copyHToDAsyncInternal(
void* deviceBuffer,
const void* hostBuffer, PxU32 numBytes, CUstream stream) = 0;
515 virtual void copyDToDAsyncInternal(
void* dstDeviceBuffer,
const void* srcDeviceBuffer, PxU32 numBytes, CUstream stream) = 0;
517 virtual void copyDToHInternal(
void* hostBuffer,
const void* deviceBuffer, PxU32 numBytes) = 0;
518 virtual void copyHToDInternal(
void* deviceBuffer,
const void* hostBuffer, PxU32 numBytes) = 0;
521#define PX_DEVICE_ALLOC(cudaContextManager, deviceBuffer, numElements) cudaContextManager->allocDeviceBuffer(deviceBuffer, numElements, __FILE__, __LINE__)
522#define PX_DEVICE_ALLOC_T(T, cudaContextManager, numElements) cudaContextManager->allocDeviceBuffer<T>(numElements, __FILE__, __LINE__)
523#define PX_DEVICE_FREE(cudaContextManager, deviceBuffer) cudaContextManager->freeDeviceBuffer(deviceBuffer);
525#define PX_PINNED_HOST_ALLOC(cudaContextManager, pinnedHostBuffer, numElements) cudaContextManager->allocPinnedHostBuffer(pinnedHostBuffer, numElements, __FILE__, __LINE__)
526#define PX_PINNED_HOST_ALLOC_T(T, cudaContextManager, numElements) cudaContextManager->allocPinnedHostBuffer<T>(numElements, __FILE__, __LINE__)
527#define PX_PINNED_HOST_FREE(cudaContextManager, pinnedHostBuffer) cudaContextManager->freePinnedHostBuffer(pinnedHostBuffer);
532class PxScopedCudaLock
538 PxScopedCudaLock(PxCudaContextManager& ctx) : mCtx(&ctx)
540 mCtx->acquireContext();
548 mCtx->releaseContext();
556 PxCudaContextManager* mCtx;
#define PX_INLINE
Definition PxPreprocessor.h:320
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39