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
default: UNREACHABLE();
}
break;
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES:
switch(format)
{
......@@ -503,7 +504,7 @@ namespace egl
{
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 @@ namespace egl
default: UNREACHABLE();
}
break;
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES:
switch(format)
{
......
......@@ -3179,7 +3179,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
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);
}
......
......@@ -459,7 +459,7 @@ GLenum Framebuffer::getImplementationColorReadType()
{
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;
......
......@@ -204,10 +204,12 @@ static FormatMap BuildFormatMap3D()
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 @@ static FormatMap BuildFormatMap3D()
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 @@ static FormatMap BuildFormatMap3D()
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 @@ static bool ValidateType3D(GLenum type)
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
if(context)
{
if(context->getClientVersion() < 3)
egl::GLint clientVersion = context->getClientVersion();
if(clientVersion < 3)
{
if(internalformat != format)
{
......@@ -4906,6 +4912,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_VALUE);
}
if(!es2::CheckTextureFormatType(format, type))
if(!es2::CheckTextureFormatType(format, type, egl::getClientVersion()))
{
return error(GL_INVALID_ENUM);
}
......
......@@ -298,7 +298,7 @@ namespace es2
}
// 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 @@ namespace es2
default:
return false;
}
case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return false;
}
case GL_FLOAT:
case GL_HALF_FLOAT_OES:
switch(format)
......
......@@ -43,7 +43,7 @@ namespace es2
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);
......
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