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.
///