VK_EXT_blend_operation_advanced minimal implementation This CL adds support for VK_EXT_blend_operation_advanced, with limited features: - VkPipelineColorBlendAdvancedStateCreateInfoEXT::blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT - VkPipelineColorBlendAdvancedStateCreateInfoEXT::dstPremultiplied must be VK_TRUE - VkPipelineColorBlendAdvancedStateCreateInfoEXT::srcPremultiplied must be VK_TRUE Tests: dEQP-VK.api.info.vulkan1p2_limits_validation.ext_blend_operation_advanced Tests: dEQP-VK.pipeline.blend_operation_advanced.* Bug: b/203652972 Change-Id: I046452c4399e4895dd98689ce237b50353dcf24a Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/58348 Commit-Queue: Alexis Hétu <sugoi@google.com> Tested-by: Alexis Hétu <sugoi@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/PixelRoutine.hpp b/src/Pipeline/PixelRoutine.hpp index 3f410e7..ba5f28d 100644 --- a/src/Pipeline/PixelRoutine.hpp +++ b/src/Pipeline/PixelRoutine.hpp
@@ -77,6 +77,19 @@ void blendFactorRGB(Vector4f &blendFactorRGB, const Vector4f &sourceColor, const Vector4f &destColor, VkBlendFactor colorBlendFactor, vk::Format format); void blendFactorAlpha(Float4 &blendFactorAlpha, const Float4 &sourceAlpha, const Float4 &destAlpha, VkBlendFactor alphaBlendFactor, vk::Format format); bool blendFactorCanExceedFormatRange(VkBlendFactor blendFactor, vk::Format format); + Vector4f computeAdvancedBlendMode(int index, const Vector4f &src, const Vector4f &dst, const Vector4f &srcFactor, const Vector4f &dstFactor); + Float4 blendOpOverlay(Float4 &src, Float4 &dst); + Float4 blendOpColorDodge(Float4 &src, Float4 &dst); + Float4 blendOpColorBurn(Float4 &src, Float4 &dst); + Float4 blendOpHardlight(Float4 &src, Float4 &dst); + Float4 blendOpSoftlight(Float4 &src, Float4 &dst); + void setLumSat(Vector4f &cbase, Vector4f &csat, Vector4f &clum, Float4 &x, Float4 &y, Float4 &z); + void setLum(Vector4f &cbase, Vector4f &clum, Float4 &x, Float4 &y, Float4 &z); + Float4 computeLum(Float4 &color, Float4 &lum, Float4 &mincol, Float4 &maxcol, Int4 &negative, Int4 &aboveOne); + Float4 maxRGB(Vector4f &c); + Float4 minRGB(Vector4f &c); + Float4 lumRGB(Vector4f &c); + void premultiply(Vector4f &c); void writeStencil(Pointer<Byte> &sBuffer, const Int &x, const Int sMask[4], const Int zMask[4], const Int cMask[4], const SampleSet &samples); void writeDepth(Pointer<Byte> &zBuffer, const Int &x, const Int zMask[4], const SampleSet &samples); void occlusionSampleCount(const Int zMask[4], const Int sMask[4], const SampleSet &samples);