diff --git a/.gitmodules b/.gitmodules index 628c920d..9a2bed90 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,3 +34,6 @@ [submodule "deps/jolt-physics-sharp"] path = deps/jolt-physics-sharp url = https://github.com/amerkoleci/JoltPhysicsSharp +[submodule "deps/tracy"] + path = deps/tracy + url = https://github.com/wolfpld/tracy diff --git a/CMakeLists.txt b/CMakeLists.txt index a4d1ad79..1eeb37c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,9 @@ option(LOVR_USE_WEBXR "Enable the WebXR backend for the headset module" OFF) option(LOVR_USE_SIMULATOR "Enable the keyboard/mouse backend for the headset module" ON) option(LOVR_USE_STEAM_AUDIO "Enable the Steam Audio spatializer (be sure to also set LOVR_STEAM_AUDIO_PATH)" OFF) option(LOVR_USE_OCULUS_AUDIO "Enable the Oculus Audio spatializer (be sure to also set LOVR_OCULUS_AUDIO_PATH)" OFF) + option(LOVR_SANITIZE "Enable Address Sanitizer" OFF) +option(LOVR_PROFILE "Enable Tracy integration" OFF) option(LOVR_SYSTEM_GLFW "Use the system-provided glfw" OFF) option(LOVR_SYSTEM_LUA "Use the system-provided Lua" OFF) @@ -361,6 +363,17 @@ if(LOVR_SANITIZE) target_link_options(lovr PRIVATE ${LOVR_SANITIZE_FLAGS}) endif() +if(LOVR_PROFILE) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + message(FATAL_ERROR "You probably want to build in release mode when Tracy is enabled") + endif() + option(TRACY_ENABLE "" ON) + add_subdirectory(deps/tracy) + target_compile_definitions(lovr PRIVATE LOVR_PROFILE) + target_link_libraries(lovr Tracy::TracyClient) + target_include_directories(lovr PRIVATE deps/tracy/public/tracy) +endif() + if(LOVR_ENABLE_AUDIO OR LOVR_ENABLE_DATA) target_sources(lovr PRIVATE src/lib/miniaudio/miniaudio.c diff --git a/deps/tracy b/deps/tracy new file mode 160000 index 00000000..a9288cd7 --- /dev/null +++ b/deps/tracy @@ -0,0 +1 @@ +Subproject commit a9288cd7594caced17899dda208b0d376b20d892 diff --git a/src/modules/graphics/graphics.c b/src/modules/graphics/graphics.c index 8d1d8694..1b2d775b 100644 --- a/src/modules/graphics/graphics.c +++ b/src/modules/graphics/graphics.c @@ -1793,6 +1793,8 @@ void lovrGraphicsPresent(void) { state.shouldPresent = false; gpu_surface_present(); } + + lovrProfileMarkFrame(); } void lovrGraphicsWait(void) { diff --git a/src/util.h b/src/util.h index 59dd8189..f1586b54 100644 --- a/src/util.h +++ b/src/util.h @@ -67,6 +67,18 @@ enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR }; void lovrSetLogCallback(fn_log* callback, void* userdata); void lovrLog(int level, const char* tag, const char* format, ...); +// Profiling +#ifdef LOVR_PROFILE +#include +#define lovrProfileMarkFrame() TracyCFrameMark +#define lovrProfileStart(id, label) TracyCZoneN(id, label, true) +#define lovrProfileEnd(id) TracyCZoneEnd(id) +#else +#define lovrProfileMarkFrame() ((void) 0) +#define lovrProfileStart(id, label) ((void) 0) +#define lovrProfileEnd(id) ((void) 0) +#endif + // Dynamic Array #define arr_t(T) struct { T* data; size_t length, capacity; } #define arr_init(a) (a)->data = NULL, (a)->length = 0, (a)->capacity = 0