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
00029 #ifndef NVBLASTTKGROUPIMPL_H
00030 #define NVBLASTTKGROUPIMPL_H
00031
00032
00033 #include "NvBlastTkTaskImpl.h"
00034 #include "NvBlastTkGroup.h"
00035 #include "NvBlastTkTypeImpl.h"
00036
00037
00038 namespace Nv
00039 {
00040 namespace Blast
00041 {
00042
00043 class TkActorImpl;
00044 class TkFamilyImpl;
00045
00046 NVBLASTTK_IMPL_DECLARE(Group)
00047 {
00048 ~TkGroupImpl();
00049
00050 public:
00051 TkGroupImpl();
00052
00053 NVBLASTTK_IMPL_DEFINE_IDENTIFIABLE('G', 'R', 'P', '\0');
00054
00055 static TkGroupImpl* create(const TkGroupDesc& desc);
00056
00057
00058 virtual bool addActor(TkActor& actor) override;
00059
00060 virtual uint32_t getActorCount() const override;
00061
00062 virtual uint32_t getActors(TkActor** buffer, uint32_t bufferSize, uint32_t indexStart = 0) const override;
00063
00064 virtual uint32_t startProcess() override;
00065 virtual bool endProcess() override;
00066
00067 virtual void getStats(TkGroupStats& stats) const override;
00068
00069 virtual void setWorkerCount(uint32_t workerCount) override;
00070 virtual uint32_t getWorkerCount() const override;
00071
00072 virtual TkGroupWorker* acquireWorker() override;
00073 virtual void returnWorker(TkGroupWorker*) override;
00074
00075
00076
00077
00085 bool removeActor(TkActor& actor);
00086
00091 void enqueue(TkActorImpl* tkActor);
00092
00098 bool isProcessing() const;
00099
00100 private:
00109 bool setProcessing(bool value);
00110
00114 SharedMemory* getSharedMemory(TkFamilyImpl* family);
00115 void releaseSharedMemory(TkFamilyImpl* fam, SharedMemory* mem);
00116
00117
00118 void addActorInternal(TkActorImpl& tkActor);
00119 void addActorsInternal(TkActorImpl** actors, uint32_t numActors);
00120 void removeActorInternal(TkActorImpl& tkActor);
00121
00122
00123 uint32_t m_actorCount;
00124
00125 HashMap<TkFamilyImpl*, SharedMemory*>::type m_sharedMemory;
00126
00127
00128 SharedBlock<NvBlastChunkFractureData> m_chunkTempDataBlock;
00129 SharedBlock<NvBlastBondFractureData> m_bondTempDataBlock;
00130 SharedBlock<NvBlastChunkFractureData> m_chunkEventDataBlock;
00131 SharedBlock<NvBlastBondFractureData> m_bondEventDataBlock;
00132 SharedBlock<char> m_splitScratchBlock;
00133
00134 std::atomic<bool> m_isProcessing;
00135
00136 Array<TkWorker>::type m_workers;
00137
00138 Array<TkWorkerJob>::type m_jobs;
00139
00140
00141 TkGroupStats m_stats;
00142
00143
00144 std::mutex m_workerMtx;
00145
00146 friend class TkWorker;
00147 };
00148
00149
00150 NV_INLINE bool TkGroupImpl::isProcessing() const
00151 {
00152 return m_isProcessing.load();
00153 }
00154
00155
00156 NV_INLINE void TkGroupImpl::getStats(TkGroupStats& stats) const
00157 {
00158 #if NV_PROFILE
00159 memcpy(&stats, &m_stats, sizeof(TkGroupStats));
00160 #else
00161 NV_UNUSED(stats);
00162 #endif
00163 }
00164
00165
00166 NV_INLINE uint32_t TkGroupImpl::getActorCount() const
00167 {
00168 return m_actorCount;
00169 }
00170
00171
00172 NV_INLINE SharedMemory* TkGroupImpl::getSharedMemory(TkFamilyImpl* family)
00173 {
00174 SharedMemory* mem = m_sharedMemory[family];
00175 NVBLAST_ASSERT(mem != nullptr);
00176 return mem;
00177 }
00178
00179
00180 NV_FORCE_INLINE void operator +=(NvBlastTimers& lhs, const NvBlastTimers& rhs)
00181 {
00182 lhs.material += rhs.material;
00183 lhs.fracture += rhs.fracture;
00184 lhs.island += rhs.fracture;
00185 lhs.partition += rhs.partition;
00186 lhs.visibility += rhs.visibility;
00187 }
00188
00189
00190 }
00191 }
00192
00193
00194 #endif // ifndef NVBLASTTKGROUPIMPL_H