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);