Commit d2ec29e4 by Nicolas Capens Committed by Nicolas Capens

Refactor the copy validation matrix.

We were enumerating the color buffer formats by sized internal format, which is simplified and made less fragile by retrieving the base internal format and implementing the spec's validation tables more directly. Change-Id: I46d244b9ed738e927b0cb5fe6d1deebf6f0cbae5 Reviewed-on: https://swiftshader-review.googlesource.com/16988Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 92cd7ac9
...@@ -612,52 +612,48 @@ namespace es2 ...@@ -612,52 +612,48 @@ namespace es2
bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat) bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat)
{ {
if(IsCompressed(textureFormat, egl::getClientVersion())) GLenum baseTexureFormat = GetBaseInternalFormat(textureFormat);
{ GLenum baseColorbufferFormat = GetBaseInternalFormat(colorbufferFormat);
return error(GL_INVALID_OPERATION, false);
}
GLenum baseFormat = GetBaseInternalFormat(textureFormat);
// [OpenGL ES 2.0.24] table 3.9 // [OpenGL ES 2.0.24] table 3.9
// [OpenGL ES 3.0.5] table 3.16 // [OpenGL ES 3.0.5] table 3.16
switch(baseFormat) switch(baseTexureFormat)
{ {
case GL_ALPHA: case GL_ALPHA:
if(colorbufferFormat != GL_RGBA4 && if(baseColorbufferFormat != GL_ALPHA &&
colorbufferFormat != GL_RGB5_A1 && baseColorbufferFormat != GL_RGBA)
colorbufferFormat != GL_RGBA8 && {
colorbufferFormat != GL_BGRA8_EXT && return error(GL_INVALID_OPERATION, false);
colorbufferFormat != GL_RGBA16F_EXT && }
colorbufferFormat != GL_RGBA32F_EXT) break;
case GL_LUMINANCE_ALPHA:
case GL_RGBA:
if(baseColorbufferFormat != GL_RGBA)
{ {
return error(GL_INVALID_OPERATION, false); return error(GL_INVALID_OPERATION, false);
} }
break; break;
case GL_LUMINANCE: case GL_LUMINANCE:
case GL_RGB: case GL_RED:
if(colorbufferFormat != GL_RGB565 && if(baseColorbufferFormat != GL_RED &&
colorbufferFormat != GL_RGB8 && baseColorbufferFormat != GL_RG &&
colorbufferFormat != GL_RGBA4 && baseColorbufferFormat != GL_RGB &&
colorbufferFormat != GL_RGB5_A1 && baseColorbufferFormat != GL_RGBA)
colorbufferFormat != GL_RGBA8 &&
colorbufferFormat != GL_RGB16F_EXT &&
colorbufferFormat != GL_RGB32F_EXT &&
colorbufferFormat != GL_BGRA8_EXT &&
colorbufferFormat != GL_RGBA16F_EXT &&
colorbufferFormat != GL_RGBA32F_EXT)
{ {
return error(GL_INVALID_OPERATION, false); return error(GL_INVALID_OPERATION, false);
} }
break; break;
case GL_LUMINANCE_ALPHA: case GL_RG:
case GL_RGBA: if(baseColorbufferFormat != GL_RG &&
if(colorbufferFormat != GL_RGBA4 && baseColorbufferFormat != GL_RGB &&
colorbufferFormat != GL_RGB5_A1 && baseColorbufferFormat != GL_RGBA)
colorbufferFormat != GL_RGBA8 && {
colorbufferFormat != GL_BGRA8_EXT && return error(GL_INVALID_OPERATION, false);
colorbufferFormat != GL_RGBA16F_EXT && }
colorbufferFormat != GL_RGBA32F_EXT) break;
case GL_RGB:
if(baseColorbufferFormat != GL_RGB &&
baseColorbufferFormat != GL_RGBA)
{ {
return error(GL_INVALID_OPERATION, false); return error(GL_INVALID_OPERATION, false);
} }
...@@ -1278,6 +1274,16 @@ namespace es2 ...@@ -1278,6 +1274,16 @@ namespace es2
{ {
switch(internalformat) switch(internalformat)
{ {
// Unsized internal formats which are valid as the <internalformat> parameter of CopyTexImage.
case GL_RGB:
case GL_RGBA:
case GL_ALPHA:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
case GL_RED_EXT: // GL_EXT_texture_rg
case GL_RG_EXT: // GL_EXT_texture_rg
return internalformat;
// [OpenGL ES 3.0 Table 3.13] // [OpenGL ES 3.0 Table 3.13]
case GL_R8: return GL_RED; case GL_R8: return GL_RED;
case GL_R8_SNORM: return GL_RED; case GL_R8_SNORM: return GL_RED;
......
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