diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 0339f79b5..2fdea0373 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -265,7 +265,15 @@ namespace love { cleanup(); } + void Graphics::setColorMask(ColorChannelMask mask) { + flushBatchedDraws(); + + states.back().colorMask = mask; + } + void Graphics::setBlendState(const BlendState& blend) { + flushBatchedDraws(); + states.back().blend = blend; } @@ -1325,7 +1333,7 @@ namespace love { multisampling.alphaToOneEnable = VK_FALSE; // Optional VkPipelineColorBlendAttachmentState colorBlendAttachment{}; - colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + colorBlendAttachment.colorWriteMask = Vulkan::getColorMask(configuration.colorChannelMask); colorBlendAttachment.blendEnable = Vulkan::getBool(configuration.blendState.enable); colorBlendAttachment.srcColorBlendFactor = Vulkan::getBlendFactor(configuration.blendState.srcFactorRGB); colorBlendAttachment.dstColorBlendFactor = Vulkan::getBlendFactor(configuration.blendState.dstFactorRGB); @@ -1490,6 +1498,9 @@ namespace love { } bool operator==(const GraphicsPipelineConfiguration& first, const GraphicsPipelineConfiguration& other) { + if (first.colorChannelMask != other.colorChannelMask) { + return false; + } if (!(first.blendState == other.blendState)) { // not sure why != doesn't work return false; } diff --git a/src/modules/graphics/vulkan/Graphics.h b/src/modules/graphics/vulkan/Graphics.h index 812d991ec..b30a045a2 100644 --- a/src/modules/graphics/vulkan/Graphics.h +++ b/src/modules/graphics/vulkan/Graphics.h @@ -26,6 +26,7 @@ namespace love { PrimitiveType primitiveType = PRIMITIVE_MAX_ENUM; VkPolygonMode polygonMode = VK_POLYGON_MODE_FILL; BlendState blendState; + ColorChannelMask colorChannelMask; friend static bool operator==(const GraphicsPipelineConfiguration& first, const GraphicsPipelineConfiguration& other); }; @@ -99,7 +100,7 @@ namespace love { void setStencilMode(StencilAction action, CompareMode compare, int value, love::uint32 readmask, love::uint32 writemask) override { std::cout << "setStencilMode "; } void setDepthMode(CompareMode compare, bool write) override { std::cout << "setDepthMode "; } void setFrontFaceWinding(Winding winding) override { std::cout << "setFrontFaceWinding "; } - void setColorMask(ColorChannelMask mask) override { std::cout << "setColorMask "; } + void setColorMask(ColorChannelMask mask) override; void setBlendState(const BlendState& blend) override; void setPointSize(float size) override; void setWireframe(bool enable) override; diff --git a/src/modules/graphics/vulkan/Vulkan.cpp b/src/modules/graphics/vulkan/Vulkan.cpp index 22c642e3b..3e15a0a07 100644 --- a/src/modules/graphics/vulkan/Vulkan.cpp +++ b/src/modules/graphics/vulkan/Vulkan.cpp @@ -326,7 +326,7 @@ namespace love { return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; case BLENDFACTOR_SRC_ALPHA_SATURATED: return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE; - case BLENDFACTOR_MAX_ENUM: + default: throw love::Exception("unknown blend factor"); } } @@ -343,7 +343,7 @@ namespace love { return VK_BLEND_OP_SUBTRACT; case BLENDOP_REVERSE_SUBTRACT: return VK_BLEND_OP_REVERSE_SUBTRACT; - case BLENDOP_MAX_ENUM: + default: throw love::Exception("unknown blend operation"); } } @@ -355,6 +355,25 @@ namespace love { return VK_FALSE; } } + + VkColorComponentFlags Vulkan::getColorMask(ColorChannelMask mask) { + VkColorComponentFlags flags = 0; + + if (mask.r) { + flags |= VK_COLOR_COMPONENT_R_BIT; + } + if (mask.g) { + flags |= VK_COLOR_COMPONENT_G_BIT; + } + if (mask.b) { + flags |= VK_COLOR_COMPONENT_B_BIT; + } + if (mask.a) { + flags |= VK_COLOR_COMPONENT_A_BIT; + } + + return flags; + } } } } diff --git a/src/modules/graphics/vulkan/Vulkan.h b/src/modules/graphics/vulkan/Vulkan.h index 24ec40fdd..bfa455aa5 100644 --- a/src/modules/graphics/vulkan/Vulkan.h +++ b/src/modules/graphics/vulkan/Vulkan.h @@ -26,6 +26,7 @@ namespace love { static VkBlendFactor getBlendFactor(BlendFactor); static VkBlendOp getBlendOp(BlendOperation); static VkBool32 getBool(bool); + static VkColorComponentFlags getColorMask(ColorChannelMask); }; } }