diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index e1375da30..0339f79b5 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -265,6 +265,10 @@ namespace love { cleanup(); } + void Graphics::setBlendState(const BlendState& blend) { + states.back().blend = blend; + } + void Graphics::setPointSize(float size) { std::cout << "setPointSize "; @@ -1230,6 +1234,7 @@ namespace love { configuration.shader = (Shader*)Shader::current; configuration.primitiveType = primitiveType; configuration.polygonMode = currentPolygonMode; + configuration.blendState = states.back().blend; std::vector bufferVector; std::vector offsets; @@ -1321,13 +1326,13 @@ namespace love { 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.blendEnable = VK_TRUE; - colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; - colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; - colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; + colorBlendAttachment.blendEnable = Vulkan::getBool(configuration.blendState.enable); + colorBlendAttachment.srcColorBlendFactor = Vulkan::getBlendFactor(configuration.blendState.srcFactorRGB); + colorBlendAttachment.dstColorBlendFactor = Vulkan::getBlendFactor(configuration.blendState.dstFactorRGB); + colorBlendAttachment.colorBlendOp = Vulkan::getBlendOp(configuration.blendState.operationRGB); + colorBlendAttachment.srcAlphaBlendFactor = Vulkan::getBlendFactor(configuration.blendState.srcFactorA); + colorBlendAttachment.dstAlphaBlendFactor = Vulkan::getBlendFactor(configuration.blendState.dstFactorA); + colorBlendAttachment.alphaBlendOp = Vulkan::getBlendOp(configuration.blendState.operationA); VkPipelineColorBlendStateCreateInfo colorBlending{}; colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; @@ -1485,6 +1490,9 @@ namespace love { } bool operator==(const GraphicsPipelineConfiguration& first, const GraphicsPipelineConfiguration& other) { + if (!(first.blendState == other.blendState)) { // not sure why != doesn't work + return false; + } if (first.polygonMode != other.polygonMode) { return false; } diff --git a/src/modules/graphics/vulkan/Graphics.h b/src/modules/graphics/vulkan/Graphics.h index 87fc381bc..812d991ec 100644 --- a/src/modules/graphics/vulkan/Graphics.h +++ b/src/modules/graphics/vulkan/Graphics.h @@ -25,6 +25,7 @@ namespace love { Shader* shader = nullptr; PrimitiveType primitiveType = PRIMITIVE_MAX_ENUM; VkPolygonMode polygonMode = VK_POLYGON_MODE_FILL; + BlendState blendState; friend static bool operator==(const GraphicsPipelineConfiguration& first, const GraphicsPipelineConfiguration& other); }; @@ -99,7 +100,7 @@ namespace love { 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 setBlendState(const BlendState& blend) override { std::cout << "setBlendState "; } + void setBlendState(const BlendState& blend) override; void setPointSize(float size) override; void setWireframe(bool enable) override; PixelFormat getSizedFormat(PixelFormat format, bool rendertarget, bool readable) const override; diff --git a/src/modules/graphics/vulkan/Vulkan.cpp b/src/modules/graphics/vulkan/Vulkan.cpp index 3430ab9f1..22c642e3b 100644 --- a/src/modules/graphics/vulkan/Vulkan.cpp +++ b/src/modules/graphics/vulkan/Vulkan.cpp @@ -301,6 +301,60 @@ namespace love { throw love::Exception("unknown primitive type"); } } + + VkBlendFactor Vulkan::getBlendFactor(BlendFactor blendFactor) { + switch (blendFactor) { + case BLENDFACTOR_ZERO: + return VK_BLEND_FACTOR_ZERO; + case BLENDFACTOR_ONE: + return VK_BLEND_FACTOR_ONE; + case BLENDFACTOR_SRC_COLOR: + return VK_BLEND_FACTOR_SRC_COLOR; + case BLENDFACTOR_ONE_MINUS_SRC_COLOR: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; + case BLENDFACTOR_SRC_ALPHA: + return VK_BLEND_FACTOR_SRC_ALPHA; + case BLENDFACTOR_ONE_MINUS_SRC_ALPHA: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + case BLENDFACTOR_DST_COLOR: + return VK_BLEND_FACTOR_DST_COLOR; + case BLENDFACTOR_ONE_MINUS_DST_COLOR: + return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; + case BLENDFACTOR_DST_ALPHA: + return VK_BLEND_FACTOR_DST_ALPHA; + case BLENDFACTOR_ONE_MINUS_DST_ALPHA: + return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + case BLENDFACTOR_SRC_ALPHA_SATURATED: + return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE; + case BLENDFACTOR_MAX_ENUM: + throw love::Exception("unknown blend factor"); + } + } + + VkBlendOp Vulkan::getBlendOp(BlendOperation op) { + switch (op) { + case BLENDOP_ADD: + return VK_BLEND_OP_ADD; + case BLENDOP_MAX: + return VK_BLEND_OP_MAX; + case BLENDOP_MIN: + return VK_BLEND_OP_MIN; + case BLENDOP_SUBTRACT: + return VK_BLEND_OP_SUBTRACT; + case BLENDOP_REVERSE_SUBTRACT: + return VK_BLEND_OP_REVERSE_SUBTRACT; + case BLENDOP_MAX_ENUM: + throw love::Exception("unknown blend operation"); + } + } + + VkBool32 Vulkan::getBool(bool b) { + if (b) { + return VK_TRUE; + } else { + return VK_FALSE; + } + } } } } diff --git a/src/modules/graphics/vulkan/Vulkan.h b/src/modules/graphics/vulkan/Vulkan.h index f4a4c19e9..24ec40fdd 100644 --- a/src/modules/graphics/vulkan/Vulkan.h +++ b/src/modules/graphics/vulkan/Vulkan.h @@ -23,6 +23,9 @@ namespace love { static std::string getVendorName(uint32_t vendorId); static std::string getVulkanApiVersion(uint32_t apiVersion); static VkPrimitiveTopology getPrimitiveTypeTopology(graphics::PrimitiveType); + static VkBlendFactor getBlendFactor(BlendFactor); + static VkBlendOp getBlendOp(BlendOperation); + static VkBool32 getBool(bool); }; } }