From f50d9d85a5f3783dc9953313f669be9e3ec44948 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:11:17 +0300 Subject: [PATCH] Set pipeline names. --- UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp | 12 ++++++++++++ UnleashedRecomp/gpu/rhi/rt64_d3d12.h | 3 +++ .../gpu/rhi/rt64_render_interface.h | 1 + UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp | 12 ++++++++++++ UnleashedRecomp/gpu/rhi/rt64_vulkan.h | 3 +++ UnleashedRecomp/gpu/video.cpp | 18 ++++++++++++------ 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp b/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp index 310e5358..eccf3cc3 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp +++ b/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp @@ -2672,6 +2672,10 @@ namespace RT64 { } } + void D3D12ComputePipeline::setName(const std::string& name) const { + setObjectName(d3d, name); + } + RenderPipelineProgram D3D12ComputePipeline::getProgram(const std::string &name) const { assert(false && "Compute pipelines can't retrieve shader programs."); return RenderPipelineProgram(); @@ -2791,6 +2795,10 @@ namespace RT64 { } } + void D3D12GraphicsPipeline::setName(const std::string& name) const { + setObjectName(d3d, name); + } + RenderPipelineProgram D3D12GraphicsPipeline::getProgram(const std::string &name) const { assert(false && "Graphics pipelines can't retrieve shader programs."); return RenderPipelineProgram(); @@ -3011,6 +3019,10 @@ namespace RT64 { } } + void D3D12RaytracingPipeline::setName(const std::string& name) const { + setObjectName(stateObject, name); + } + RenderPipelineProgram D3D12RaytracingPipeline::getProgram(const std::string &name) const { auto it = nameProgramMap.find(name); assert((it != nameProgramMap.end()) && "Program must exist in the PSO."); diff --git a/UnleashedRecomp/gpu/rhi/rt64_d3d12.h b/UnleashedRecomp/gpu/rhi/rt64_d3d12.h index ff62d1b8..96f98bd4 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_d3d12.h +++ b/UnleashedRecomp/gpu/rhi/rt64_d3d12.h @@ -355,6 +355,7 @@ namespace RT64 { D3D12ComputePipeline(D3D12Device *device, const RenderComputePipelineDesc &desc); ~D3D12ComputePipeline() override; + virtual void setName(const std::string& name) const override; virtual RenderPipelineProgram getProgram(const std::string &name) const override; }; @@ -365,6 +366,7 @@ namespace RT64 { D3D12GraphicsPipeline(D3D12Device *device, const RenderGraphicsPipelineDesc &desc); ~D3D12GraphicsPipeline() override; + virtual void setName(const std::string& name) const override; virtual RenderPipelineProgram getProgram(const std::string &name) const override; }; @@ -377,6 +379,7 @@ namespace RT64 { D3D12RaytracingPipeline(D3D12Device *device, const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline); ~D3D12RaytracingPipeline() override; + virtual void setName(const std::string& name) const override; virtual RenderPipelineProgram getProgram(const std::string &name) const override; }; diff --git a/UnleashedRecomp/gpu/rhi/rt64_render_interface.h b/UnleashedRecomp/gpu/rhi/rt64_render_interface.h index 438590b1..a01b70e1 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_render_interface.h +++ b/UnleashedRecomp/gpu/rhi/rt64_render_interface.h @@ -53,6 +53,7 @@ namespace RT64 { struct RenderPipeline { virtual ~RenderPipeline() { } + virtual void setName(const std::string& name) const = 0; virtual RenderPipelineProgram getProgram(const std::string &name) const = 0; }; diff --git a/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp b/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp index 19da76d4..d5e9db1e 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp +++ b/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp @@ -1316,6 +1316,10 @@ namespace RT64 { } } + void VulkanComputePipeline::setName(const std::string& name) const { + setObjectName(device->vk, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, uint64_t(vk), name); + } + RenderPipelineProgram VulkanComputePipeline::getProgram(const std::string &name) const { assert(false && "Compute pipelines can't retrieve shader programs."); return RenderPipelineProgram(); @@ -1552,6 +1556,10 @@ namespace RT64 { } } + void VulkanGraphicsPipeline::setName(const std::string& name) const { + setObjectName(device->vk, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, uint64_t(vk), name); + } + RenderPipelineProgram VulkanGraphicsPipeline::getProgram(const std::string &name) const { assert(false && "Graphics pipelines can't retrieve shader programs."); return RenderPipelineProgram(); @@ -1752,6 +1760,10 @@ namespace RT64 { } } + void VulkanRaytracingPipeline::setName(const std::string& name) const { + setObjectName(device->vk, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, uint64_t(vk), name); + } + RenderPipelineProgram VulkanRaytracingPipeline::getProgram(const std::string &name) const { auto it = nameProgramMap.find(name); assert((it != nameProgramMap.end()) && "Program must exist in the PSO."); diff --git a/UnleashedRecomp/gpu/rhi/rt64_vulkan.h b/UnleashedRecomp/gpu/rhi/rt64_vulkan.h index ef2f1ff2..20f6fe0b 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_vulkan.h +++ b/UnleashedRecomp/gpu/rhi/rt64_vulkan.h @@ -158,6 +158,7 @@ namespace RT64 { VulkanComputePipeline(VulkanDevice *device, const RenderComputePipelineDesc &desc); ~VulkanComputePipeline() override; + void setName(const std::string& name) const override; RenderPipelineProgram getProgram(const std::string &name) const override; }; @@ -167,6 +168,7 @@ namespace RT64 { VulkanGraphicsPipeline(VulkanDevice *device, const RenderGraphicsPipelineDesc &desc); ~VulkanGraphicsPipeline() override; + void setName(const std::string& name) const override; RenderPipelineProgram getProgram(const std::string &name) const override; static VkRenderPass createRenderPass(VulkanDevice *device, const VkFormat *renderTargetFormat, uint32_t renderTargetCount, VkFormat depthTargetFormat, VkSampleCountFlagBits sampleCount); }; @@ -179,6 +181,7 @@ namespace RT64 { VulkanRaytracingPipeline(VulkanDevice *device, const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline); ~VulkanRaytracingPipeline() override; + void setName(const std::string& name) const override; RenderPipelineProgram getProgram(const std::string &name) const override; }; diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index f4c2c2ec..baea257e 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -2699,12 +2699,16 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli { SanitizePipelineState(pipelineState); - auto& pipeline = g_pipelines[XXH3_64bits(&pipelineState, sizeof(pipelineState))]; + XXH64_hash_t hash = XXH3_64bits(&pipelineState, sizeof(pipelineState)); + auto& pipeline = g_pipelines[hash]; if (pipeline == nullptr) { pipeline = CreateGraphicsPipeline(pipelineState); + if (pipelineState.zEnable) // Should ignore most post effect/2D shaders. ++g_pipelinesCreatedInRenderThread; + + pipeline->setName(std::format("Render Thread Pipeline {:X}", hash)); } return pipeline.get(); @@ -4247,7 +4251,7 @@ static std::atomic g_pendingModelCount; static ankerl::unordered_dense::set g_asyncPipelines; static Mutex g_asyncPipelineMutex; -static void CompileGraphicsPipelineInPipelineThread(const PipelineState& pipelineState) +static void CreateGraphicsPipelineInPipelineThread(const PipelineState& pipelineState) { XXH64_hash_t hash = XXH3_64bits(&pipelineState, sizeof(pipelineState)); @@ -4262,6 +4266,8 @@ static void CompileGraphicsPipelineInPipelineThread(const PipelineState& pipelin auto pipeline = CreateGraphicsPipeline(pipelineState); ++g_pipelinesCreatedAsynchronously; + pipeline->setName(std::format("Async Pipeline {:X}", hash)); + { std::lock_guard lock(g_asyncPipelineMutex); g_asyncPipelines.emplace(hash); @@ -4319,7 +4325,7 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, bool isTransp pipelineState.specConstants |= SPEC_CONSTANT_ALPHA_TEST; SanitizePipelineState(pipelineState); - CompileGraphicsPipelineInPipelineThread(pipelineState); + CreateGraphicsPipelineInPipelineThread(pipelineState); } guest_stack_var defaultSymbol(reinterpret_cast(g_memory.Translate(0x8202DDBC))); @@ -4334,12 +4340,12 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, bool isTransp for (auto& [pixelShaderSubPermutations, pixelShader] : defaultFindResult->second.m_PixelShaders) { - if ((pixelShaderSubPermutations & 0x2) != (args.noGI ? 0x2 : 0x0)) + if (pixelShader.get() == nullptr || (pixelShaderSubPermutations & 0x2) != (args.noGI ? 0x2 : 0x0)) continue; for (auto& [vertexShaderSubPermutations, vertexShader] : noneFindResult->second->m_VertexShaders) { - if (vertexShader.get() == nullptr || pixelShader.get() == nullptr) + if (vertexShader.get() == nullptr) continue; PipelineState pipelineState{}; @@ -4385,7 +4391,7 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, bool isTransp pipelineState.specConstants |= SPEC_CONSTANT_REVERSE_Z; SanitizePipelineState(pipelineState); - CompileGraphicsPipelineInPipelineThread(pipelineState); + CreateGraphicsPipelineInPipelineThread(pipelineState); } } }