From 99456205047bdd7a9cd92eccb4d92588a92fea49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 12 Dec 2021 11:56:29 +0100 Subject: [PATCH] Switch to macros to easily disable the new profiling. Add missing scope --- Common/GPU/Vulkan/VulkanContext.h | 10 ++++++++++ Common/GPU/Vulkan/VulkanProfiler.cpp | 3 ++- Common/GPU/Vulkan/VulkanProfiler.h | 4 ++-- Common/GPU/Vulkan/VulkanRenderManager.cpp | 5 +++++ GPU/Vulkan/TextureCacheVulkan.cpp | 20 ++++++++++++++++---- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 04d163f76f..7528cb6734 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -11,6 +11,16 @@ #include "Common/GPU/Vulkan/VulkanAlloc.h" #include "Common/GPU/Vulkan/VulkanProfiler.h" +#define VULKAN_PROFILE_ENABLED + +#if defined(VULKAN_PROFILE_ENABLED) +#define VK_PROFILE_BEGIN(vulkan, cmd, stage, message) vulkan->GetProfiler()->Begin(cmd, stage, message); +#define VK_PROFILE_END(vulkan, cmd, stage) vulkan->GetProfiler()->End(cmd, stage); +#else +#define VK_PROFILE_BEGIN(..) +#define VK_PROFILE_END(..) +#endif + enum { VULKAN_FLAG_VALIDATE = 1, VULKAN_FLAG_PRESENT_MAILBOX = 2, diff --git a/Common/GPU/Vulkan/VulkanProfiler.cpp b/Common/GPU/Vulkan/VulkanProfiler.cpp index e23a3b4a86..69f1ee8ee4 100644 --- a/Common/GPU/Vulkan/VulkanProfiler.cpp +++ b/Common/GPU/Vulkan/VulkanProfiler.cpp @@ -49,6 +49,7 @@ void VulkanProfiler::BeginFrame(VulkanContext *vulkan, VkCommandBuffer firstComm NOTICE_LOG(G3D, "%s%s (%0.3f ms)", indent[scope.level & 3], scope.name.c_str(), milliseconds); } + scopes_.clear(); } // Only need to reset all on the first frame. @@ -64,7 +65,7 @@ void VulkanProfiler::EndFrame() { // Not much to do here really except check that all scopes are closed. } -void VulkanProfiler::Begin(VkCommandBuffer cmdBuf, std::string scopeName, VkPipelineStageFlagBits stageFlags) { +void VulkanProfiler::Begin(VkCommandBuffer cmdBuf, VkPipelineStageFlagBits stageFlags, std::string scopeName) { if (numQueries_ >= MAX_QUERY_COUNT - 1) { return; } diff --git a/Common/GPU/Vulkan/VulkanProfiler.h b/Common/GPU/Vulkan/VulkanProfiler.h index ab2092aa90..d38fb79931 100644 --- a/Common/GPU/Vulkan/VulkanProfiler.h +++ b/Common/GPU/Vulkan/VulkanProfiler.h @@ -32,8 +32,8 @@ public: void EndFrame(); - void Begin(VkCommandBuffer cmdBuf, std::string scopeName, VkPipelineStageFlagBits stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT); - void End(VkCommandBuffer cmdBuf, VkPipelineStageFlagBits stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT); + void Begin(VkCommandBuffer cmdBuf, VkPipelineStageFlagBits stage, std::string scopeName); + void End(VkCommandBuffer cmdBuf, VkPipelineStageFlagBits stage); private: VulkanContext *vulkan_; diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index aa47c06782..b7890d2638 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -583,7 +583,12 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) { if (!run_) { WARN_LOG(G3D, "BeginFrame while !run_!"); } + +#if defined(VULKAN_PROFILE_ENABLED) vulkan_->BeginFrame(GetInitCmd()); +#else + vulkan_->BeginFrame(VK_NULL_HANDLE); +#endif insideFrame_ = true; renderStepOffset_ = 0; diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 206f238185..f0f72b4446 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -731,8 +731,7 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { VkImageLayout imageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; - // Compute experiment - if (actualFmt == VULKAN_8888_FORMAT && scaleFactor > 1 && hardwareScaling) { + if (actualFmt == VULKAN_8888_FORMAT && scaleFactor > 1 && hardwareScaling && !IsVideo(entry->addr)) { if (uploadCS_ != VK_NULL_HANDLE) computeUpload = true; } @@ -787,6 +786,9 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { } if (entry->vkTex) { + vulkan->GetProfiler()->Begin(cmdInit, VkPipelineStageFlagBits(VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT), + StringFromFormat("Texture Upload")); + // NOTE: Since the level is not part of the cache key, we assume it never changes. u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); bool fakeMipmap = IsFakeMipmapChange() && level > 0; @@ -815,7 +817,10 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { double replaceStart = time_now_d(); replaced.Load(i, data, stride); // if it fails, it'll just be garbage data... OK for now. replacementTimeThisFrame_ += time_now_d() - replaceStart; + VK_PROFILE_BEGIN(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT, + StringFromFormat("Copy Upload (replaced): %dx%d", mipWidth, mipHeight)); entry->vkTex->UploadMip(cmdInit, i, mipWidth, mipHeight, texBuf, bufferOffset, stride / bpp); + VK_PROFILE_END(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT); } else { if (fakeMipmap) { data = drawEngine_->GetPushBufferForTextureData()->PushAligned(size, &bufferOffset, &texBuf, pushAlignment); @@ -835,17 +840,21 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { VkImageView view = entry->vkTex->CreateViewForMip(i); VkDescriptorSet descSet = computeShaderManager_.GetDescriptorSet(view, texBuf, bufferOffset, srcSize); struct Params { int x; int y; } params{ mipUnscaledWidth, mipUnscaledHeight }; - vulkan->GetProfiler()->Begin(cmdInit, StringFromFormat("Compute Upload: %dx%d", mipUnscaledWidth, mipUnscaledHeight), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + VK_PROFILE_BEGIN(vulkan, cmdInit, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + StringFromFormat("Compute Upload: %dx%d->%dx%d", mipUnscaledWidth, mipUnscaledHeight, mipWidth, mipHeight)); vkCmdBindPipeline(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipeline(uploadCS_)); vkCmdBindDescriptorSets(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipelineLayout(), 0, 1, &descSet, 0, nullptr); vkCmdPushConstants(cmdInit, computeShaderManager_.GetPipelineLayout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(params), ¶ms); vkCmdDispatch(cmdInit, (mipUnscaledWidth + 7) / 8, (mipUnscaledHeight + 7) / 8, 1); - vulkan->GetProfiler()->End(cmdInit, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + VK_PROFILE_END(vulkan, cmdInit, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); vulkan->Delete().QueueDeleteImageView(view); } else { data = drawEngine_->GetPushBufferForTextureData()->PushAligned(size, &bufferOffset, &texBuf, pushAlignment); LoadTextureLevel(*entry, (uint8_t *)data, stride, i, scaleFactor, dstFmt); + VK_PROFILE_BEGIN(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT, + StringFromFormat("Copy Upload (replaced): %dx%d", mipWidth, mipHeight)); entry->vkTex->UploadMip(cmdInit, i, mipWidth, mipHeight, texBuf, bufferOffset, stride / bpp); + VK_PROFILE_END(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT); } } if (replacer_.Enabled()) { @@ -863,9 +872,11 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { // Generate any additional mipmap levels. // This will transition the whole stack to GENERAL if it wasn't already. if (maxLevel != maxLevelToGenerate) { + VK_PROFILE_BEGIN(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT, StringFromFormat("Mipgen %d", maxLevel + 1)); entry->vkTex->GenerateMips(cmdInit, maxLevel + 1, computeUpload); layout = VK_IMAGE_LAYOUT_GENERAL; prevStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + VK_PROFILE_END(vulkan, cmdInit, VK_PIPELINE_STAGE_TRANSFER_BIT); } if (maxLevel == 0) { @@ -877,6 +888,7 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { entry->SetAlphaStatus(TexCacheEntry::TexStatus(replaced.AlphaStatus())); } entry->vkTex->EndCreate(cmdInit, false, prevStage, layout); + VK_PROFILE_END(vulkan, cmdInit, VkPipelineStageFlagBits(VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)); } }