diff --git a/Dependencies/TracyProfiler/tracy/LICENSE b/Dependencies/TracyProfiler/tracy/LICENSE index f7070020..72a6fe1c 100644 --- a/Dependencies/TracyProfiler/tracy/LICENSE +++ b/Dependencies/TracyProfiler/tracy/LICENSE @@ -1,7 +1,7 @@ Tracy Profiler (https://github.com/wolfpld/tracy) is licensed under the 3-clause BSD license. -Copyright (c) 2017-2022, Bartosz Taudul +Copyright (c) 2017-2023, Bartosz Taudul All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Dependencies/TracyProfiler/version-0.10 b/Dependencies/TracyProfiler/version-0.10 new file mode 100644 index 00000000..e69de29b diff --git a/Dependencies/tracyprofiler/tracy/tracy/TracyVulkan.hpp b/Dependencies/tracyprofiler/tracy/tracy/TracyVulkan.hpp index 2d079f7b..c183807c 100644 --- a/Dependencies/tracyprofiler/tracy/tracy/TracyVulkan.hpp +++ b/Dependencies/tracyprofiler/tracy/tracy/TracyVulkan.hpp @@ -26,6 +26,7 @@ namespace tracy { class VkCtxScope {}; +class VkCtxManualScope; } using TracyVkCtx = void*; @@ -86,6 +87,7 @@ struct VkSymbolTable class VkCtx { friend class VkCtxScope; + friend class VkCtxManualScope; enum { QueryCount = 64 * 1024 }; @@ -260,7 +262,7 @@ class VkCtx } #endif assert( head > m_tail ); - + const unsigned int wrappedTail = (unsigned int)( m_tail % m_queryCount ); unsigned int cnt; @@ -610,6 +612,78 @@ class VkCtxScope VkCtx* m_ctx; }; +class VkCtxManualScope +{ +public: + tracy_force_inline VkCtxManualScope(VkCtx* ctx, const SourceLocationData* srcloc, bool is_active) +#ifdef TRACY_ON_DEMAND + : m_active(is_active&& GetProfiler().IsConnected()) +#else + : m_active(is_active) +#endif + { + if (!m_active) return; + m_ctx = ctx; + m_srcloc = srcloc; + } + + tracy_force_inline VkCtxManualScope(VkCtx* ctx, const SourceLocationData* srcloc, int depth, bool is_active) +#ifdef TRACY_ON_DEMAND + : m_active(is_active&& GetProfiler().IsConnected()) +#else + : m_active(is_active) +#endif + { + if (!m_active) return; + m_ctx = ctx; + } + + tracy_force_inline ~VkCtxManualScope() + { + } + + void Start(VkCommandBuffer cmdbuf) + { + if (!m_active) return; + m_cmdbuf = cmdbuf; + // auto cmdbuf = m_cmdbuf; + auto ctx = m_ctx; + auto srcloc = m_srcloc; + const auto queryId = ctx->NextQueryId(); + vkCmdWriteTimestamp(cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, ctx->m_query, queryId); + + auto item = Profiler::QueueSerial(); + MemWrite(&item->hdr.type, QueueType::GpuZoneBeginSerial); + MemWrite(&item->gpuZoneBegin.cpuTime, Profiler::GetTime()); + MemWrite(&item->gpuZoneBegin.srcloc, (uint64_t)srcloc); + MemWrite(&item->gpuZoneBegin.thread, GetThreadHandle()); + MemWrite(&item->gpuZoneBegin.queryId, uint16_t(queryId)); + MemWrite(&item->gpuZoneBegin.context, ctx->GetId()); + Profiler::QueueSerialFinish(); + } + + void End() + { + if (!m_active) return; + + const auto queryId = m_ctx->NextQueryId(); + vkCmdWriteTimestamp(m_cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, m_ctx->m_query, queryId); + + auto item = Profiler::QueueSerial(); + MemWrite(&item->hdr.type, QueueType::GpuZoneEndSerial); + MemWrite(&item->gpuZoneEnd.cpuTime, Profiler::GetTime()); + MemWrite(&item->gpuZoneEnd.thread, GetThreadHandle()); + MemWrite(&item->gpuZoneEnd.queryId, uint16_t(queryId)); + MemWrite(&item->gpuZoneEnd.context, m_ctx->GetId()); + Profiler::QueueSerialFinish(); + } + const bool m_active; + + VkCommandBuffer m_cmdbuf; + VkCtx* m_ctx; + const SourceLocationData* m_srcloc; +}; + #if defined TRACY_VK_USE_SYMBOL_TABLE static inline VkCtx* CreateVkContext( VkInstance instance, VkPhysicalDevice physdev, VkDevice device, VkQueue queue, VkCommandBuffer cmdbuf, PFN_vkGetInstanceProcAddr instanceProcAddr, PFN_vkGetDeviceProcAddr getDeviceProcAddr, bool calibrated = false ) #else @@ -692,12 +766,16 @@ using TracyVkCtx = tracy::VkCtx*; # define TracyVkZoneS( ctx, cmdbuf, name, depth ) TracyVkNamedZoneS( ctx, ___tracy_gpu_zone, cmdbuf, name, depth, true ) # define TracyVkZoneCS( ctx, cmdbuf, name, color, depth ) TracyVkNamedZoneCS( ctx, ___tracy_gpu_zone, cmdbuf, name, color, depth, true ) # define TracyVkZoneTransientS( ctx, varname, cmdbuf, name, depth, active ) tracy::VkCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), cmdbuf, depth, active ); +# define TracyVkManualZone( ctx, cmdbuf, name ) TracyVkNamedManualZone( ctx, ___tracy_gpu_zone, cmdbuf, name, true ) +# define TracySourceLocation( varname, name,color ) static const tracy::SourceLocationData varname { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; #else # define TracyVkNamedZoneS( ctx, varname, cmdbuf, name, depth, active ) TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) # define TracyVkNamedZoneCS( ctx, varname, cmdbuf, name, color, depth, active ) TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active ) # define TracyVkZoneS( ctx, cmdbuf, name, depth ) TracyVkZone( ctx, cmdbuf, name ) # define TracyVkZoneCS( ctx, cmdbuf, name, color, depth ) TracyVkZoneC( ctx, cmdbuf, name, color ) # define TracyVkZoneTransientS( ctx, varname, cmdbuf, name, depth, active ) TracyVkZoneTransient( ctx, varname, cmdbuf, name, active ) +# define TracyVkManualZone( ctx, cmdbuf, name ) TracyVkNamedManualZone( ctx, ___tracy_gpu_zone, cmdbuf, name, true ) +# define TracySourceLocation( varname, name,color ) static const tracy::SourceLocationData varname { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; #endif #endif diff --git a/Premake/ProjectUtil.lua b/Premake/ProjectUtil.lua index 87796cd1..b0fb68e1 100644 --- a/Premake/ProjectUtil.lua +++ b/Premake/ProjectUtil.lua @@ -1,240 +1,258 @@ -function ProjectTemplate(name, projectType, sourceDir, binDir, dependencies, defs, cppVersion) - local internalName = "Project-" .. name - if _G[internalName] ~= nil then - error("Attempted to create project '" .. name .. "' but a project with the same name already exists") - end +if ProjectTemplate == nil then + function ProjectTemplate(name, projectType, sourceDir, binDir, dependencies, defs, cppVersion) + local internalName = "Project-" .. name + if _G[internalName] ~= nil then + error("Attempted to create project '" .. name .. "' but a project with the same name already exists") + end - print("Creating Project '" .. name .. "'") - _G[internalName] = { } + print("Creating Project '" .. name .. "'") + _G[internalName] = { } - if cppVersion == nil or cppVersion == "" then - cppVersion = "C++17" - else - local version = tonumber(cppVersion) + if cppVersion == nil or cppVersion == "" then + cppVersion = "C++17" + else + local version = tonumber(cppVersion) - if version ~= nil then - cppVersion = tostring(version) - end + if version ~= nil then + cppVersion = tostring(version) + end - if cppVersion == "03" then - cppVersion = "C++03" - elseif cppVersion == "11" then - cppVersion = "C++11" - elseif cppVersion == "14" then - cppVersion = "C++14" - elseif cppVersion == "17" then - cppVersion = "C++17" - elseif cppVersion == "20" then - cppVersion = "C++20" - elseif cppVersion == "23" then - cppVersion = "C++23" - end + if cppVersion == "03" then + cppVersion = "C++03" + elseif cppVersion == "11" then + cppVersion = "C++11" + elseif cppVersion == "14" then + cppVersion = "C++14" + elseif cppVersion == "17" then + cppVersion = "C++17" + elseif cppVersion == "20" then + cppVersion = "C++20" + elseif cppVersion == "23" then + cppVersion = "C++23" + end - if not cppVersion:find("^C++") then - cppVersion = "C++17" + if not cppVersion:find("^C++") then + cppVersion = "C++17" + end end - end - local resolvedDependencies = { } - local needToResolve = true + local resolvedDependencies = { } + local needToResolve = true - for k, v in pairs(dependencies) do - resolvedDependencies[v] = v - end + for k, v in pairs(dependencies) do + resolvedDependencies[v] = v + end - while needToResolve do - local numAddedDependencies = 0 + while needToResolve do + local numAddedDependencies = 0 - for k, v in pairs(resolvedDependencies) do - local depInternalName = "Dependency-" .. v + for k, v in pairs(resolvedDependencies) do + local depInternalName = "Dependency-" .. v - local dep = _G[depInternalName] - if (dep == nil) then - error("Attempted to use undeclared dependency '" .. v .. "' in project '" .. name .. "'") - end + local dep = _G[depInternalName] + if (dep == nil) then + error("Attempted to use undeclared dependency '" .. v .. "' in project '" .. name .. "'") + end - if resolvedDependencies[v] == nil then - resolvedDependencies[v] = v - numAddedDependencies = numAddedDependencies + 1 - end + if resolvedDependencies[v] == nil then + resolvedDependencies[v] = v + numAddedDependencies = numAddedDependencies + 1 + end - if dep.Dependencies ~= nil then - local deps = nil + if dep.Dependencies ~= nil then + local deps = nil - if type(dep.Dependencies) == "function" then - deps = dep.Dependencies() - elseif type(dep.Dependencies) == "table" or type(dep.Dependencies) == "string" then - deps = dep.Dependencies - end + if type(dep.Dependencies) == "function" then + deps = dep.Dependencies() + elseif type(dep.Dependencies) == "table" or type(dep.Dependencies) == "string" then + deps = dep.Dependencies + end - if deps ~= nil then - for k, v in pairs(deps) do - if resolvedDependencies[v] == nil then - resolvedDependencies[v] = v - numAddedDependencies = numAddedDependencies + 1 + if deps ~= nil then + for k, v in pairs(deps) do + if resolvedDependencies[v] == nil then + resolvedDependencies[v] = v + numAddedDependencies = numAddedDependencies + 1 + end end end end end - end - - needToResolve = numAddedDependencies > 0 - end - project (name) - kind (projectType) - language "C++" - cppdialect (cppVersion) - targetdir (binDir .. "/%{cfg.buildcfg}") - characterset ("ASCII") - vpaths { ["*"] = name } - - if sourceDir ~= nil then - files - { - (sourceDir .. "/**.h"), - (sourceDir .. "/**.hpp"), - (sourceDir .. "/**.cpp") - } - includedirs { path.getabsolute(sourceDir) } + needToResolve = numAddedDependencies > 0 end - links { } - defines { defs } + project (name) + kind (projectType) + language "C++" + cppdialect (cppVersion) + targetdir (binDir .. "/%{cfg.buildcfg}") + characterset ("ASCII") + editandcontinue "Off" + + if sourceDir ~= nil then + files + { + (sourceDir .. "/**.h"), + (sourceDir .. "/**.hpp"), + (sourceDir .. "/**.cpp") + } + includedirs { path.getabsolute(sourceDir) } + end + + links { } + defines { defs } - for k, v in pairs(resolvedDependencies) do - local depInternalName = "Dependency-" .. v - if (_G[depInternalName].Callback ~= nil) then - _G[depInternalName].Callback() - filter {} + for k, v in pairs(resolvedDependencies) do + local depInternalName = "Dependency-" .. v + if (_G[depInternalName].Callback ~= nil) then + _G[depInternalName].Callback() + filter {} + end end - end - filter "configurations:Debug" - runtime "Debug" - symbols "On" - defines { "NC_DEBUG" } - - filter "configurations:RelDebug" - defines { "NC_RELEASE" } - runtime "Release" - symbols "On" - optimize "On" - - filter "configurations:Release" - defines { "NC_RELEASE" } - runtime "Release" - symbols "Off" - optimize "Full" - - filter "platforms:Win64" - system "Windows" - architecture "x86_64" - defines { "WIN32", "WINDOWS" } - - local isMSVC = BuildSettings:Get("Using MSVC") - local multithreadedCompilation = BuildSettings:Get("Multithreaded Compilation") - local multithreadedCoreCount = BuildSettings:Get("Multithreaded Core Count") - - if multithreadedCompilation then - if isMSVC then - local cores = multithreadedCoreCount or 0 - if cores > 0 then - buildoptions { "/MP" .. tostring(cores) } - else - buildoptions { "/MP" } + filter "configurations:Debug" + runtime "Debug" + symbols "On" + defines { "_DEBUG", "NC_DEBUG" } + + filter "configurations:RelDebug" + defines { "NDEBUG", "NC_RELEASE"} + runtime "Release" + symbols "On" + optimize "On" + + filter "configurations:Release" + defines { "NDEBUG", "NC_RELEASE"} + runtime "Release" + symbols "Off" + optimize "Full" + + filter "platforms:Win64" + system "Windows" + architecture "x86_64" + defines { "WIN32", "WINDOWS" } + + filter { } + + local isMSVC = BuildSettings:Get("Using MSVC") + local multithreadedCompilation = BuildSettings:Get("Multithreaded Compilation") + local multithreadedCoreCount = BuildSettings:Get("Multithreaded Core Count") + + if multithreadedCompilation then + if isMSVC then + local cores = multithreadedCoreCount or 0 + if cores > 0 then + buildoptions { "/MP" .. tostring(cores) } + else + buildoptions { "/MP" } + end end end end end -function CreateDep(name, callback, dependencies) - local internalName = "Dependency-" .. name - if _G[internalName] ~= nil then - error("Attempted to create dependency '" .. name .. "' but a dependency with the same name already exists") - end +if CreateDep == nil then + function CreateDep(name, callback, dependencies) + local internalName = "Dependency-" .. name + if _G[internalName] ~= nil then + error("Attempted to create dependency '" .. name .. "' but a dependency with the same name already exists") + end - print("Creating Dependency '" .. name .. "'") - _G[internalName] = { } + print("Creating Dependency '" .. name .. "'") + _G[internalName] = { } - if type(callback) ~= "function" then - error("Attemped to create dependency '" .. name .. "' with the callback parameter passed as a non function") - end + if type(callback) ~= "function" then + error("Attemped to create dependency '" .. name .. "' with the callback parameter passed as a non function") + end - _G[internalName].Callback = callback - _G[internalName].Dependencies = dependencies + _G[internalName].Callback = callback + _G[internalName].Dependencies = dependencies + end end -function IncludeSubmodule(name, rootDir, binDir) - local submoduleRootDir = path.getabsolute("Submodules/".. name .. "/", rootDir) - local submoduleBuildDir = path.getabsolute("Build/".. name .. "/", rootDir) - local submodulePremakeFile = path.getabsolute("premake5.lua", submoduleRootDir) +if IncludeSubmodule == nil then + function IncludeSubmodule(name, rootDir, binDir) + local submoduleRootDir = path.getabsolute("Submodules/".. name .. "/", rootDir) + local submoduleBuildDir = path.getabsolute("Build/".. name .. "/", rootDir) + local submodulePremakeFile = path.getabsolute("premake5.lua", submoduleRootDir) - include(submodulePremakeFile) + include(submodulePremakeFile) - _G[name]:Init(submoduleRootDir, submoduleBuildDir, binDir) + _G[name]:Init(submoduleRootDir, submoduleBuildDir, binDir) + end end -function AddFiles(list) - files { list } +if AddFiles == nil then + function AddFiles(list) + files { list } + end end -function AddIncludeDirs(list) - includedirs { list } +if AddIncludeDirs == nil then + function AddIncludeDirs(list) + includedirs { list } + end end -function AddLinks(list) - links { list } +if AddLinks == nil then + function AddLinks(list) + links { list } + end end -function AddDefines(list) - defines { list } +if AddDefines == nil then + function AddDefines(list) + defines { list } + end end -function InitBuildSettings(silentFailOnDuplicateSetting) - if BuildSettings == nil then - BuildSettings = { } +if InitBuildSettings == nil then + function InitBuildSettings(silentFailOnDuplicateSetting) + if BuildSettings == nil then + BuildSettings = { } - BuildSettings.Has = function(settings, name) - return settings[name] ~= nil - end + BuildSettings.Has = function(settings, name) + return settings[name] ~= nil + end + + BuildSettings.Add = function(settings, name, value) + local silentFail = settings:ShouldSilentFailOnDuplicateSetting() - BuildSettings.Add = function(settings, name, value) - local silentFail = settings:ShouldSilentFailOnDuplicateSetting() + if settings:Has(name) then + if silentFail then + return + end - if settings:Has(name) then - if silentFail then - return + error("Tried to call BuildSettings:Add with name '" .. name .. '" but a setting with that name already exists') end - error("Tried to call BuildSettings:Add with name '" .. name .. '" but a setting with that name already exists') + settings[name] = value end - settings[name] = value - end + BuildSettings.Get = function(settings, name) + if not settings:Has(name) then + return nil + end - BuildSettings.Get = function(settings, name) - if not settings:Has(name) then - return nil + return settings[name] end - return settings[name] - end + BuildSettings.SetSilentFailOnDuplicateSetting = function(settings, silentFailOnDuplicateSetting) + BuildSettings["SilentFailOnDuplicateSetting"] = silentFailOnDuplicateSetting + end - BuildSettings.SetSilentFailOnDuplicateSetting = function(settings, silentFailOnDuplicateSetting) - BuildSettings["SilentFailOnDuplicateSetting"] = silentFailOnDuplicateSetting - end + BuildSettings.ShouldSilentFailOnDuplicateSetting = function(settings) + local option = BuildSettings["SilentFailOnDuplicateSetting"] - BuildSettings.ShouldSilentFailOnDuplicateSetting = function(settings) - local option = BuildSettings["SilentFailOnDuplicateSetting"] + if option == nil then + return false + end - if option == nil then - return false + return option end - - return option end - end - BuildSettings:SetSilentFailOnDuplicateSetting(silentFailOnDuplicateSetting) + BuildSettings:SetSilentFailOnDuplicateSetting(silentFailOnDuplicateSetting) + end end \ No newline at end of file diff --git a/Source/Renderer/Renderer/BackendDispatch.cpp b/Source/Renderer/Renderer/BackendDispatch.cpp index dddabbb2..5ab5b89b 100644 --- a/Source/Renderer/Renderer/BackendDispatch.cpp +++ b/Source/Renderer/Renderer/BackendDispatch.cpp @@ -146,7 +146,7 @@ namespace Renderer void BackendDispatch::PopMarker(Renderer* renderer, CommandListID commandList, const void* /*data*/) { - ZoneScopedC(tracy::Color::Red3) + ZoneScopedC(tracy::Color::Red3); renderer->PopMarker(commandList); }