diff --git a/client/TracyCallstack.h b/client/TracyCallstack.h index 4145421f..6a125010 100644 --- a/client/TracyCallstack.h +++ b/client/TracyCallstack.h @@ -6,7 +6,10 @@ #endif #if defined _WIN32 -# define TRACY_HAS_CALLSTACK 1 +# include "../common/TracyUwp.hpp" +# ifndef TRACY_UWP +# define TRACY_HAS_CALLSTACK 1 +# endif #elif defined __ANDROID__ # if !defined __arm__ || __ANDROID_API__ >= 21 # define TRACY_HAS_CALLSTACK 2 diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index ff9ce9c7..86f872af 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -9,6 +9,7 @@ # include # include # include +# include "../common/TracyUwp.hpp" #else # include # include @@ -314,7 +315,9 @@ static void InitFailure( const char* msg ) } else { +# ifndef TRACY_UWP MessageBoxA( nullptr, msg, "Tracy Profiler initialization failure", MB_ICONSTOP ); +# endif } #else fprintf( stderr, "Tracy Profiler initialization failure: %s\n", msg ); @@ -440,8 +443,12 @@ static const char* GetHostInfo() static char buf[1024]; auto ptr = buf; #if defined _WIN32 - t_RtlGetVersion RtlGetVersion = (t_RtlGetVersion)GetProcAddress( GetModuleHandleA( "ntdll.dll" ), "RtlGetVersion" ); - if( !RtlGetVersion ) +# ifdef TRACY_UWP + auto GetVersion = &::GetVersionEx; +# else + auto GetVersion = (t_RtlGetVersion)GetProcAddress( GetModuleHandleA( "ntdll.dll" ), "RtlGetVersion" ); +# endif + if( !GetVersion ) { # ifdef __MINGW32__ ptr += sprintf( ptr, "OS: Windows (MingW)\n" ); @@ -452,7 +459,7 @@ static const char* GetHostInfo() else { RTL_OSVERSIONINFOW ver = { sizeof( RTL_OSVERSIONINFOW ) }; - RtlGetVersion( &ver ); + GetVersion( &ver ); # ifdef __MINGW32__ ptr += sprintf( ptr, "OS: Windows %i.%i.%i (MingW)\n", (int)ver.dwMajorVersion, (int)ver.dwMinorVersion, (int)ver.dwBuildNumber ); @@ -508,9 +515,13 @@ static const char* GetHostInfo() char hostname[512]; gethostname( hostname, 512 ); +# ifdef TRACY_UWP + const char* user = ""; +# else DWORD userSz = UNLEN+1; char user[UNLEN+1]; GetUserNameA( user, &userSz ); +# endif ptr += sprintf( ptr, "User: %s@%s\n", user, hostname ); #else @@ -707,7 +718,7 @@ static BroadcastMessage& GetBroadcastMessage( const char* procname, size_t pnsz, return msg; } -#if defined _WIN32 +#if defined _WIN32 && !defined TRACY_UWP static DWORD s_profilerThreadId = 0; static char s_crashText[1024]; @@ -1382,7 +1393,7 @@ void Profiler::SpawnWorkerThreads() new(s_symbolThread) Thread( LaunchSymbolWorker, this ); #endif -#if defined _WIN32 +#if defined _WIN32 && !defined TRACY_UWP s_profilerThreadId = GetThreadId( s_thread->Handle() ); m_exceptionHandler = AddVectoredExceptionHandler( 1, CrashFilter ); #endif @@ -1416,7 +1427,7 @@ Profiler::~Profiler() { m_shutdown.store( true, std::memory_order_relaxed ); -#if defined _WIN32 +#if defined _WIN32 && !defined TRACY_UWP if( m_crashHandlerInstalled ) RemoveVectoredExceptionHandler( m_exceptionHandler ); #endif @@ -3534,7 +3545,11 @@ void Profiler::ReportTopology() }; #if defined _WIN32 +# ifdef TRACY_UWP + t_GetLogicalProcessorInformationEx _GetLogicalProcessorInformationEx = &::GetLogicalProcessorInformationEx; +# else t_GetLogicalProcessorInformationEx _GetLogicalProcessorInformationEx = (t_GetLogicalProcessorInformationEx)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetLogicalProcessorInformationEx" ); +# endif if( !_GetLogicalProcessorInformationEx ) return; DWORD psz = 0; diff --git a/client/TracySysTrace.hpp b/client/TracySysTrace.hpp index d21d4338..8c663cd7 100644 --- a/client/TracySysTrace.hpp +++ b/client/TracySysTrace.hpp @@ -2,7 +2,10 @@ #define __TRACYSYSTRACE_HPP__ #if !defined TRACY_NO_SYSTEM_TRACING && ( defined _WIN32 || defined __linux__ ) -# define TRACY_HAS_SYSTEM_TRACING +# include "../common/TracyUwp.hpp" +# ifndef TRACY_UWP +# define TRACY_HAS_SYSTEM_TRACING +# endif #endif #ifdef TRACY_HAS_SYSTEM_TRACING diff --git a/common/TracySystem.cpp b/common/TracySystem.cpp index 38ccc6e7..b9754d33 100644 --- a/common/TracySystem.cpp +++ b/common/TracySystem.cpp @@ -10,6 +10,7 @@ # endif # include # include +# include "TracyUwp.hpp" #else # include # include @@ -127,7 +128,11 @@ void ThreadNameMsvcMagic( const THREADNAME_INFO& info ) TRACY_API void SetThreadName( const char* name ) { #if defined _WIN32 +# ifdef TRACY_UWP + static auto _SetThreadDescription = &::SetThreadDescription; +# else static auto _SetThreadDescription = (t_SetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "SetThreadDescription" ); +# endif if( _SetThreadDescription ) { wchar_t buf[256]; @@ -191,7 +196,11 @@ TRACY_API const char* GetThreadName( uint32_t id ) } #else # if defined _WIN32 +# ifdef TRACY_UWP + static auto _GetThreadDescription = &::GetThreadDescription; +# else static auto _GetThreadDescription = (t_GetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetThreadDescription" ); +# endif if( _GetThreadDescription ) { auto hnd = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)id ); diff --git a/common/TracyUwp.hpp b/common/TracyUwp.hpp new file mode 100644 index 00000000..7dce96b9 --- /dev/null +++ b/common/TracyUwp.hpp @@ -0,0 +1,11 @@ +#ifndef __TRACYUWP_HPP__ +#define __TRACYUWP_HPP__ + +#ifdef _WIN32 +# include +# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +# define TRACY_UWP +# endif +#endif + +#endif diff --git a/manual/tracy.tex b/manual/tracy.tex index e53854d8..9c6fd365 100644 --- a/manual/tracy.tex +++ b/manual/tracy.tex @@ -522,6 +522,16 @@ In the case of some programming environments, you may need to take extra steps t If you are using MSVC, you will need to disable the \emph{Edit And Continue} feature, as it makes the compiler non-conformant to some aspects of the C++ standard. In order to do so, open the project properties and go to \menu[,]{C/C++,General,Debug Information Format} and make sure \emph{Program Database for Edit And Continue (/ZI)} is \emph{not} selected. +\paragraph{Universal Windows Platform} + +Due to a restricted access to Win32 APIs and other sandboxing issues (like network isolation), several limitations apply to using Tracy in a UWP application compared to Windows Desktop: + +\begin{itemize} +\item Call stack sampling is not available. +\item System profiling is not available. +\item To be able to connect from another machine on the local network, the app needs the \emph{privateNetworkClientServer} capability. To connect from localhost, an active inbound loopback exemption is also necessary \footnote{\url{https://docs.microsoft.com/en-us/windows/uwp/communication/interprocess-communication\#loopback}}. +\end{itemize} + \paragraph{Apple woes} Because Apple \emph{has} to be \emph{think different}, there are some problems with using Tracy on OSX and iOS. First, the performance hit due to profiling is higher than on other platforms. Second, some critical features are missing and won't be possible to achieve: