| 1 | /* |
| 2 | * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. |
| 3 | * |
| 4 | * NVIDIA CORPORATION and its licensors retain all intellectual property |
| 5 | * and proprietary rights in and to this software, related documentation |
| 6 | * and any modifications thereto. Any use, reproduction, disclosure or |
| 7 | * distribution of this software and related documentation without an express |
| 8 | * license agreement from NVIDIA CORPORATION is strictly prohibited. |
| 9 | */ |
| 10 | |
| 11 | #ifndef PX_PROFILE_ZONE_H |
| 12 | #define PX_PROFILE_ZONE_H |
| 13 | |
| 14 | #include "physxprofilesdk/PxProfileEventBufferClientManager.h" |
| 15 | #include "physxprofilesdk/PxProfileEventNames.h" |
| 16 | #include "physxprofilesdk/PxProfileEventFilter.h" |
| 17 | #include "physxprofilesdk/PxProfileEventSender.h" |
| 18 | |
| 19 | namespace physx { |
| 20 | |
| 21 | class PxUserCustomProfiler; |
| 22 | |
| 23 | class PxProfileZoneManager; |
| 24 | /** |
| 25 | * The profiling system was setup in the expectation that there would be several |
| 26 | * systems that each had its own island of profile information. PhysX, client code, |
| 27 | * and APEX would be the first examples of these. Each one of these islands is represented |
| 28 | * by a profile zone. |
| 29 | * |
| 30 | * A profile zone combines a name, a place where all the events coming from its interface |
| 31 | * can flushed, and a mapping from event number to full event name. |
| 32 | * |
| 33 | * It also provides a top level filtering service where profile events |
| 34 | * can be filtered by event id. |
| 35 | * |
| 36 | * The profile zone implements a system where if there is no one |
| 37 | * listening to events it doesn't provide a mechanism to send them. In this way |
| 38 | * the event system is short circuited when there aren't any clients. |
| 39 | * |
| 40 | * All functions on this interface should be considered threadsafe. |
| 41 | */ |
| 42 | class PxProfileZone : public PxProfileZoneClientManager |
| 43 | , public PxProfileNameProvider |
| 44 | , public PxProfileEventSender |
| 45 | , public PxProfileEventFlusher |
| 46 | { |
| 47 | protected: |
| 48 | virtual ~PxProfileZone(){} |
| 49 | public: |
| 50 | virtual const char* getName() = 0; |
| 51 | virtual void release() = 0; |
| 52 | |
| 53 | virtual void setProfileZoneManager(PxProfileZoneManager* inMgr) = 0; |
| 54 | virtual PxProfileZoneManager* getProfileZoneManager() = 0; |
| 55 | |
| 56 | //Get or create a new event id for a given name. |
| 57 | //If you pass in a previously defined event name (including one returned) |
| 58 | //from the name provider) you will just get the same event id back. |
| 59 | virtual PxU16 getEventIdForName( const char* inName ) = 0; |
| 60 | |
| 61 | /** |
| 62 | \brief Reserve a contiguous set of profile event ids for a set of names. |
| 63 | |
| 64 | This function does not do any meaningful error checking other than to ensure |
| 65 | that if it does generate new ids they are contiguous. If the first name is already |
| 66 | registered, that is the ID that will be returned regardless of what other |
| 67 | names are registered. Thus either use this function alone (without the above |
| 68 | function) or don't use it. |
| 69 | If you register "one","two","three" and the function returns an id of 4, then |
| 70 | "one" is mapped to 4, "two" is mapped to 5, and "three" is mapped to 6. |
| 71 | |
| 72 | \param inNames set of names to register. |
| 73 | \param inLen Length of the name list. |
| 74 | |
| 75 | \return The first id associated with the first name. The rest of the names |
| 76 | will be associated with monotonically incrementing PxU16 values from the first |
| 77 | id. |
| 78 | */ |
| 79 | virtual PxU16 getEventIdsForNames( const char** inNames, PxU32 inLen ) = 0; |
| 80 | |
| 81 | /** |
| 82 | \brief Specifies an optional user custom profiler interface for this profile zone. |
| 83 | \param up Specifies the PxUserCustomProfiler interface for this zone. A NULL disables event notification. |
| 84 | */ |
| 85 | virtual void setUserCustomProfiler(PxUserCustomProfiler* up) = 0; |
| 86 | /** |
| 87 | \brief Create a new profile zone. |
| 88 | |
| 89 | \param inFoundation memory allocation is controlled through the foundation if one is passed in. |
| 90 | \param inSDKName Name of the profile zone; useful for clients to understand where events came from. |
| 91 | \param inProvider Mapping from event id -> event name. |
| 92 | \param inEventBufferByteSize Size of the canonical event buffer. This does not need to be a large number |
| 93 | as profile events are fairly small individually. |
| 94 | \return a profile zone implementation. |
| 95 | */ |
| 96 | static PxProfileZone& createProfileZone( PxFoundation* inFoundation, const char* inSDKName, PxProfileNames inNames = PxProfileNames(), PxU32 inEventBufferByteSize = 0x4000 /*16k*/ ); |
| 97 | static PxProfileZone& createProfileZone( PxAllocatorCallback* inAllocator, const char* inSDKName, PxProfileNames inNames = PxProfileNames(), PxU32 inEventBufferByteSize = 0x4000 /*16k*/ ); |
| 98 | |
| 99 | |
| 100 | /** deprecated forms of the above functions */ |
| 101 | static PxProfileZone& createProfileZone( PxFoundation* inFoundation, const char* inSDKName, PxProfileNameProvider& inProvider, PxU32 inEventBufferByteSize = 0x4000 /*16k*/ ); |
| 102 | static PxProfileZone& createProfileZone( PxAllocatorCallback* inAllocator, const char* inSDKName, PxProfileNameProvider& inProvider, PxU32 inEventBufferByteSize = 0x4000 /*16k*/ ); |
| 103 | }; |
| 104 | } |
| 105 | #endif // PX_PROFILE_ZONE_H |
| 106 | |