Optimize sRGB conversion using FMA
Bug: b/216472189
Change-Id: I8066bcc6efc159004dbf01ad10bd197f064ca423
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/64949
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/ShaderCore.cpp b/src/Pipeline/ShaderCore.cpp
index 42a289d..507767c 100644
--- a/src/Pipeline/ShaderCore.cpp
+++ b/src/Pipeline/ShaderCore.cpp
@@ -702,7 +702,7 @@
Float4 linearToSRGB(const Float4 &c)
{
Float4 lc = Min(c, 0.0031308f) * 12.92f;
- Float4 ec = Float4(1.055f) * Pow<Mediump>(c, (1.0f / 2.4f)) - 0.055f; // TODO(b/149574741): Use a custom approximation.
+ Float4 ec = MulAdd(1.055f, Pow<Mediump>(c, (1.0f / 2.4f)), -0.055f); // TODO(b/149574741): Use a custom approximation.
return Max(lc, ec);
}
@@ -710,7 +710,7 @@
Float4 sRGBtoLinear(const Float4 &c)
{
Float4 lc = c * (1.0f / 12.92f);
- Float4 ec = Pow<Mediump>((c + 0.055f) * (1.0f / 1.055f), 2.4f); // TODO(b/149574741): Use a custom approximation.
+ Float4 ec = Pow<Mediump>(MulAdd(c, 1.0f / 1.055f, 0.055f / 1.055f), 2.4f); // TODO(b/149574741): Use a custom approximation.
Int4 linear = CmpLT(c, 0.04045f);
return As<Float4>((linear & As<Int4>(lc)) | (~linear & As<Int4>(ec))); // TODO: IfThenElse()