Fix missing luminance and alpha floating-point format selection.

Bug 25351037

Change-Id: I0c758a218d15116fa5593eb9ddb783141ff93146
Reviewed-on: https://swiftshader-review.googlesource.com/4181
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index 04914c8..fbc3d42 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -37,12 +37,6 @@
 		Bytes_4,
 		Bytes_8,
 		Bytes_16,
-		AlphaFloat,
-		AlphaHalfFloat,
-		LuminanceFloat,
-		LuminanceHalfFloat,
-		LuminanceAlphaFloat,
-		LuminanceAlphaHalfFloat,
 		ByteRGB,
 		UByteRGB,
 		ShortRGB,
@@ -104,96 +98,6 @@
 	}
 
 	template<>
-	void LoadImageRow<AlphaFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const float *sourceF = reinterpret_cast<const float*>(source);
-		float *destF = reinterpret_cast<float*>(dest + (xoffset * 16));
-
-		for(int x = 0; x < width; x++)
-		{
-			destF[4 * x + 0] = 0;
-			destF[4 * x + 1] = 0;
-			destF[4 * x + 2] = 0;
-			destF[4 * x + 3] = sourceF[x];
-		}
-	}
-
-	template<>
-	void LoadImageRow<AlphaHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
-		unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8);
-
-		for(int x = 0; x < width; x++)
-		{
-			destH[4 * x + 0] = 0;
-			destH[4 * x + 1] = 0;
-			destH[4 * x + 2] = 0;
-			destH[4 * x + 3] = sourceH[x];
-		}
-	}
-
-	template<>
-	void LoadImageRow<LuminanceFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const float *sourceF = reinterpret_cast<const float*>(source);
-		float *destF = reinterpret_cast<float*>(dest + xoffset * 16);
-
-		for(int x = 0; x < width; x++)
-		{
-			destF[4 * x + 0] = sourceF[x];
-			destF[4 * x + 1] = sourceF[x];
-			destF[4 * x + 2] = sourceF[x];
-			destF[4 * x + 3] = 1.0f;
-		}
-	}
-
-	template<>
-	void LoadImageRow<LuminanceHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
-		unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8);
-
-		for(int x = 0; x < width; x++)
-		{
-			destH[4 * x + 0] = sourceH[x];
-			destH[4 * x + 1] = sourceH[x];
-			destH[4 * x + 2] = sourceH[x];
-			destH[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1
-		}
-	}
-
-	template<>
-	void LoadImageRow<LuminanceAlphaFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const float *sourceF = reinterpret_cast<const float*>(source);
-		float *destF = reinterpret_cast<float*>(dest + xoffset * 16);
-
-		for(int x = 0; x < width; x++)
-		{
-			destF[4 * x + 0] = sourceF[2 * x + 0];
-			destF[4 * x + 1] = sourceF[2 * x + 0];
-			destF[4 * x + 2] = sourceF[2 * x + 0];
-			destF[4 * x + 3] = sourceF[2 * x + 1];
-		}
-	}
-
-	template<>
-	void LoadImageRow<LuminanceAlphaHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
-		unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8);
-
-		for(int x = 0; x < width; x++)
-		{
-			destH[4 * x + 0] = sourceH[2 * x + 0];
-			destH[4 * x + 1] = sourceH[2 * x + 0];
-			destH[4 * x + 2] = sourceH[2 * x + 0];
-			destH[4 * x + 3] = sourceH[2 * x + 1];
-		}
-	}
-
-	template<>
 	void LoadImageRow<ByteRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		unsigned char *destB = dest + xoffset * 4;
@@ -689,11 +593,11 @@
 		#if S3TC_SUPPORT
 		case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
 		case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-				return sw::FORMAT_DXT1;
+			return sw::FORMAT_DXT1;
 		case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-				return sw::FORMAT_DXT3;
+			return sw::FORMAT_DXT3;
 		case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-				return sw::FORMAT_DXT5;
+			return sw::FORMAT_DXT5;
 		#endif
 		default:
 			break;
@@ -704,6 +608,15 @@
 		case GL_FLOAT:
 			switch(format)
 			{
+			case GL_ALPHA:
+			case GL_ALPHA32F_EXT:
+				return sw::FORMAT_A32F;
+			case GL_LUMINANCE:
+			case GL_LUMINANCE32F_EXT:
+				return sw::FORMAT_L32F;
+			case GL_LUMINANCE_ALPHA:
+			case GL_LUMINANCE_ALPHA32F_EXT:
+				return sw::FORMAT_A32L32F;
 			case GL_RED:
 			case GL_R32F:
 				return sw::FORMAT_R32F;
@@ -714,7 +627,7 @@
 			case GL_RGB32F:
 			case GL_RGBA:
 			case GL_RGBA32F:
-			return sw::FORMAT_A32B32G32R32F;
+				return sw::FORMAT_A32B32G32R32F;
 			case GL_DEPTH_COMPONENT:
 			case GL_DEPTH_COMPONENT32F:
 				return sw::FORMAT_D32F;
@@ -725,6 +638,15 @@
 		case GL_HALF_FLOAT_OES:
 			switch(format)
 			{
+			case GL_ALPHA:
+			case GL_ALPHA16F_EXT:
+				return sw::FORMAT_A16F;
+			case GL_LUMINANCE:
+			case GL_LUMINANCE16F_EXT:
+				return sw::FORMAT_L16F;
+			case GL_LUMINANCE_ALPHA:
+			case GL_LUMINANCE_ALPHA16F_EXT:
+				return sw::FORMAT_A16L16F;
 			case GL_RED:
 			case GL_R16F:
 				return sw::FORMAT_R16F;
@@ -735,7 +657,7 @@
 			case GL_RGB16F:
 			case GL_RGBA:
 			case GL_RGBA16F:
-			return sw::FORMAT_A16B16G16R16F;
+				return sw::FORMAT_A16B16G16R16F;
 			default:
 				UNREACHABLE(format);
 			}
@@ -1426,15 +1348,15 @@
 					// float textures are converted to RGBA, not BGRA
 					case GL_ALPHA:
 					case GL_ALPHA32F_EXT:
-						LoadImageData<AlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_LUMINANCE:
 					case GL_LUMINANCE32F_EXT:
-						LoadImageData<LuminanceFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_LUMINANCE_ALPHA:
 					case GL_LUMINANCE_ALPHA32F_EXT:
-						LoadImageData<LuminanceAlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_8>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_RED:
 					case GL_R32F:
@@ -1465,15 +1387,15 @@
 					{
 					case GL_ALPHA:
 					case GL_ALPHA16F_EXT:
-						LoadImageData<AlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_2>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_LUMINANCE:
 					case GL_LUMINANCE16F_EXT:
-						LoadImageData<LuminanceHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_2>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_LUMINANCE_ALPHA:
 					case GL_LUMINANCE_ALPHA16F_EXT:
-						LoadImageData<LuminanceAlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
+						LoadImageData<Bytes_4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
 						break;
 					case GL_RED:
 					case GL_R16F: