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