Fix blend states and blend factor usage on Vulkan

This commit is contained in:
Wojtek Figat
2024-11-20 16:30:13 +01:00
parent 20704ef9dd
commit a890326b82
4 changed files with 59 additions and 42 deletions

View File

@@ -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());

View File

@@ -98,7 +98,7 @@ private:
#endif
VkPipelineViewportStateCreateInfo _descViewport;
VkPipelineDynamicStateCreateInfo _descDynamic;
VkDynamicState _dynamicStates[3];
VkDynamicState _dynamicStates[4];
VkPipelineMultisampleStateCreateInfo _descMultisample;
VkPipelineDepthStencilStateCreateInfo _descDepthStencil;
VkPipelineRasterizationStateCreateInfo _descRasterization;

View File

@@ -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,

View File

@@ -164,16 +164,6 @@ public:
return PixelFormatToVkFormat[(int32)value];
}
/// <summary>
/// Converts Flax blend mode to the Vulkan blend factor.
/// </summary>
/// <param name="value">The Flax blend mode.</param>
/// <returns>The Vulkan blend factor.</returns>
static FORCE_INLINE VkBlendFactor ToVulkanBlendFactor(const BlendingMode::Blend value)
{
return BlendToVkBlendFactor[(int32)value];
}
/// <summary>
/// Converts Flax blend operation to the Vulkan blend operation.
/// </summary>