diff --git a/src/common/rendering/vulkan/renderer/vk_renderpass.cpp b/src/common/rendering/vulkan/renderer/vk_renderpass.cpp index 5917afd116e..522933581a1 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderpass.cpp @@ -319,10 +319,15 @@ std::unique_ptr VkRenderPassSetup::CreatePipeline(const VkPipeli // main.vp addresses this by patching up gl_Position.z, which has the side effect of flipping the sign of the front face calculations. builder.Cull(key.CullMode == Cull_None ? VK_CULL_MODE_NONE : VK_CULL_MODE_BACK_BIT, key.CullMode == Cull_CW ? VK_FRONT_FACE_COUNTER_CLOCKWISE : VK_FRONT_FACE_CLOCKWISE); - builder.ColorWriteMask((VkColorComponentFlags)key.ColorMask); builder.Stencil(VK_STENCIL_OP_KEEP, op2vk[key.StencilPassOp], VK_STENCIL_OP_KEEP, VK_COMPARE_OP_EQUAL, 0xffffffff, 0xffffffff, 0); - BlendMode(builder, key.RenderStyle); - builder.SubpassColorAttachmentCount(PassKey.DrawBuffers); + + ColorBlendAttachmentBuilder blendbuilder; + blendbuilder.ColorWriteMask((VkColorComponentFlags)key.ColorMask); + BlendMode(blendbuilder, key.RenderStyle); + + for (int i = 0; i < PassKey.DrawBuffers; i++) + builder.AddColorBlendAttachment(blendbuilder.Create()); + builder.RasterizationSamples((VkSampleCountFlagBits)PassKey.Samples); builder.Layout(fb->GetRenderPassManager()->GetPipelineLayout(key.NumTextureLayers)); @@ -389,7 +394,11 @@ void VkPPRenderPassSetup::CreatePipeline(const VkPPRenderPassKey& key) builder.Stencil(VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_EQUAL, 0xffffffff, 0xffffffff, 0); } builder.Topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP); - BlendMode(builder, key.BlendMode); + + ColorBlendAttachmentBuilder blendbuilder; + BlendMode(blendbuilder, key.BlendMode); + builder.AddColorBlendAttachment(blendbuilder.Create()); + builder.RasterizationSamples(key.Samples); builder.Layout(PipelineLayout.get()); builder.RenderPass(RenderPass.get()); @@ -447,7 +456,7 @@ void VkPPRenderPassSetup::CreateRenderPass(const VkPPRenderPassKey& key) ///////////////////////////////////////////////////////////////////////////// -GraphicsPipelineBuilder& BlendMode(GraphicsPipelineBuilder& builder, const FRenderStyle& style) +ColorBlendAttachmentBuilder& BlendMode(ColorBlendAttachmentBuilder& builder, const FRenderStyle& style) { // Just in case Vulkan doesn't do this optimization itself if (style.BlendOp == STYLEOP_Add && style.SrcAlpha == STYLEALPHA_One && style.DestAlpha == STYLEALPHA_Zero && style.Flags == 0) diff --git a/src/common/rendering/vulkan/renderer/vk_renderpass.h b/src/common/rendering/vulkan/renderer/vk_renderpass.h index 25fd7d186c7..a1f8ca39f6a 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderpass.h +++ b/src/common/rendering/vulkan/renderer/vk_renderpass.h @@ -12,6 +12,7 @@ class VulkanRenderDevice; class VkPPShader; class GraphicsPipelineBuilder; +class ColorBlendAttachmentBuilder; class VkPipelineKey { @@ -118,7 +119,7 @@ class VkPPRenderPassSetup VulkanRenderDevice* fb = nullptr; }; -GraphicsPipelineBuilder& BlendMode(GraphicsPipelineBuilder& builder, const FRenderStyle& style); +ColorBlendAttachmentBuilder& BlendMode(ColorBlendAttachmentBuilder& builder, const FRenderStyle& style); class VkRenderPassManager {