Refactor float to fixed-point conversion

convertFixed16() and convertFloat32() are relics from when SwiftShader
had both a programmable floating-point fragment pipeline and a fixed-
function pipeline. Back then it made sense to abstract these common
conversions, but more recently it was no longer used for the same
purpose and it obscured important information like the actual
normalization factor. So this change eliminates them and performs the
conversions explicitly in the few remaining places where these functions
were still being used.

Also, 0xFFFFu has been replaced with 0xFFFF where the (un)signedness
has no effect. The latter is slightly easier on the eyes to parse.

Bug: b/204919030
Change-Id: Ie822319b687555baefbb11a7120a422c5653e28d
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/67048
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Sean Risser <srisser@google.com>
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index 6eb60b0..9933839 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -306,10 +306,10 @@
 
 				ASSERT(SIMD::Width == 4);
 				Vector4s color;
-				color.x = convertFixed16(Extract128(colorf.x, 0), true);
-				color.y = convertFixed16(Extract128(colorf.y, 0), true);
-				color.z = convertFixed16(Extract128(colorf.z, 0), true);
-				color.w = convertFixed16(Extract128(colorf.w, 0), true);
+				color.x = UShort4(Extract128(colorf.x, 0) * 0xFFFF, true);  // Saturating
+				color.y = UShort4(Extract128(colorf.y, 0) * 0xFFFF, true);  // Saturating
+				color.z = UShort4(Extract128(colorf.z, 0) * 0xFFFF, true);  // Saturating
+				color.w = UShort4(Extract128(colorf.w, 0) * 0xFFFF, true);  // Saturating
 				writeColor(index, buffer, x, color, sMask[q], zMask[q], cMask[q]);
 			}
 			break;
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 07b3db1..5c499e2 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -477,7 +477,7 @@
 		switch(state.depthFormat)
 		{
 		case VK_FORMAT_D16_UNORM:
-			Z = Min(Max(Round(z * 0xFFFFu), 0.0f), 0xFFFFu);
+			Z = Min(Max(Round(z * 0xFFFF), 0.0f), 0xFFFF);
 			zValue = getDepthValue16(zBuffer, q, x);
 			break;
 		case VK_FORMAT_D32_SFLOAT:
@@ -561,7 +561,7 @@
 	z = Insert(z, *Pointer<Int>(buffer), 0);
 	z = Insert(z, *Pointer<Int>(buffer + pitch), 1);
 
-	Float4 zValue = convertFloat32(As<UShort4>(z));
+	Float4 zValue = Float4(As<UShort4>(z)) * (1.0f / 0xFFFF);
 	return Int4(CmpLE(minDepthBound, zValue) & CmpLE(zValue, maxDepthBound));
 }
 
@@ -657,7 +657,7 @@
 
 void PixelRoutine::writeDepth16(Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &zMask)
 {
-	Short4 Z = UShort4(Round(z * 0xFFFFu), true);
+	Short4 Z = UShort4(Round(z * 0xFFFF), true);
 
 	Pointer<Byte> buffer = zBuffer + 2 * x;
 	Int pitch = *Pointer<Int>(data + OFFSET(DrawData, depthPitchB));
@@ -2256,7 +2256,7 @@
 		buffer += pitchB;
 		texelColor.x.z = Float(Int(*Pointer<UShort>(buffer + 0)));
 		texelColor.x.w = Float(Int(*Pointer<UShort>(buffer + 2)));
-		texelColor.x *= (1.0f / 0xFFFFu);
+		texelColor.x *= (1.0f / 0xFFFF);
 		texelColor.y = texelColor.z = texelColor.w = 1.0f;
 		break;
 	case VK_FORMAT_R16_SFLOAT:
@@ -2279,8 +2279,8 @@
 		texelColor.y.z = Float(Int(*Pointer<UShort>(buffer + 2)));
 		texelColor.x.w = Float(Int(*Pointer<UShort>(buffer + 4)));
 		texelColor.y.w = Float(Int(*Pointer<UShort>(buffer + 6)));
-		texelColor.x *= (1.0f / 0xFFFFu);
-		texelColor.y *= (1.0f / 0xFFFFu);
+		texelColor.x *= (1.0f / 0xFFFF);
+		texelColor.y *= (1.0f / 0xFFFF);
 		texelColor.z = texelColor.w = 1.0f;
 		break;
 	case VK_FORMAT_R16G16_SFLOAT:
@@ -2315,10 +2315,10 @@
 		texelColor.y.w = Float(Int(*Pointer<UShort>(buffer + 0xa)));
 		texelColor.z.w = Float(Int(*Pointer<UShort>(buffer + 0xc)));
 		texelColor.w.w = Float(Int(*Pointer<UShort>(buffer + 0xe)));
-		texelColor.x *= (1.0f / 0xFFFFu);
-		texelColor.y *= (1.0f / 0xFFFFu);
-		texelColor.z *= (1.0f / 0xFFFFu);
-		texelColor.w *= (1.0f / 0xFFFFu);
+		texelColor.x *= (1.0f / 0xFFFF);
+		texelColor.y *= (1.0f / 0xFFFF);
+		texelColor.z *= (1.0f / 0xFFFF);
+		texelColor.w *= (1.0f / 0xFFFF);
 		break;
 	case VK_FORMAT_R16G16B16A16_SFLOAT:
 		buffer += 8 * x;
@@ -2355,10 +2355,10 @@
 			// Attempt to read an integer based format and convert it to float
 			Vector4s color;
 			readPixel(index, cBuffer, x, color);
-			texelColor.x = convertFloat32(As<UShort4>(color.x));
-			texelColor.y = convertFloat32(As<UShort4>(color.y));
-			texelColor.z = convertFloat32(As<UShort4>(color.z));
-			texelColor.w = convertFloat32(As<UShort4>(color.w));
+			texelColor.x = Float4(As<UShort4>(color.x)) * (1.0f / 0xFFFF);
+			texelColor.y = Float4(As<UShort4>(color.y)) * (1.0f / 0xFFFF);
+			texelColor.z = Float4(As<UShort4>(color.z)) * (1.0f / 0xFFFF);
+			texelColor.w = Float4(As<UShort4>(color.w)) * (1.0f / 0xFFFF);
 		}
 		break;
 	}
@@ -2501,17 +2501,17 @@
 	{
 	case VK_FORMAT_R16G16B16A16_UNORM:
 		color.w = Min(Max(color.w, 0.0f), 1.0f);  // TODO(b/204560089): Omit clamp if redundant
-		color.w = As<Float4>(RoundInt(color.w * 0xFFFFu));
+		color.w = As<Float4>(RoundInt(color.w * 0xFFFF));
 		color.z = Min(Max(color.z, 0.0f), 1.0f);  // TODO(b/204560089): Omit clamp if redundant
-		color.z = As<Float4>(RoundInt(color.z * 0xFFFFu));
+		color.z = As<Float4>(RoundInt(color.z * 0xFFFF));
 		// [[fallthrough]]
 	case VK_FORMAT_R16G16_UNORM:
 		color.y = Min(Max(color.y, 0.0f), 1.0f);  // TODO(b/204560089): Omit clamp if redundant
-		color.y = As<Float4>(RoundInt(color.y * 0xFFFFu));
+		color.y = As<Float4>(RoundInt(color.y * 0xFFFF));
 		//[[fallthrough]]
 	case VK_FORMAT_R16_UNORM:
 		color.x = Min(Max(color.x, 0.0f), 1.0f);  // TODO(b/204560089): Omit clamp if redundant
-		color.x = As<Float4>(RoundInt(color.x * 0xFFFFu));
+		color.x = As<Float4>(RoundInt(color.x * 0xFFFF));
 		break;
 	default:
 		// TODO(b/204560089): Omit clamp if redundant
@@ -3146,16 +3146,6 @@
 	}
 }
 
-UShort4 PixelRoutine::convertFixed16(const Float4 &cf, bool saturate)
-{
-	return UShort4(cf * 0xFFFFu, saturate);
-}
-
-Float4 PixelRoutine::convertFloat32(const UShort4 &cf)
-{
-	return Float4(cf) * (1.0f / 65535.0f);
-}
-
 void PixelRoutine::sRGBtoLinear16_12_16(Vector4s &c)
 {
 	Pointer<Byte> LUT = constants + OFFSET(Constants, sRGBtoLinear12_16);
diff --git a/src/Pipeline/PixelRoutine.hpp b/src/Pipeline/PixelRoutine.hpp
index 6aa1f88..fde0011 100644
--- a/src/Pipeline/PixelRoutine.hpp
+++ b/src/Pipeline/PixelRoutine.hpp
@@ -59,8 +59,6 @@
 	void writeColor(int index, const Pointer<Byte> &cBuffer, const Int &x, Vector4s &current, const Int &sMask, const Int &zMask, const Int &cMask);
 
 	bool isSRGB(int index) const;
-	UShort4 convertFixed16(const Float4 &cf, bool saturate = true);
-	Float4 convertFloat32(const UShort4 &cf);
 	void linearToSRGB12_16(Vector4s &c);
 
 private: