diff --git a/.gitmodules b/.gitmodules index 944bb416ecee..47fc81aa0a8e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = devtools/create_prince url = https://github.com/scummvm/game-translations branch = prince-and-the-coward +[submodule "common/tracy"] + path = common/tracy + url = https://github.com/wolfpld/tracy.git diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index 6ae9529ce0f9..5fcd70bba703 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -24,6 +24,7 @@ #include "backends/graphics/opengl/texture.h" #include "backends/events/sdl/sdl-events.h" #include "backends/platform/sdl/sdl.h" +#include "common/trace.h" #include "graphics/scaler/aspect.h" #include "common/textconsole.h" @@ -341,6 +342,7 @@ void OpenGLSdlGraphicsManager::refreshScreen() { #else SDL_GL_SwapBuffers(); #endif + traceEndFrame(refreshScreen); } void *OpenGLSdlGraphicsManager::getProcAddress(const char *name) const { diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index c4c9ed21e1f4..29531b1cf98d 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -21,6 +21,7 @@ */ #include "common/scummsys.h" +#include "common/trace.h" #if defined(SDL_BACKEND) #include "backends/graphics/surfacesdl/surfacesdl-graphics.h" @@ -1396,6 +1397,7 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { _numDirtyRects = 0; _forceRedraw = false; _cursorNeedsRedraw = false; + traceEndFrame(updateScreen); } bool SurfaceSdlGraphicsManager::saveScreenshot(const Common::String &filename) const { diff --git a/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp b/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp index 7ba75a991b10..6e0280853a6a 100644 --- a/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp +++ b/backends/graphics3d/openglsdl/openglsdl-graphics3d.cpp @@ -29,6 +29,7 @@ #include "backends/events/sdl/sdl-events.h" #include "common/config-manager.h" #include "common/file.h" +#include "common/trace.h" #include "engines/engine.h" #include "graphics/pixelbuffer.h" #include "graphics/opengl/context.h" @@ -573,6 +574,8 @@ void OpenGLSdlGraphics3dManager::updateScreen() { SDL_GL_SwapBuffers(); #endif + traceEndFrame(updateScreen); + if (_frameBuffer) { _frameBuffer->attach(); } diff --git a/common/module.mk b/common/module.mk index edfa8aa9d3d2..6f64211b9efc 100644 --- a/common/module.mk +++ b/common/module.mk @@ -60,6 +60,11 @@ MODULE_OBJS += \ rdft.o \ sinetables.o +ifdef ENABLE_TRACY +MODULE_OBJS += \ + tracy/TracyClient.o +endif + ifdef ENABLE_EVENTRECORDER MODULE_OBJS += \ recorderfile.o diff --git a/common/trace.h b/common/trace.h new file mode 100644 index 000000000000..b46cc27e683b --- /dev/null +++ b/common/trace.h @@ -0,0 +1,52 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef COMMON_TRACE_H +#define COMMON_TRACE_H + +#ifdef TRACY_ENABLE +#include "tracy/Tracy.hpp" + +#define traceValueScoped(name, x) ZoneNamedN(__tracy_scoped_##name, #name, true); ZoneValueV(__tracy_scoped_##name, (uint64_t)(x)) +#define tracePlot(name, x) TracyPlot(name, x) +#define traceMsg(message) TracyMessageL(message) +#define traceThread(name) tracy::SetThreadName(name) +#define traceMutex(type, varname, name) type varname { tracy::SourceLocationData{ nullptr, name, __FILE__, __LINE__, 0 } } + +#define traceBeginFrame(name) (void)0 +#define traceEndFrame(name) FrameMark +#define traceScoped(name) ZoneNamedN(__tracy_scoped_##name, #name, true) +#define traceScopedFunc() ZoneNamedN(__tracy_scoped_function_, __FUNCTION__, true) +#else +#define traceValueScoped(name, x) (void)0 +#define tracePlot(name, x) (void)0 +#define traceMsg(message) (void)0 +#define traceThread(name) (void)0 +#define traceMutex(type, varname, name) type varname + +#define traceBeginFrame(name) (void)0 +#define traceEndFrame(name) (void)0 +#define traceScoped(name) (void)0 +#define traceScopedFunc() (void)0 +#endif + +#endif diff --git a/common/tracy b/common/tracy new file mode 160000 index 000000000000..0325f83e604b --- /dev/null +++ b/common/tracy @@ -0,0 +1 @@ +Subproject commit 0325f83e604b6f27247bee10c6e1b634690137aa diff --git a/configure b/configure index 45ee9053bf5c..f89f994c66d1 100755 --- a/configure +++ b/configure @@ -199,6 +199,8 @@ _pandoc=no # Default vkeybd/eventrec options _vkeybd=no _eventrec=no +# Tracy Profiler support +_tracy=no # GUI translation options _translation=yes # Default platform settings @@ -1063,6 +1065,7 @@ Optional Features: --enable-vkeybd build virtual keyboard support --enable-eventrecorder enable event recording functionality --disable-eventrecorder disable event recording functionality + --enable-tracy enable tracy profiler support --enable-updates build support for updates --enable-text-console use text console instead of graphical console --enable-verbose-build enable regular echoing of commands during build @@ -1346,6 +1349,7 @@ for ac_option in $@; do --disable-vkeybd) _vkeybd=no ;; --enable-eventrecorder) _eventrec=yes ;; --disable-eventrecorder) _eventrec=no ;; + --enable-tracy) _tracy=yes ;; --enable-text-console) _text_console=yes ;; --disable-text-console) _text_console=no ;; --with-fluidsynth-prefix=*) @@ -5689,6 +5693,18 @@ echo "$_discord" define_in_config_if_yes $_vkeybd 'ENABLE_VKEYBD' define_in_config_if_yes $_eventrec 'ENABLE_EVENTRECORDER' +# +# Check whether to enable tracy profiler support +# + +if test "$_tracy" = yes ; then + append_var DEFINES "-DTRACY_ENABLE" + append_var LIBS "-ldl -lpthread" + define_in_config_if_yes $_tracy 'FORBIDDEN_SYMBOL_ALLOW_ALL' +fi +define_in_config_if_yes $_tracy 'ENABLE_TRACY' +define_in_config_if_yes $_tracy 'TRACY_ON_DEMAND' + # Check whether to build translation support # echo_n "Building translation support... " @@ -5981,6 +5997,10 @@ if test "$_eventrec" = yes ; then echo_n ", event recorder" fi +if test "$_tracy" = yes ; then + echo_n ", tracy profiler" +fi + if test "$_cloud" = yes ; then echo ", cloud" else diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index d97d60d79d6b..596805873f64 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -1070,6 +1070,7 @@ const Feature s_features[] = { { "translation", "USE_TRANSLATION", false, true, "Translation support" }, { "vkeybd", "ENABLE_VKEYBD", false, false, "Virtual keyboard support"}, { "eventrecorder", "ENABLE_EVENTRECORDER", false, false, "Event recorder support"}, + { "tracy", "ENABLE_TRACY", false, false, "Tracy profiler support"}, { "updates", "USE_UPDATES", false, false, "Updates support"}, { "dialogs", "USE_SYSDIALOGS", false, true, "System dialogs support"}, { "langdetect", "USE_DETECTLANG", false, true, "System language detection support" }, // This feature actually depends on "translation", there