From c4f5f8d62d56953cd36ddf99f0d4a8dd67cb77aa Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Thu, 3 Apr 2025 22:22:20 +0200 Subject: [PATCH] Add stat pipelines and print pipeline creation time --- .../vulkan/pipelines/vk_renderpass.cpp | 91 +++++++++++++------ 1 file changed, 63 insertions(+), 28 deletions(-) diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index 4d4cac101..2884ac89d 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -274,44 +274,65 @@ VulkanRenderPass *VkRenderPassSetup::GetRenderPass(int clearTargets) return RenderPasses[clearTargets].get(); } +CVAR(Bool, gl_ubershaders, false, 0); // development variable + VulkanPipeline *VkRenderPassSetup::GetPipeline(const VkPipelineKey &key, UniformStructHolder &Uniforms) { // To do: // Build the generalized pipelines in the VkRenderPassSetup constructor // Then build the specialized ones on a worker thread -#if 0 // generalized lookup - VkPipelineKey gkey = key; - gkey.ShaderKey.AsQWORD = 0; + if (gl_ubershaders) + { + VkPipelineKey gkey = key; + gkey.ShaderKey.AsQWORD = 0; - auto item = GeneralizedPipelines.find(gkey); - if (item == GeneralizedPipelines.end()) - { - auto pipeline = CreatePipeline(gkey, true, Uniforms); - auto ptr = pipeline.get(); - GeneralizedPipelines.insert(std::pair{gkey, PipelineData{ std::move(pipeline), Uniforms }}); - return ptr; + auto item = GeneralizedPipelines.find(gkey); + if (item == GeneralizedPipelines.end()) + { + auto pipeline = CreatePipeline(gkey, true, Uniforms); + auto ptr = pipeline.get(); + GeneralizedPipelines.insert(std::pair{gkey, PipelineData{ std::move(pipeline), Uniforms }}); + return ptr; + } + else + { + Uniforms = item->second.Uniforms; + return item->second.pipeline.get(); + } } else { - Uniforms = item->second.Uniforms; - return item->second.pipeline.get(); + auto item = SpecializedPipelines.find(key); + if (item == SpecializedPipelines.end()) + { + auto pipeline = CreatePipeline(key, false, Uniforms); + auto ptr = pipeline.get(); + SpecializedPipelines.insert(std::pair{key, PipelineData{std::move(pipeline), Uniforms}}); + return ptr; + } + else + { + Uniforms = item->second.Uniforms; + return item->second.pipeline.get(); + } } -#else // specialized lookup - auto item = SpecializedPipelines.find(key); - if (item == SpecializedPipelines.end()) - { - auto pipeline = CreatePipeline(key, false, Uniforms); - auto ptr = pipeline.get(); - SpecializedPipelines.insert(std::pair{key, PipelineData{std::move(pipeline), Uniforms}}); - return ptr; - } - else - { - Uniforms = item->second.Uniforms; - return item->second.pipeline.get(); - } -#endif +} + +// Pipeline creation tracking and printing +int Printf(const char* fmt, ...); +CVAR(Bool, vk_debug_pipeline_creation, false, 0); +static double pipeline_time; +static int pipeline_count; +ADD_STAT(pipelines) +{ + FString out; + out.Format( + "Pipelines created: %d\n" + "Pipeline time: %.3f\n" + "Pipeline average: %.3f", + pipeline_count, pipeline_time, pipeline_time / pipeline_count); + return out; } std::unique_ptr VkRenderPassSetup::CreatePipeline(const VkPipelineKey &key, bool isUberShader, UniformStructHolder &Uniforms) @@ -404,7 +425,21 @@ std::unique_ptr VkRenderPassSetup::CreatePipeline(const VkPipeli Uniforms = program->Uniforms; - return builder.Create(fb->GetDevice()); + cycle_t ct; + ct.ResetAndClock(); + + auto pipeline = builder.Create(fb->GetDevice()); + + ct.Unclock(); + const auto duration = ct.TimeMS(); + pipeline_time += duration; + + if (vk_debug_pipeline_creation) + { + Printf(">>> Pipeline created in %.3fms\n", duration); + } + + return pipeline; } /////////////////////////////////////////////////////////////////////////////