diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp index 8b21dce9..c779d47a 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp @@ -24,6 +24,12 @@ namespace MobileGL::MG_Backend::DirectVulkan { XXHASH_VERIFY(XXH64_update(m_hashState, &payload.depthTestEnable, sizeof(payload.depthTestEnable))); XXHASH_VERIFY(XXH64_update(m_hashState, &payload.depthWriteEnable, sizeof(payload.depthWriteEnable))); XXHASH_VERIFY(XXH64_update(m_hashState, &payload.depthCompareOp, sizeof(payload.depthCompareOp))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.blendEnable, sizeof(payload.blendEnable))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.srcColorBlendFactor, sizeof(payload.srcColorBlendFactor))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.dstColorBlendFactor, sizeof(payload.dstColorBlendFactor))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.srcAlphaBlendFactor, sizeof(payload.srcAlphaBlendFactor))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.dstAlphaBlendFactor, sizeof(payload.dstAlphaBlendFactor))); + XXHASH_VERIFY(XXH64_update(m_hashState, &payload.colorWriteMask, sizeof(payload.colorWriteMask))); return XXH64_digest(m_hashState); } @@ -88,9 +94,14 @@ namespace MobileGL::MG_Backend::DirectVulkan { depthStencil.stencilTestEnable = VK_FALSE; VkPipelineColorBlendAttachmentState colorAttach{}; - colorAttach.colorWriteMask = - VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - colorAttach.blendEnable = VK_FALSE; + colorAttach.colorWriteMask = payload.colorWriteMask; + colorAttach.blendEnable = payload.blendEnable ? VK_TRUE : VK_FALSE; + colorAttach.srcColorBlendFactor = payload.srcColorBlendFactor; + colorAttach.dstColorBlendFactor = payload.dstColorBlendFactor; + colorAttach.colorBlendOp = VK_BLEND_OP_ADD; + colorAttach.srcAlphaBlendFactor = payload.srcAlphaBlendFactor; + colorAttach.dstAlphaBlendFactor = payload.dstAlphaBlendFactor; + colorAttach.alphaBlendOp = VK_BLEND_OP_ADD; VkPipelineColorBlendStateCreateInfo blend{VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO}; blend.attachmentCount = 1; blend.pAttachments = &colorAttach; diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h index d8b70572..14aa3372 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.h @@ -27,6 +27,14 @@ namespace MobileGL::MG_Backend::DirectVulkan { Bool depthTestEnable = false; Bool depthWriteEnable = false; VkCompareOp depthCompareOp = VK_COMPARE_OP_ALWAYS; + Bool blendEnable = false; + VkBlendFactor srcColorBlendFactor = VK_BLEND_FACTOR_ONE; + VkBlendFactor dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; + VkBlendFactor srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + VkBlendFactor dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; + VkColorComponentFlags colorWriteMask = + VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | + VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; const Vector* stages = nullptr; const VkPipelineVertexInputStateCreateInfo* vertexInputState = nullptr; }; diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 200ff01a..7313c724 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -85,6 +85,25 @@ namespace MobileGL::MG_Backend::DirectVulkan { default: return VK_COMPARE_OP_ALWAYS; } }; + auto toVkBlendFactor = [](BlendFactor factor) -> VkBlendFactor { + switch (factor) { + case BlendFactor::Zero: return VK_BLEND_FACTOR_ZERO; + case BlendFactor::One: return VK_BLEND_FACTOR_ONE; + case BlendFactor::SrcColor: return VK_BLEND_FACTOR_SRC_COLOR; + case BlendFactor::OneMinusSrcColor: return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; + case BlendFactor::DstColor: return VK_BLEND_FACTOR_DST_COLOR; + case BlendFactor::OneMinusDstColor: return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; + case BlendFactor::SrcAlpha: return VK_BLEND_FACTOR_SRC_ALPHA; + case BlendFactor::OneMinusSrcAlpha: return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + case BlendFactor::DstAlpha: return VK_BLEND_FACTOR_DST_ALPHA; + case BlendFactor::OneMinusDstAlpha: return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + case BlendFactor::ConstantColor: return VK_BLEND_FACTOR_CONSTANT_COLOR; + case BlendFactor::OneMinusConstantColor: return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR; + case BlendFactor::ConstantAlpha: return VK_BLEND_FACTOR_CONSTANT_ALPHA; + case BlendFactor::OneMinusConstantAlpha: return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA; + default: return VK_BLEND_FACTOR_ONE; + } + }; PipelineFactory::PipelineCreatePayload payload{}; payload.programHash = programHash; @@ -98,6 +117,24 @@ namespace MobileGL::MG_Backend::DirectVulkan { payload.depthTestEnable = depthTestEnabled; payload.depthWriteEnable = depthTestEnabled && MG_State::pGLContext->GetDepthMask(); payload.depthCompareOp = toVkCompareOp(MG_State::pGLContext->GetDepthFunc()); + + payload.blendEnable = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::Blend); + BlendFactor srcRGB = BlendFactor::One; + BlendFactor dstRGB = BlendFactor::Zero; + BlendFactor srcAlpha = BlendFactor::One; + BlendFactor dstAlpha = BlendFactor::Zero; + MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + payload.srcColorBlendFactor = toVkBlendFactor(srcRGB); + payload.dstColorBlendFactor = toVkBlendFactor(dstRGB); + payload.srcAlphaBlendFactor = toVkBlendFactor(srcAlpha); + payload.dstAlphaBlendFactor = toVkBlendFactor(dstAlpha); + + payload.colorWriteMask = 0; + const BoolVec4 colorMask = MG_State::pGLContext->GetColorMask(); + if (colorMask.x()) payload.colorWriteMask |= VK_COLOR_COMPONENT_R_BIT; + if (colorMask.y()) payload.colorWriteMask |= VK_COLOR_COMPONENT_G_BIT; + if (colorMask.z()) payload.colorWriteMask |= VK_COLOR_COMPONENT_B_BIT; + if (colorMask.w()) payload.colorWriteMask |= VK_COLOR_COMPONENT_A_BIT; } payload.stages = &stages; payload.vertexInputState = &vertexInputState;