Merge pull request #324 from shapr3d/uwp_fix

Make Tracy usable in UWP applications
This commit is contained in:
Bartosz Taudul 2022-02-11 20:20:18 +01:00 committed by GitHub
commit a2d017c456
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 8 deletions

View File

@ -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

View File

@ -9,6 +9,7 @@
# include <tlhelp32.h>
# include <inttypes.h>
# include <intrin.h>
# include "../common/TracyUwp.hpp"
#else
# include <sys/time.h>
# include <sys/param.h>
@ -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;

View File

@ -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

View File

@ -10,6 +10,7 @@
# endif
# include <windows.h>
# include <malloc.h>
# include "TracyUwp.hpp"
#else
# include <pthread.h>
# include <string.h>
@ -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 );

11
common/TracyUwp.hpp Normal file
View File

@ -0,0 +1,11 @@
#ifndef __TRACYUWP_HPP__
#define __TRACYUWP_HPP__
#ifdef _WIN32
# include <winapifamily.h>
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
# define TRACY_UWP
# endif
#endif
#endif

View File

@ -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: