Commit 61161500 by Alexis Hetu Committed by Alexis Hétu

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/3192Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 7dfbee61
...@@ -378,6 +378,7 @@ namespace egl ...@@ -378,6 +378,7 @@ namespace egl
default: UNREACHABLE(); default: UNREACHABLE();
} }
break; break;
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
switch(format) switch(format)
{ {
...@@ -503,7 +504,7 @@ namespace egl ...@@ -503,7 +504,7 @@ namespace egl
{ {
return sw::FORMAT_A32B32G32R32F; 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; return sw::FORMAT_A16B16G16R16F;
} }
...@@ -650,6 +651,7 @@ namespace egl ...@@ -650,6 +651,7 @@ namespace egl
default: UNREACHABLE(); default: UNREACHABLE();
} }
break; break;
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
switch(format) switch(format)
{ {
......
...@@ -3179,7 +3179,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -3179,7 +3179,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
memcpy(dest, source, (rect.x1 - rect.x0) * 4); memcpy(dest, source, (rect.x1 - rect.x0) * 4);
} }
else if(renderTarget->getInternalFormat() == sw::FORMAT_A16B16G16R16F && 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); memcpy(dest, source, (rect.x1 - rect.x0) * 8);
} }
......
...@@ -459,7 +459,7 @@ GLenum Framebuffer::getImplementationColorReadType() ...@@ -459,7 +459,7 @@ GLenum Framebuffer::getImplementationColorReadType()
{ {
switch(colorbuffer->getInternalFormat()) 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_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
......
...@@ -204,10 +204,12 @@ static FormatMap BuildFormatMap3D() ...@@ -204,10 +204,12 @@ static FormatMap BuildFormatMap3D()
InsertFormatMapping(map, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE); InsertFormatMapping(map, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
InsertFormatMapping(map, GL_ALPHA, GL_ALPHA, 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_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_HALF_FLOAT_OES);
InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT); InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT);
InsertFormatMapping(map, GL_R32F_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_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_HALF_FLOAT_OES);
InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT); InsertFormatMapping(map, GL_R16F_EXT, GL_RED_EXT, GL_FLOAT);
InsertFormatMapping(map, GL_RG32F_EXT, GL_RG_EXT, GL_FLOAT); InsertFormatMapping(map, GL_RG32F_EXT, GL_RG_EXT, GL_FLOAT);
...@@ -215,6 +217,7 @@ static FormatMap BuildFormatMap3D() ...@@ -215,6 +217,7 @@ static FormatMap BuildFormatMap3D()
InsertFormatMapping(map, GL_SRGB8_NV, GL_RGB, GL_UNSIGNED_BYTE); 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_BYTE);
InsertFormatMapping(map, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); 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_HALF_FLOAT_OES);
InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_FLOAT); InsertFormatMapping(map, GL_RGB16F_EXT, GL_RGB, GL_FLOAT);
InsertFormatMapping(map, GL_RGB32F_EXT, GL_RGB, GL_FLOAT); InsertFormatMapping(map, GL_RGB32F_EXT, GL_RGB, GL_FLOAT);
...@@ -226,6 +229,7 @@ static FormatMap BuildFormatMap3D() ...@@ -226,6 +229,7 @@ static FormatMap BuildFormatMap3D()
InsertFormatMapping(map, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE); 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_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_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_HALF_FLOAT_OES);
InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_FLOAT); InsertFormatMapping(map, GL_RGBA16F_EXT, GL_RGBA, GL_FLOAT);
InsertFormatMapping(map, GL_RGBA32F_EXT, GL_RGBA, GL_FLOAT); InsertFormatMapping(map, GL_RGBA32F_EXT, GL_RGBA, GL_FLOAT);
...@@ -243,6 +247,7 @@ static bool ValidateType3D(GLenum type) ...@@ -243,6 +247,7 @@ static bool ValidateType3D(GLenum type)
case GL_SHORT: case GL_SHORT:
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
case GL_INT: case GL_INT:
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
case GL_FLOAT: case GL_FLOAT:
case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5:
...@@ -4891,7 +4896,8 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -4891,7 +4896,8 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
if(context) if(context)
{ {
if(context->getClientVersion() < 3) egl::GLint clientVersion = context->getClientVersion();
if(clientVersion < 3)
{ {
if(internalformat != format) if(internalformat != format)
{ {
...@@ -4906,6 +4912,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -4906,6 +4912,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_LUMINANCE_ALPHA: case GL_LUMINANCE_ALPHA:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
...@@ -4938,8 +4950,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -4938,8 +4950,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_R16F: case GL_R16F:
switch(type) switch(type)
{ {
case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5235,8 +5253,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5235,8 +5253,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RG16F: case GL_RG16F:
switch(type) switch(type)
{ {
case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5261,6 +5285,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5261,6 +5285,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RGB: case GL_RGB:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5:
case GL_FLOAT: case GL_FLOAT:
...@@ -5310,9 +5340,15 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5310,9 +5340,15 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_R11F_G11F_B10F: case GL_R11F_G11F_B10F:
switch(type) 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_UNSIGNED_INT_10F_11F_11F_REV:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5321,9 +5357,15 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5321,9 +5357,15 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RGB9_E5: case GL_RGB9_E5:
switch(type) 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_UNSIGNED_INT_5_9_9_9_REV:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5332,8 +5374,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5332,8 +5374,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RGB16F: case GL_RGB16F:
switch(type) switch(type)
{ {
case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5358,6 +5406,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5358,6 +5406,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RGBA: case GL_RGBA:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_5_5_5_1:
...@@ -5428,8 +5482,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5428,8 +5482,14 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_RGBA16F: case GL_RGBA16F:
switch(type) switch(type)
{ {
case GL_FLOAT:
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -5931,7 +5991,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5931,7 +5991,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(!es2::CheckTextureFormatType(format, type)) if(!es2::CheckTextureFormatType(format, type, egl::getClientVersion()))
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
......
...@@ -298,7 +298,7 @@ namespace es2 ...@@ -298,7 +298,7 @@ namespace es2
} }
// Verify that format/type are one of the combinations from table 3.4. // 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) switch(type)
{ {
...@@ -315,6 +315,11 @@ namespace es2 ...@@ -315,6 +315,11 @@ namespace es2
default: default:
return false; return false;
} }
case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return false;
}
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
switch(format) switch(format)
......
...@@ -43,7 +43,7 @@ namespace es2 ...@@ -43,7 +43,7 @@ namespace es2
bool IsCubemapTextureTarget(GLenum target); bool IsCubemapTextureTarget(GLenum target);
int CubeFaceIndex(GLenum cubeTarget); int CubeFaceIndex(GLenum cubeTarget);
bool IsTextureTarget(GLenum target); bool IsTextureTarget(GLenum target);
bool CheckTextureFormatType(GLenum format, GLenum type); bool CheckTextureFormatType(GLenum format, GLenum type, egl::GLint clientVersion);
bool IsColorRenderable(GLenum internalformat); bool IsColorRenderable(GLenum internalformat);
bool IsDepthRenderable(GLenum internalformat); bool IsDepthRenderable(GLenum internalformat);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment