27#ifndef PX_PROFILE_EVENTS_H
28#define PX_PROFILE_EVENTS_H
30#include "foundation/PxMath.h"
31#include "foundation/PxAssert.h"
33#include "PxProfileEventId.h"
36#define PX_PROFILE_UNION_1(a) physx::profile::TUnion<a, physx::profile::Empty>
37#define PX_PROFILE_UNION_2(a,b) physx::profile::TUnion<a, PX_PROFILE_UNION_1(b)>
38#define PX_PROFILE_UNION_3(a,b,c) physx::profile::TUnion<a, PX_PROFILE_UNION_2(b,c)>
39#define PX_PROFILE_UNION_4(a,b,c,d) physx::profile::TUnion<a, PX_PROFILE_UNION_3(b,c,d)>
40#define PX_PROFILE_UNION_5(a,b,c,d,e) physx::profile::TUnion<a, PX_PROFILE_UNION_4(b,c,d,e)>
41#define PX_PROFILE_UNION_6(a,b,c,d,e,f) physx::profile::TUnion<a, PX_PROFILE_UNION_5(b,c,d,e,f)>
42#define PX_PROFILE_UNION_7(a,b,c,d,e,f,g) physx::profile::TUnion<a, PX_PROFILE_UNION_6(b,c,d,e,f,g)>
43#define PX_PROFILE_UNION_8(a,b,c,d,e,f,g,h) physx::profile::TUnion<a, PX_PROFILE_UNION_7(b,c,d,e,f,g,h)>
44#define PX_PROFILE_UNION_9(a,b,c,d,e,f,g,h,i) physx::profile::TUnion<a, PX_PROFILE_UNION_8(b,c,d,e,f,g,h,i)>
46namespace physx {
namespace profile {
52 template <
typename U,
typename V>
61 template <
typename TDataType>
62 void init(
const TDataType& inData)
67 template <
typename TDataType>
72 template <
typename TDataType>
105#pragma clang diagnostic push
106#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
113 inline EventStreamCompressionFlags::Enum findCompressionValue( uint64_t inValue, EventStreamCompressionFlags::Enum inCurrentCompressionValue = EventStreamCompressionFlags::U8 )
115 PX_ASSERT_WITH_MESSAGE( (inCurrentCompressionValue >= EventStreamCompressionFlags::U8) &&
116 (inCurrentCompressionValue <= EventStreamCompressionFlags::U64),
117 "Invalid inCurrentCompressionValue in profile::findCompressionValue");
120 switch( inCurrentCompressionValue )
122 case EventStreamCompressionFlags::U8:
123 if ( inValue <= UINT8_MAX )
124 return EventStreamCompressionFlags::U8;
125 case EventStreamCompressionFlags::U16:
126 if ( inValue <= UINT16_MAX )
127 return EventStreamCompressionFlags::U16;
128 case EventStreamCompressionFlags::U32:
129 if ( inValue <= UINT32_MAX )
130 return EventStreamCompressionFlags::U32;
131 case EventStreamCompressionFlags::U64:
134 return EventStreamCompressionFlags::U64;
141 inline EventStreamCompressionFlags::Enum findCompressionValue( uint32_t inValue, EventStreamCompressionFlags::Enum inCurrentCompressionValue = EventStreamCompressionFlags::U8 )
143 PX_ASSERT_WITH_MESSAGE( (inCurrentCompressionValue >= EventStreamCompressionFlags::U8) &&
144 (inCurrentCompressionValue <= EventStreamCompressionFlags::U64),
145 "Invalid inCurrentCompressionValue in profile::findCompressionValue");
148 switch( inCurrentCompressionValue )
150 case EventStreamCompressionFlags::U8:
151 if ( inValue <= UINT8_MAX )
152 return EventStreamCompressionFlags::U8;
153 case EventStreamCompressionFlags::U16:
154 if ( inValue <= UINT16_MAX )
155 return EventStreamCompressionFlags::U16;
156 case EventStreamCompressionFlags::U32:
157 case EventStreamCompressionFlags::U64:
160 return EventStreamCompressionFlags::U32;
164#pragma clang diagnostic pop
171 uint8_t mStreamOptions;
175 , mStreamOptions( uint8_t(-1) )
181 : mEventType(
static_cast<uint8_t
>( type ) )
182 , mStreamOptions( uint8_t(-1) )
187 EventStreamCompressionFlags::Enum getTimestampCompressionFlags()
const
189 return static_cast<EventStreamCompressionFlags::Enum
> ( mStreamOptions & EventStreamCompressionFlags::CompressionMask );
192 uint64_t compressTimestamp( uint64_t inLastTimestamp, uint64_t inCurrentTimestamp )
194 mStreamOptions = EventStreamCompressionFlags::U64;
195 uint64_t retval = inCurrentTimestamp;
196 if ( inLastTimestamp )
198 retval = inCurrentTimestamp - inLastTimestamp;
199 EventStreamCompressionFlags::Enum compressionValue = findCompressionValue( retval );
200 mStreamOptions =
static_cast<uint8_t
>( compressionValue );
201 if ( compressionValue == EventStreamCompressionFlags::U64 )
202 retval = inCurrentTimestamp;
207 uint64_t uncompressTimestamp( uint64_t inLastTimestamp, uint64_t inCurrentTimestamp )
const
209 if ( getTimestampCompressionFlags() != EventStreamCompressionFlags::U64 )
210 return inLastTimestamp + inCurrentTimestamp;
211 return inCurrentTimestamp;
214 void setContextIdCompressionFlags( uint64_t inContextId )
216 uint8_t options =
static_cast<uint8_t
>( findCompressionValue( inContextId ) );
217 mStreamOptions = uint8_t(mStreamOptions | options << 2);
220 EventStreamCompressionFlags::Enum getContextIdCompressionFlags()
const
222 return static_cast< EventStreamCompressionFlags::Enum
>( ( mStreamOptions >> 2 ) & EventStreamCompressionFlags::CompressionMask );
225 bool operator==(
const EventHeader& inOther )
const
227 return mEventType == inOther.mEventType
228 && mStreamOptions == inOther.mStreamOptions
229 && mEventId == inOther.mEventId;
232 template<
typename TStreamType>
233 inline uint32_t streamify( TStreamType& inStream )
235 uint32_t writtenSize = inStream.streamify(
"EventType", mEventType );
236 writtenSize += inStream.streamify(
"StreamOptions", mStreamOptions);
237 writtenSize += inStream.streamify(
"EventId", mEventId);
245 template<
typename TDataType>
246 inline EventTypes::Enum getEventType() { PX_ASSERT(
false );
return EventTypes::Unknown; }
252 uint64_t mTensOfNanoSeconds;
253 void init( uint64_t inTs ) { mTensOfNanoSeconds = inTs; }
254 void init(
const RelativeProfileEvent& inData ) { mTensOfNanoSeconds = inData.mTensOfNanoSeconds; }
257 return mTensOfNanoSeconds == other.mTensOfNanoSeconds;
259 template<
typename TStreamType>
260 uint32_t streamify( TStreamType& inStream,
const EventHeader& inHeader )
262 return inStream.streamify(
"TensOfNanoSeconds", mTensOfNanoSeconds, inHeader.getTimestampCompressionFlags() );
264 uint64_t getTimestamp()
const {
return mTensOfNanoSeconds; }
265 void setTimestamp( uint64_t inTs ) { mTensOfNanoSeconds = inTs; }
266 void setupHeader(
EventHeader& inHeader, uint64_t inLastTimestamp )
268 mTensOfNanoSeconds = inHeader.compressTimestamp( inLastTimestamp, mTensOfNanoSeconds );
274 switch (inHeader.getTimestampCompressionFlags())
276 case EventStreamCompressionFlags::U8:
279 case EventStreamCompressionFlags::U16:
282 case EventStreamCompressionFlags::U32:
285 case EventStreamCompressionFlags::U64:
296 void init( uint64_t inTs = 0 ) { RelativeProfileEvent::init( inTs ); }
297 void init(
const RelativeStartEvent& inData ) { RelativeProfileEvent::init( inData ); }
298 template<
typename THandlerType>
299 void handle( THandlerType* inHdlr, uint16_t eventId, uint32_t thread, uint64_t
context, uint8_t inCpuId, uint8_t threadPriority )
const
301 inHdlr->onStartEvent(
PxProfileEventId( eventId ), thread,
context, inCpuId, threadPriority, mTensOfNanoSeconds );
305 template<>
inline EventTypes::Enum getEventType<RelativeStartEvent>() {
return EventTypes::RelativeStartEvent; }
310 void init( uint64_t inTs = 0 ) { RelativeProfileEvent::init( inTs ); }
311 void init(
const RelativeStopEvent& inData ) { RelativeProfileEvent::init( inData ); }
312 template<
typename THandlerType>
313 void handle( THandlerType* inHdlr, uint16_t eventId, uint32_t thread, uint64_t
context, uint8_t inCpuId, uint8_t threadPriority )
const
315 inHdlr->onStopEvent(
PxProfileEventId( eventId ), thread,
context, inCpuId, threadPriority, mTensOfNanoSeconds );
319 template<>
inline EventTypes::Enum getEventType<RelativeStopEvent>() {
return EventTypes::RelativeStopEvent; }
325 uint8_t mThreadPriority;
328 void init( uint32_t inThreadId = UINT32_MAX
329 , uint64_t inContextId = (uint64_t(-1))
330 , uint8_t inPriority = UINT8_MAX
331 , uint8_t inCpuId = UINT8_MAX )
333 mContextId = inContextId;
334 mThreadId = inThreadId;
335 mThreadPriority = inPriority;
341 mContextId = inData.mContextId;
342 mThreadId = inData.mThreadId;
343 mThreadPriority = inData.mThreadPriority;
344 mCpuId = inData.mCpuId;
347 template<
typename TStreamType>
348 uint32_t streamify( TStreamType& inStream, EventStreamCompressionFlags::Enum inContextIdFlags )
350 uint32_t writtenSize = inStream.streamify(
"ThreadId", mThreadId );
351 writtenSize += inStream.streamify(
"ContextId", mContextId, inContextIdFlags);
352 writtenSize += inStream.streamify(
"ThreadPriority", mThreadPriority);
353 writtenSize += inStream.streamify(
"CpuId", mCpuId);
359 return mThreadId == other.mThreadId
360 && mContextId == other.mContextId
361 && mThreadPriority == other.mThreadPriority
362 && mCpuId == other.mCpuId;
377 void init( uint32_t inThreadId, uint64_t inContextId, uint8_t inCpuId, uint8_t inPriority, uint64_t inTs )
379 mContextInformation.init( inThreadId, inContextId, inPriority, inCpuId );
380 mTimeData.init( inTs );
385 mContextInformation.init( inData.mContextInformation );
386 mTimeData.init( inData.mTimeData );
391 return mContextInformation == other.mContextInformation
392 && mTimeData == other.mTimeData;
395 template<
typename TStreamType>
396 uint32_t streamify( TStreamType& inStream,
const EventHeader& inHeader )
398 uint32_t writtenSize = mContextInformation.streamify(inStream, inHeader.getContextIdCompressionFlags());
399 writtenSize += mTimeData.streamify(inStream, inHeader);
405 uint32_t eventSize = 0;
407 switch (inHeader.getTimestampCompressionFlags())
409 case EventStreamCompressionFlags::U8:
412 case EventStreamCompressionFlags::U16:
415 case EventStreamCompressionFlags::U32:
418 case EventStreamCompressionFlags::U64:
426 switch (inHeader.getContextIdCompressionFlags())
428 case EventStreamCompressionFlags::U8:
431 case EventStreamCompressionFlags::U16:
434 case EventStreamCompressionFlags::U32:
437 case EventStreamCompressionFlags::U64:
445 uint64_t getTimestamp()
const {
return mTimeData.getTimestamp(); }
446 void setTimestamp( uint64_t inTs ) { mTimeData.setTimestamp( inTs ); }
448 void setupHeader(
EventHeader& inHeader, uint64_t inLastTimestamp )
450 mTimeData.setupHeader( inHeader, inLastTimestamp );
451 inHeader.setContextIdCompressionFlags( mContextInformation.mContextId );
458 void init( uint32_t inThreadId = 0, uint64_t inContextId = 0, uint8_t inCpuId = 0, uint8_t inPriority = 0, uint64_t inTensOfNanoSeconds = 0 )
460 ProfileEvent::init( inThreadId, inContextId, inCpuId, inPriority, inTensOfNanoSeconds );
464 ProfileEvent::init( inData );
468 EventTypes::Enum getRelativeEventType()
const {
return getEventType<RelativeStartEvent>(); }
471 template<>
inline EventTypes::Enum getEventType<StartEvent>() {
return EventTypes::StartEvent; }
476 void init( uint32_t inThreadId = 0, uint64_t inContextId = 0, uint8_t inCpuId = 0, uint8_t inPriority = 0, uint64_t inTensOfNanoSeconds = 0 )
478 ProfileEvent::init( inThreadId, inContextId, inCpuId, inPriority, inTensOfNanoSeconds );
482 ProfileEvent::init( inData );
485 EventTypes::Enum getRelativeEventType()
const {
return getEventType<RelativeStopEvent>(); }
488 template<>
inline EventTypes::Enum getEventType<StopEvent>() {
return EventTypes::StopEvent; }
495 void init( int64_t inValue = 0, uint64_t inContextId = 0, uint32_t inThreadId = 0 )
497 mValue =
static_cast<uint64_t
>( inValue );
498 mContextId = inContextId;
499 mThreadId = inThreadId;
504 mValue = inData.mValue;
505 mContextId = inData.mContextId;
506 mThreadId = inData.mThreadId;
509 int64_t getValue()
const {
return static_cast<int16_t
>( mValue ); }
513 mValue = inHeader.compressTimestamp( 0, mValue );
514 inHeader.setContextIdCompressionFlags( mContextId );
517 template<
typename TStreamType>
518 uint32_t streamify( TStreamType& inStream,
const EventHeader& inHeader )
520 uint32_t writtenSize = inStream.streamify(
"Value", mValue, inHeader.getTimestampCompressionFlags());
521 writtenSize += inStream.streamify(
"ContextId", mContextId, inHeader.getContextIdCompressionFlags());
522 writtenSize += inStream.streamify(
"ThreadId", mThreadId);
528 uint32_t eventSize = 0;
530 switch (inHeader.getTimestampCompressionFlags())
532 case EventStreamCompressionFlags::U8:
535 case EventStreamCompressionFlags::U16:
538 case EventStreamCompressionFlags::U32:
541 case EventStreamCompressionFlags::U64:
547 switch (inHeader.getContextIdCompressionFlags())
549 case EventStreamCompressionFlags::U8:
552 case EventStreamCompressionFlags::U16:
555 case EventStreamCompressionFlags::U32:
558 case EventStreamCompressionFlags::U64:
568 bool operator==(
const EventValue& other )
const
570 return mValue == other.mValue
571 && mContextId == other.mContextId
572 && mThreadId == other.mThreadId;
575 template<
typename THandlerType>
576 void handle( THandlerType* inHdlr, uint16_t eventId )
const
578 inHdlr->onEventValue(
PxProfileEventId( eventId ), mThreadId, mContextId, getValue() );
582 template<>
inline EventTypes::Enum getEventType<EventValue>() {
return EventTypes::EventValue; }
589 const uint8_t* mCudaData;
593 template<
typename TStreamType>
594 uint32_t streamify( TStreamType& inStream,
const EventHeader& )
596 uint32_t writtenSize = inStream.streamify(
"Timestamp", mTimestamp);
597 writtenSize += inStream.streamify(
"Timespan", mTimespan);
598 writtenSize += inStream.streamify(
"CudaData", mCudaData, mBufLen);
599 writtenSize += inStream.streamify(
"BufLen", mBufLen);
600 writtenSize += inStream.streamify(
"Version", mVersion);
606 return mTimestamp == other.mTimestamp
607 && mTimespan == other.mTimespan
608 && mBufLen == other.mBufLen
609 && memcmp( mCudaData, other.mCudaData, mBufLen ) == 0
610 && mVersion == other.mVersion;
614 template<>
inline EventTypes::Enum getEventType<CUDAProfileBuffer>() {
return EventTypes::CUDAProfileBuffer; }
617 template <
typename TEventData>
622 template<
typename TDataType>
bool operator()(
const TDataType& inRhs )
const {
return mData.toType(
Type2Type<TDataType>() ) == inRhs; }
623 bool operator()()
const {
return false; }
641 template <
typename TDataType>
643 : mHeader( inHeader )
645 mData.init<TDataType>(inData);
648 template<
typename TDataType>
649 Event( uint16_t eventId,
const TDataType& inData )
650 : mHeader( getEventType<TDataType>(), eventId )
652 mData.init<TDataType>(inData);
654 const EventHeader& getHeader()
const {
return mHeader; }
655 const EventData& getData()
const {
return mData; }
657 template<
typename TDataType>
658 const TDataType& getValue()
const { PX_ASSERT( mHeader.mEventType == getEventType<TDataType>() );
return mData.toType<TDataType>(); }
660 template<
typename TDataType>
661 TDataType& getValue() { PX_ASSERT( mHeader.mEventType == getEventType<TDataType>() );
return mData.toType<TDataType>(); }
663 template<
typename TRetVal,
typename TOperator>
664 inline TRetVal visit( TOperator inOp )
const;
666 bool operator==(
const Event& inOther )
const
668 if ( !(mHeader == inOther.mHeader ) )
return false;
669 if ( mHeader.mEventType )
679 template<
typename TRetVal,
typename TOperator>
680 TRetVal visit( EventTypes::Enum inEventType,
const Event::EventData& inData, TOperator inOperator )
682 switch( inEventType )
691 case EventTypes::Unknown:
break;
693 uint8_t type =
static_cast<uint8_t
>( inEventType );
694 return inOperator( type );
697 template<
typename TRetVal,
typename TOperator>
698 inline TRetVal Event::visit( TOperator inOp )
const
700 return physx::profile::visit<TRetVal>(
static_cast<EventTypes::Enum
>(mHeader.mEventType), mData, inOp );
Definition PxProfileEvents.h:631
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
Definition PxProfileEvents.h:586
Definition PxProfileEvents.h:48
Definition PxProfileEvents.h:322
Definition PxProfileEvents.h:619
Definition PxProfileEvents.h:93
Definition PxProfileEvents.h:79
Definition PxProfileEvents.h:491
Definition PxProfileEvents.h:374
A event id structure. Optionally includes information about if the event was enabled at compile time.
Definition PxProfileEventId.h:38
Definition PxProfileEvents.h:251
Definition PxProfileEvents.h:295
Definition PxProfileEvents.h:309
Definition PxProfileEvents.h:457
Definition PxProfileEvents.h:475
Definition PxProfileEvents.h:50
Definition PxProfileEvents.h:54