00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef PXCUDACONTEXTMANAGER_PXGPUCOPYDESCQUEUE_H
00029 #define PXCUDACONTEXTMANAGER_PXGPUCOPYDESCQUEUE_H
00030
00031 #include "foundation/PxPreprocessor.h"
00032
00033 #if PX_SUPPORT_GPU_PHYSX
00034
00035 #include "foundation/PxAssert.h"
00036 #include "task/PxTaskDefine.h"
00037 #include "task/PxGpuDispatcher.h"
00038 #include "cudamanager/PxGpuCopyDesc.h"
00039 #include "cudamanager/PxCudaContextManager.h"
00040
00041
00042 typedef struct CUstream_st* CUstream;
00043
00044 namespace physx
00045 {
00046
00047 PX_PUSH_PACK_DEFAULT
00048
00050 class PxGpuCopyDescQueue
00051 {
00052 public:
00054 PxGpuCopyDescQueue(PxGpuDispatcher& d)
00055 : mDispatcher(d)
00056 , mBuffer(0)
00057 , mStream(0)
00058 , mReserved(0)
00059 , mOccupancy(0)
00060 , mFlushed(0)
00061 {
00062 }
00063
00065 ~PxGpuCopyDescQueue()
00066 {
00067 if (mBuffer)
00068 {
00069 mDispatcher.getCudaContextManager()->getMemoryManager()->free(PxCudaBufferMemorySpace::T_PINNED_HOST, (size_t) mBuffer);
00070 }
00071 }
00072
00078 void reset(CUstream stream, uint32_t reserveSize)
00079 {
00080 if (reserveSize > mReserved)
00081 {
00082 if (mBuffer)
00083 {
00084 mDispatcher.getCudaContextManager()->getMemoryManager()->free(
00085 PxCudaBufferMemorySpace::T_PINNED_HOST,
00086 (size_t) mBuffer);
00087 mReserved = 0;
00088 }
00089 mBuffer = (PxGpuCopyDesc*) mDispatcher.getCudaContextManager()->getMemoryManager()->alloc(
00090 PxCudaBufferMemorySpace::T_PINNED_HOST,
00091 reserveSize * sizeof(PxGpuCopyDesc),
00092 PX_ALLOC_INFO("PxGpuCopyDescQueue", GPU_UTIL));
00093 if (mBuffer)
00094 {
00095 mReserved = reserveSize;
00096 }
00097 }
00098
00099 mOccupancy = 0;
00100 mFlushed = 0;
00101 mStream = stream;
00102 }
00103
00105 void enqueue(PxGpuCopyDesc& desc)
00106 {
00107 PX_ASSERT(desc.isValid());
00108 if (desc.bytes == 0)
00109 {
00110 return;
00111 }
00112
00113 if (mOccupancy < mReserved)
00114 {
00115 mBuffer[ mOccupancy++ ] = desc;
00116 }
00117 else
00118 {
00119 mDispatcher.launchCopyKernel(&desc, 1, mStream);
00120 }
00121 }
00122
00124 void flushEnqueued()
00125 {
00126 if (mOccupancy > mFlushed)
00127 {
00128 mDispatcher.launchCopyKernel(mBuffer + mFlushed, mOccupancy - mFlushed, mStream);
00129 mFlushed = mOccupancy;
00130 }
00131 }
00132
00133 private:
00134 PxGpuDispatcher& mDispatcher;
00135 PxGpuCopyDesc* mBuffer;
00136 CUstream mStream;
00137 uint32_t mReserved;
00138 uint32_t mOccupancy;
00139 uint32_t mFlushed;
00140
00141 void operator=(const PxGpuCopyDescQueue&);
00142 };
00143
00144 PX_POP_PACK
00145
00146 }
00147
00148 #endif // PX_SUPPORT_GPU_PHYSX
00149 #endif // PXCUDACONTEXTMANAGER_PXGPUCOPYDESCQUEUE_H