119 typedef TContextProvider TContextProviderType;
120 typedef TEventFilter TEventFilterType;
121 typedef typename TBaseType::TMutexType TMutexType;
122 typedef typename TBaseType::TScopedLockType TScopedLockType;
128 TContextProvider mContextProvider;
129 TEventFilterType mEventFilter;
130 volatile int32_t mReserved;
131 volatile int32_t mWritten;
135 , uint32_t inBufferFullAmount
136 ,
const TContextProvider& inProvider
137 , TMutexType* inBufferMutex
138 ,
const TEventFilterType& inEventFilter)
139 :
TBaseType(inFoundation, inBufferFullAmount, inBufferMutex,
"struct physx::profile::ProfileEvent")
140 , mContextProvider(inProvider)
141 , mEventFilter(inEventFilter)
147 TContextProvider& getContextProvider() {
return mContextProvider; }
149 PX_FORCE_INLINE void startEvent(uint16_t inId, uint32_t threadId, uint64_t contextId, uint8_t cpuId, uint8_t threadPriority, uint64_t inTimestamp)
151 if (mEventFilter.isEventEnabled(inId))
154 theEvent.init(threadId, contextId, cpuId, threadPriority, inTimestamp);
155 doAddProfileEvent(inId, theEvent);
162 startEvent(inId, ctx.mThreadId, contextId, ctx.mCpuId,
static_cast<uint8_t
>(ctx.mThreadPriority), PxTime::getCurrentCounterValue());
165 PX_FORCE_INLINE void startEvent(uint16_t inId, uint64_t contextId, uint32_t threadId)
167 startEvent(inId, threadId, contextId, 0, 0, PxTime::getCurrentCounterValue());
170 PX_FORCE_INLINE void stopEvent(uint16_t inId, uint32_t threadId, uint64_t contextId, uint8_t cpuId, uint8_t threadPriority, uint64_t inTimestamp)
172 if (mEventFilter.isEventEnabled(inId))
175 theEvent.init(threadId, contextId, cpuId, threadPriority, inTimestamp);
176 doAddProfileEvent(inId, theEvent);
183 stopEvent(inId, ctx.mThreadId, contextId, ctx.mCpuId,
static_cast<uint8_t
>(ctx.mThreadPriority), PxTime::getCurrentCounterValue());
186 PX_FORCE_INLINE void stopEvent(uint16_t inId, uint64_t contextId, uint32_t threadId)
188 stopEvent(inId, threadId, contextId, 0, 0, PxTime::getCurrentCounterValue());
191 inline void eventValue(uint16_t inId, uint64_t contextId, int64_t inValue)
193 eventValue(inId, mContextProvider.getThreadId(), contextId, inValue);
196 inline void eventValue(uint16_t inId, uint32_t threadId, uint64_t contextId, int64_t inValue)
199 theEvent.init(inValue, contextId, threadId);
200 EventHeader theHeader(
static_cast<uint8_t
>(getEventType<EventValue>()), inId);
203 theType.setupHeader(theHeader);
205 int32_t sizeToWrite = int32_t(
sizeof(theHeader) + theType.getEventSize(theHeader));
206 int32_t reserved = PxAtomicAdd(&mReserved, sizeToWrite);
207 sendEvent(theHeader, theType, reserved, sizeToWrite);
210 void flushProfileEvents(int32_t reserved = -1)
212 TScopedLockType lock(TBaseType::mBufferMutex);
215 int32_t reservedOld = PxAtomicExchange(&mReserved, int32_t(TBaseType::mBufferFullAmount + 1));
217 reserved = reservedOld;
220 while (reserved > mWritten)
225 PX_ASSERT(reserved == mWritten);
228 TBaseType::mSerializer.mArray->setEnd(TBaseType::mSerializer.mArray->begin() + mWritten);
231 TBaseType::flushEvents();
240 PX_PROFILE_DELETE(TBaseType::mWrapper.mUserFoundation,
this);
246 void clearCachedData()
250 template<
typename TProfileEventType>
251 PX_FORCE_INLINE void doAddProfileEvent(uint16_t eventId,
const TProfileEventType& inType)
253 doAddEvent(
static_cast<uint8_t
>(getEventType<TProfileEventType>()), eventId, inType);
256 template<
typename TDataType>
257 PX_FORCE_INLINE void doAddEvent(uint8_t inEventType, uint16_t eventId,
const TDataType& inType)
260 TDataType& theType(
const_cast<TDataType&
>(inType));
261 theType.setupHeader(theHeader, 0);
263 const int32_t sizeToWrite = int32_t(
sizeof(theHeader) + theType.getEventSize(theHeader));
265 int32_t reserved = PxAtomicAdd(&mReserved, sizeToWrite);
266 sendEvent(theHeader, theType, reserved, sizeToWrite);
269 template<
typename TDataType>
273 if (reserved - sizeToWrite >= int32_t(TBaseType::mBufferFullAmount))
275 while (reserved - sizeToWrite >= int32_t(TBaseType::mBufferFullAmount))
278 if (mReserved < int32_t(TBaseType::mBufferFullAmount))
280 reserved = PxAtomicAdd(&mReserved, sizeToWrite);
285 int32_t writeIndex = reserved - sizeToWrite;
286 uint32_t writtenSize = 0;
288 PX_ASSERT(writeIndex >= 0);
290 PX_ALLOCA(tempBuffer, uint8_t, sizeToWrite);
294 writtenSize = inHeader.streamify(eventSerializer);
295 writtenSize += inType.streamify(eventSerializer, inHeader);
297 TBaseType::mSerializer.mArray->reserve(writeIndex + writtenSize);
298 TBaseType::mSerializer.mArray->write(&tempBuffer[0], writtenSize, writeIndex);
300 PX_ASSERT(writtenSize == uint32_t(sizeToWrite));
301 PxAtomicAdd(&mWritten, sizeToWrite);
303 if (reserved >= int32_t(TBaseType::mBufferFullAmount))
305 TScopedLockType lock(TBaseType::mBufferMutex);
307 if(mReserved >= reserved)
308 flushProfileEvents(reserved);