diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.cpp index a12968091..17fbd6a36 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.cpp @@ -34,6 +34,49 @@ static VkStencilOp ToVulkanStencilOp(const StencilOperation value) } } +static VkBlendFactor ToVulkanBlendFactor(const BlendingMode::Blend value) +{ + switch (value) + { + case BlendingMode::Blend::Zero: + return VK_BLEND_FACTOR_ZERO; + case BlendingMode::Blend::One: + return VK_BLEND_FACTOR_ONE; + case BlendingMode::Blend::SrcColor: + return VK_BLEND_FACTOR_SRC_COLOR; + case BlendingMode::Blend::InvSrcColor: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; + case BlendingMode::Blend::SrcAlpha: + return VK_BLEND_FACTOR_SRC_ALPHA; + case BlendingMode::Blend::InvSrcAlpha: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + case BlendingMode::Blend::DestAlpha: + return VK_BLEND_FACTOR_DST_ALPHA; + case BlendingMode::Blend::InvDestAlpha: + return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + case BlendingMode::Blend::DestColor: + return VK_BLEND_FACTOR_DST_COLOR; + case BlendingMode::Blend::InvDestColor: + return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; + case BlendingMode::Blend::SrcAlphaSat: + return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE; + case BlendingMode::Blend::BlendFactor: + return VK_BLEND_FACTOR_CONSTANT_COLOR; + case BlendingMode::Blend::BlendInvFactor: + return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR; + case BlendingMode::Blend::Src1Color: + return VK_BLEND_FACTOR_SRC1_COLOR; + case BlendingMode::Blend::InvSrc1Color: + return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR; + case BlendingMode::Blend::Src1Alpha: + return VK_BLEND_FACTOR_SRC1_ALPHA; + case BlendingMode::Blend::InvSrc1Alpha: + return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA; + default: + return VK_BLEND_FACTOR_ZERO; + } +} + GPUShaderProgramCSVulkan::~GPUShaderProgramCSVulkan() { if (_pipelineState) @@ -316,7 +359,13 @@ bool GPUPipelineStateVulkan::Init(const Description& desc) _dynamicStates[_descDynamic.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT; _dynamicStates[_descDynamic.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR; _dynamicStates[_descDynamic.dynamicStateCount++] = VK_DYNAMIC_STATE_STENCIL_REFERENCE; - static_assert(ARRAY_COUNT(_dynamicStates) <= 3, "Invalid dynamic states array."); +#define IsBlendUsingBlendFactor(blend) blend == BlendingMode::Blend::BlendFactor || blend == BlendingMode::Blend::BlendInvFactor + if (desc.BlendMode.BlendEnable && ( + IsBlendUsingBlendFactor(desc.BlendMode.SrcBlend) || IsBlendUsingBlendFactor(desc.BlendMode.SrcBlendAlpha) || + IsBlendUsingBlendFactor(desc.BlendMode.DestBlend) || IsBlendUsingBlendFactor(desc.BlendMode.DestBlendAlpha))) + _dynamicStates[_descDynamic.dynamicStateCount++] = VK_DYNAMIC_STATE_BLEND_CONSTANTS; +#undef IsBlendUsingBlendFactor + static_assert(ARRAY_COUNT(_dynamicStates) <= 4, "Invalid dynamic states array."); _desc.pDynamicState = &_descDynamic; // Multisample @@ -370,21 +419,21 @@ bool GPUPipelineStateVulkan::Init(const Description& desc) { auto& blend = _descColorBlendAttachments[0]; blend.blendEnable = desc.BlendMode.BlendEnable; - blend.srcColorBlendFactor = RenderToolsVulkan::ToVulkanBlendFactor(desc.BlendMode.SrcBlend); - blend.dstColorBlendFactor = RenderToolsVulkan::ToVulkanBlendFactor(desc.BlendMode.DestBlend); + blend.srcColorBlendFactor = ToVulkanBlendFactor(desc.BlendMode.SrcBlend); + blend.dstColorBlendFactor = ToVulkanBlendFactor(desc.BlendMode.DestBlend); blend.colorBlendOp = RenderToolsVulkan::ToVulkanBlendOp(desc.BlendMode.BlendOp); - blend.srcAlphaBlendFactor = RenderToolsVulkan::ToVulkanBlendFactor(desc.BlendMode.SrcBlendAlpha); - blend.dstAlphaBlendFactor = RenderToolsVulkan::ToVulkanBlendFactor(desc.BlendMode.DestBlendAlpha); + blend.srcAlphaBlendFactor = ToVulkanBlendFactor(desc.BlendMode.SrcBlendAlpha); + blend.dstAlphaBlendFactor = ToVulkanBlendFactor(desc.BlendMode.DestBlendAlpha); blend.alphaBlendOp = RenderToolsVulkan::ToVulkanBlendOp(desc.BlendMode.BlendOpAlpha); blend.colorWriteMask = (VkColorComponentFlags)desc.BlendMode.RenderTargetWriteMask; } for (int32 i = 1; i < GPU_MAX_RT_BINDED; i++) _descColorBlendAttachments[i] = _descColorBlendAttachments[i - 1]; _descColorBlend.pAttachments = _descColorBlendAttachments; - _descColorBlend.blendConstants[0] = 0.0f; - _descColorBlend.blendConstants[1] = 0.0f; - _descColorBlend.blendConstants[2] = 0.0f; - _descColorBlend.blendConstants[3] = 0.0f; + _descColorBlend.blendConstants[0] = 1.0f; + _descColorBlend.blendConstants[1] = 1.0f; + _descColorBlend.blendConstants[2] = 1.0f; + _descColorBlend.blendConstants[3] = 1.0f; _desc.pColorBlendState = &_descColorBlend; ASSERT(DSWriteContainer.DescriptorWrites.IsEmpty()); diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.h b/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.h index 73e68a897..9e21adbb5 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.h +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUPipelineStateVulkan.h @@ -98,7 +98,7 @@ private: #endif VkPipelineViewportStateCreateInfo _descViewport; VkPipelineDynamicStateCreateInfo _descDynamic; - VkDynamicState _dynamicStates[3]; + VkDynamicState _dynamicStates[4]; VkPipelineMultisampleStateCreateInfo _descMultisample; VkPipelineDepthStencilStateCreateInfo _descDepthStencil; VkPipelineRasterizationStateCreateInfo _descRasterization; diff --git a/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.cpp index 5c0a66d75..7ee231472 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.cpp @@ -122,28 +122,6 @@ VkFormat RenderToolsVulkan::PixelFormatToVkFormat[110] = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, // NV12 }; -VkBlendFactor RenderToolsVulkan::BlendToVkBlendFactor[20] = -{ - VK_BLEND_FACTOR_MAX_ENUM, - VK_BLEND_FACTOR_ZERO, // Zero - VK_BLEND_FACTOR_ONE, // One - VK_BLEND_FACTOR_SRC_COLOR, // SrcColor - VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, // InvSrcColor - VK_BLEND_FACTOR_SRC_ALPHA, // SrcAlpha - VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, // InvSrcAlpha - VK_BLEND_FACTOR_DST_ALPHA, // DestAlpha - VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, // InvDestAlpha - VK_BLEND_FACTOR_DST_COLOR, // DestColor, - VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, // InvDestColor - VK_BLEND_FACTOR_SRC_ALPHA_SATURATE, // SrcAlphaSat - VK_BLEND_FACTOR_CONSTANT_ALPHA, // BlendFactor - VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, // BlendInvFactor - VK_BLEND_FACTOR_SRC1_COLOR, // Src1Color - VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, // InvSrc1Color - VK_BLEND_FACTOR_SRC1_ALPHA, // Src1Alpha - VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, // InvSrc1Alpha -}; - VkBlendOp RenderToolsVulkan::OperationToVkBlendOp[6] = { VK_BLEND_OP_MAX_ENUM, diff --git a/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.h b/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.h index afe16a6bc..6bcd5fe7f 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.h +++ b/Source/Engine/GraphicsDevice/Vulkan/RenderToolsVulkan.h @@ -164,16 +164,6 @@ public: return PixelFormatToVkFormat[(int32)value]; } - /// - /// Converts Flax blend mode to the Vulkan blend factor. - /// - /// The Flax blend mode. - /// The Vulkan blend factor. - static FORCE_INLINE VkBlendFactor ToVulkanBlendFactor(const BlendingMode::Blend value) - { - return BlendToVkBlendFactor[(int32)value]; - } - /// /// Converts Flax blend operation to the Vulkan blend operation. ///