GL_HALF_FLOAT vs GL_HALF_FLOAT_OES

GL_HALF_FLOAT and GL_HALF_FLOAT_OES
do not have the same value, so to
be able to support GL_HALF_FLOAT
(in OpenGL ES 3.0) the same way we
used to support GL_HALF_FLOAT_OES
(in OpenGL ES 2.0), a few spots in
the code need to handle both cases.

Change-Id: I1fa60c51c65d693f5cc45124cd71411320f24014
Reviewed-on: https://swiftshader-review.googlesource.com/3192
Tested-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 9dd58d5..a0e93ce 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -378,6 +378,7 @@
 			default: UNREACHABLE();
 			}
 			break;
+		case GL_HALF_FLOAT:
 		case GL_HALF_FLOAT_OES:
 			switch(format)
 			{
@@ -503,7 +504,7 @@
 		{
 			return sw::FORMAT_A32B32G32R32F;
 		}
-		else if(type == GL_HALF_FLOAT_OES)
+		else if(type == GL_HALF_FLOAT || type == GL_HALF_FLOAT_OES)
 		{
 			return sw::FORMAT_A16B16G16R16F;
 		}
@@ -650,6 +651,7 @@
 				default: UNREACHABLE();
 				}
 				break;
+			case GL_HALF_FLOAT:
 			case GL_HALF_FLOAT_OES:
 				switch(format)
 				{
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 3c0aaea..8e7ebf9 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -3179,7 +3179,7 @@
             memcpy(dest, source, (rect.x1 - rect.x0) * 4);

         }

 		else if(renderTarget->getInternalFormat() == sw::FORMAT_A16B16G16R16F &&

-                format == GL_RGBA && type == GL_HALF_FLOAT_OES)

+                format == GL_RGBA && (type == GL_HALF_FLOAT || type == GL_HALF_FLOAT_OES))

         {

             memcpy(dest, source, (rect.x1 - rect.x0) * 8);

         }

diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index e2cc168..c6c30fb 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -459,7 +459,7 @@
 	{
 		switch(colorbuffer->getInternalFormat())
 		{
-		case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES;
+		case sw::FORMAT_A16B16G16R16F: return (egl::getClientVersion() < 3) ? GL_HALF_FLOAT_OES : GL_HALF_FLOAT;
 		case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
 		case sw::FORMAT_A8R8G8B8:      return GL_UNSIGNED_BYTE;
 		case sw::FORMAT_A8B8G8R8:      return GL_UNSIGNED_BYTE;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 71a6dc3..7120a96 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -204,10 +204,12 @@
 	InsertFormatMapping(map, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);

 	InsertFormatMapping(map, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);

 	InsertFormatMapping(map, GL_R8_EXT, GL_RED_EXT, GL_UNSIGNED_BYTE);

+	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT);

 	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES);

 	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT);

 	InsertFormatMapping(map, GL_R32F_EXT, GL_RED_EXT, GL_FLOAT);

 	InsertFormatMapping(map, GL_RG8_EXT, GL_RG_EXT, GL_UNSIGNED_BYTE);

+	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT);

 	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES);

 	InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT);

 	InsertFormatMapping(map, GL_RG32F_EXT, GL_RG_EXT, GL_FLOAT);

@@ -215,6 +217,7 @@
 	InsertFormatMapping(map, GL_SRGB8_NV, GL_RGB, GL_UNSIGNED_BYTE);

 	InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE);

 	InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);

+	InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT);

 	InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT_OES);

 	InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_FLOAT);

 	InsertFormatMapping(map, GL_RGB32F_EXT, GL_RGB, GL_FLOAT);

@@ -226,6 +229,7 @@
 	InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE);

 	InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);

 	InsertFormatMapping(map, GL_RGB10_A2_EXT, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV_EXT);

+	InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT);

 	InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT_OES);

 	InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_FLOAT);

 	InsertFormatMapping(map, GL_RGBA32F_EXT, GL_RGBA, GL_FLOAT);

@@ -243,6 +247,7 @@
 	case GL_SHORT:

 	case GL_UNSIGNED_INT:

 	case GL_INT:

+	case GL_HALF_FLOAT:

 	case GL_HALF_FLOAT_OES:

 	case GL_FLOAT:

 	case GL_UNSIGNED_SHORT_5_6_5:

@@ -4891,7 +4896,8 @@
 

 	if(context)

 	{

-		if(context->getClientVersion() < 3)

+		egl::GLint clientVersion = context->getClientVersion();

+		if(clientVersion < 3)

 		{

 			if(internalformat != format)

 			{

@@ -4906,6 +4912,12 @@
 		case GL_LUMINANCE_ALPHA:

 			switch(type)

 			{

+			case GL_HALF_FLOAT:

+				if(clientVersion < 3)

+				{

+					return error(GL_INVALID_ENUM);

+				}

+				break;

 			case GL_UNSIGNED_BYTE:

 			case GL_FLOAT:

 			case GL_HALF_FLOAT_OES:

@@ -4938,8 +4950,14 @@
 			case GL_R16F:

 				switch(type)

 				{

-				case GL_FLOAT:

 				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

+				case GL_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5235,8 +5253,14 @@
 			case GL_RG16F:

 				switch(type)

 				{

-				case GL_FLOAT:

 				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

+				case GL_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5261,6 +5285,12 @@
 			case GL_RGB:

 				switch(type)

 				{

+				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

 				case GL_UNSIGNED_BYTE:

 				case GL_UNSIGNED_SHORT_5_6_5:

 				case GL_FLOAT:

@@ -5310,9 +5340,15 @@
 			case GL_R11F_G11F_B10F:

 				switch(type)

 				{

+				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

 				case GL_UNSIGNED_INT_10F_11F_11F_REV:

 				case GL_FLOAT:

-				case GL_HALF_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5321,9 +5357,15 @@
 			case GL_RGB9_E5:

 				switch(type)

 				{

+				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

 				case GL_UNSIGNED_INT_5_9_9_9_REV:

 				case GL_FLOAT:

-				case GL_HALF_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5332,8 +5374,14 @@
 			case GL_RGB16F:

 				switch(type)

 				{

-				case GL_FLOAT:

 				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

+				case GL_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5358,6 +5406,12 @@
 			case GL_RGBA:

 				switch(type)

 				{

+				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

 				case GL_UNSIGNED_BYTE:

 				case GL_UNSIGNED_SHORT_4_4_4_4:

 				case GL_UNSIGNED_SHORT_5_5_5_1:

@@ -5428,8 +5482,14 @@
 			case GL_RGBA16F:

 				switch(type)

 				{

-				case GL_FLOAT:

 				case GL_HALF_FLOAT:

+					if(clientVersion < 3)

+					{

+						return error(GL_INVALID_ENUM);

+					}

+					break;

+				case GL_FLOAT:

+				case GL_HALF_FLOAT_OES:

 					break;

 				default:

 					return error(GL_INVALID_ENUM);

@@ -5931,7 +5991,7 @@
 		return error(GL_INVALID_VALUE);

 	}

 

-	if(!es2::CheckTextureFormatType(format, type))

+	if(!es2::CheckTextureFormatType(format, type, egl::getClientVersion()))

 	{

 		return error(GL_INVALID_ENUM);

 	}

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index c8381e1..3f73295 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -298,7 +298,7 @@
 	}

 

 	// Verify that format/type are one of the combinations from table 3.4.

-	bool CheckTextureFormatType(GLenum format, GLenum type)

+	bool CheckTextureFormatType(GLenum format, GLenum type, egl::GLint clientVersion)

 	{

 		switch(type)

 		{

@@ -315,6 +315,11 @@
 			default:

 				return false;

 			}

+		case GL_HALF_FLOAT:

+			if(clientVersion < 3)

+			{

+				return false;

+			}

 		case GL_FLOAT:

 		case GL_HALF_FLOAT_OES:

 			switch(format)

diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index e02d704..9042d06 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -43,7 +43,7 @@
 	bool IsCubemapTextureTarget(GLenum target);

 	int CubeFaceIndex(GLenum cubeTarget);

 	bool IsTextureTarget(GLenum target);

-	bool CheckTextureFormatType(GLenum format, GLenum type);

+	bool CheckTextureFormatType(GLenum format, GLenum type, egl::GLint clientVersion);

 

 	bool IsColorRenderable(GLenum internalformat);

 	bool IsDepthRenderable(GLenum internalformat);