Added FORMAT_X32B32G32R32F as a renderable format

Added code to properly render to alphaless floating point formats.

Change-Id: I2e226fb787d8456f61a2946fb9c0d8a9dbb58243
Reviewed-on: https://swiftshader-review.googlesource.com/5128
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 334844b..8e5f4fb 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -305,6 +305,8 @@
 			((float*)element)[0] = color.r;
 			((float*)element)[1] = color.g;
 			break;
+		case FORMAT_X32B32G32R32F:
+			((float*)element)[3] = 1.0f;
 		case FORMAT_B32G32R32F:
 			((float*)element)[0] = color.r;
 			((float*)element)[1] = color.g;
@@ -946,6 +948,7 @@
 			r = ((float*)element)[0];
 			g = ((float*)element)[1];
 			break;
+		case FORMAT_X32B32G32R32F:
 		case FORMAT_B32G32R32F:
 			r = ((float*)element)[0];
 			g = ((float*)element)[1];
@@ -1569,6 +1572,7 @@
 		case FORMAT_R32F:				return 4;
 		case FORMAT_G32R32F:			return 8;
 		case FORMAT_B32G32R32F:			return 12;
+		case FORMAT_X32B32G32R32F:		return 16;
 		case FORMAT_A32B32G32R32F:		return 16;
 		// Depth/stencil formats
 		case FORMAT_D16:				return 2;
@@ -2690,6 +2694,7 @@
 			return false;
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
+		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
 		case FORMAT_D32F:
 		case FORMAT_D32F_COMPLEMENTARY:
@@ -2774,6 +2779,7 @@
 		case FORMAT_G8R8I_SNORM:
 			return component >= 2;
 		case FORMAT_A16W16V16U16:
+		case FORMAT_X32B32G32R32F:
 		case FORMAT_X8B8G8R8I:
 		case FORMAT_X16B16G16R16I:
 		case FORMAT_X32B32G32R32I:
@@ -2968,6 +2974,7 @@
 		case FORMAT_Q16W16V16U16:   return 4;
 		case FORMAT_R32F:           return 1;
 		case FORMAT_G32R32F:        return 2;
+		case FORMAT_X32B32G32R32F:  return 3;
 		case FORMAT_A32B32G32R32F:  return 4;
 		case FORMAT_D32F:           return 1;
 		case FORMAT_D32F_LOCKABLE:  return 1;
@@ -3591,21 +3598,22 @@
 		case FORMAT_A16F:			return FORMAT_A32B32G32R32F;
 		case FORMAT_R16F:			return FORMAT_R32F;
 		case FORMAT_G16R16F:		return FORMAT_G32R32F;
-		case FORMAT_B16G16R16F:     return FORMAT_A32B32G32R32F;
+		case FORMAT_B16G16R16F:     return FORMAT_X32B32G32R32F;
 		case FORMAT_A16B16G16R16F:	return FORMAT_A32B32G32R32F;
 		case FORMAT_A32F:			return FORMAT_A32B32G32R32F;
 		case FORMAT_R32F:			return FORMAT_R32F;
 		case FORMAT_G32R32F:		return FORMAT_G32R32F;
-		case FORMAT_B32G32R32F:     return FORMAT_A32B32G32R32F;
+		case FORMAT_B32G32R32F:     return FORMAT_X32B32G32R32F;
+		case FORMAT_X32B32G32R32F:  return FORMAT_X32B32G32R32F;
 		case FORMAT_A32B32G32R32F:	return FORMAT_A32B32G32R32F;
 		// Luminance formats
 		case FORMAT_L8:				return FORMAT_L8;
 		case FORMAT_A4L4:			return FORMAT_A8L8;
 		case FORMAT_L16:			return FORMAT_L16;
 		case FORMAT_A8L8:			return FORMAT_A8L8;
-		case FORMAT_L16F:           return FORMAT_A32B32G32R32F;
+		case FORMAT_L16F:           return FORMAT_X32B32G32R32F;
 		case FORMAT_A16L16F:        return FORMAT_A32B32G32R32F;
-		case FORMAT_L32F:           return FORMAT_A32B32G32R32F;
+		case FORMAT_L32F:           return FORMAT_X32B32G32R32F;
 		case FORMAT_A32L32F:        return FORMAT_A32B32G32R32F;
 		// Depth/stencil formats
 		case FORMAT_D16:
@@ -5142,7 +5150,7 @@
 				else ASSERT(false);
 			}
 		}
-		else if(internal.format == FORMAT_A32B32G32R32F)
+		else if(internal.format == FORMAT_A32B32G32R32F || internal.format == FORMAT_X32B32G32R32F)
 		{
 			if(CPUID::supportsSSE())
 			{