diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index f75b8504a..fe1bddbcd 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -374,6 +374,11 @@ void VkRenderPassManager::CreateZMinMaxPipeline() VkRenderPassSetup::VkRenderPassSetup(VulkanRenderDevice* fb, const VkRenderPassKey &key) : PassKey(key), fb(fb) { + const auto device = fb->GetDevice(); + + UsePipelineLibrary = device->SupportsExtension(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME) // Is this supported? + && device->EnabledFeatures.GraphicsPipelineLibrary.graphicsPipelineLibrary; // Well yes, but actually no. + // Precompile material fragment shaders: if (gl_ubershaders) { @@ -576,7 +581,7 @@ PipelineData* VkRenderPassSetup::GetGeneralizedPipeline(const VkPipelineKey& key if (item == GeneralizedPipelines.end()) { UniformStructHolder uniforms; - auto pipeline = LinkPipeline(gkey, true, uniforms); + auto pipeline = UsePipelineLibrary ? LinkPipeline(gkey, true, uniforms) : CreateWithStats(*CreatePipeline(gkey, true, uniforms), "Generalized (no pipeline library)"); auto ptr = pipeline.get(); auto& value = GeneralizedPipelines[gkey]; value.pipeline = std::move(pipeline); diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.h b/src/common/rendering/vulkan/pipelines/vk_renderpass.h index c12e8954f..c454a89ed 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.h +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.h @@ -118,6 +118,7 @@ private: void AddFragmentOutputInterface(GraphicsPipelineBuilder& builder, FRenderStyle renderStyle, VkColorComponentFlags colorMask); void AddDynamicState(GraphicsPipelineBuilder& builder); + bool UsePipelineLibrary = false; VulkanRenderDevice* fb = nullptr; VkRenderPassKey PassKey; std::unique_ptr RenderPasses[8];