Refactor blending

This change mainly renames `oC`, which was the name for a Direct3D 9
color output register, to something that is more readable.

Also the `one` variable in `alphaBlend` was eliminated, since there are
no unnormalized formats which are blendable.

Also we no longer discern between VK_FORMAT_R16_SINT and R16_UINT in
writeColor, since the code paths only differed in casting Int to Short
or UShort, which are identical truncation operations.

Bug: b/134584057
Change-Id: I855d40746b405fb7873cf2a800ec26c6ad533daf
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/58788
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/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index ba49834..54e7ead 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -208,7 +208,7 @@
 
 	for(int i = 0; i < MAX_COLOR_BUFFERS; i++)
 	{
-		c[i].x = routine.outputs[i * 4];
+		c[i].x = routine.outputs[i * 4 + 0];
 		c[i].y = routine.outputs[i * 4 + 1];
 		c[i].z = routine.outputs[i * 4 + 2];
 		c[i].w = routine.outputs[i * 4 + 3];
@@ -342,9 +342,8 @@
 			for(unsigned int q : samples)
 			{
 				Pointer<Byte> buffer = cBuffer[index] + q * *Pointer<Int>(data + OFFSET(DrawData, colorSliceB[index]));
-				Vector4f color = c[index];
 
-				alphaBlend(index, buffer, color, x);
+				Vector4f color = alphaBlend(index, buffer, c[index], x);
 				writeColor(index, buffer, x, color, sMask[q], zMask[q], cMask[q]);
 			}
 			break;
@@ -354,8 +353,12 @@
 	}
 }
 
-void PixelProgram::clampColor(Vector4f oC[MAX_COLOR_BUFFERS])
+void PixelProgram::clampColor(Vector4f color[MAX_COLOR_BUFFERS])
 {
+	// "If the color attachment is fixed-point, the components of the source and destination values and blend factors
+	//  are each clamped to [0,1] or [-1,1] respectively for an unsigned normalized or signed normalized color attachment
+	//  prior to evaluating the blend operations. If the color attachment is floating-point, no clamping occurs."
+
 	for(int index = 0; index < MAX_COLOR_BUFFERS; index++)
 	{
 		if(!state.colorWriteActive(index) && !(index == 0 && state.alphaToCoverage))
@@ -388,14 +391,10 @@
 		case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
 		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
 		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
-			oC[index].x = Max(oC[index].x, Float4(0.0f));
-			oC[index].x = Min(oC[index].x, Float4(1.0f));
-			oC[index].y = Max(oC[index].y, Float4(0.0f));
-			oC[index].y = Min(oC[index].y, Float4(1.0f));
-			oC[index].z = Max(oC[index].z, Float4(0.0f));
-			oC[index].z = Min(oC[index].z, Float4(1.0f));
-			oC[index].w = Max(oC[index].w, Float4(0.0f));
-			oC[index].w = Min(oC[index].w, Float4(1.0f));
+			color[index].x = Min(Max(color[index].x, Float4(0.0f)), Float4(1.0f));
+			color[index].y = Min(Max(color[index].y, Float4(0.0f)), Float4(1.0f));
+			color[index].z = Min(Max(color[index].z, Float4(0.0f)), Float4(1.0f));
+			color[index].w = Min(Max(color[index].w, Float4(0.0f)), Float4(1.0f));
 			break;
 		case VK_FORMAT_R32_SFLOAT:
 		case VK_FORMAT_R32G32_SFLOAT: