Refactored entry point validation functions into their own files.
TRAC #23629
Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Geoff Lang
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 6753c3b..78f9ce5 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -23,2343 +23,9 @@
#include "libGLESv2/Context.h"
#include "libGLESv2/VertexArray.h"
-bool validImageSize(const gl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth)
-{
- if (level < 0 || width < 0 || height < 0 || depth < 0)
- {
- return false;
- }
-
- if (context->supportsNonPower2Texture())
- {
- return true;
- }
-
- if (level == 0)
- {
- return true;
- }
-
- if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
- {
- return true;
- }
-
- return false;
-}
-
-bool validCompressedImageSize(GLsizei width, GLsizei height)
-{
- if (width != 1 && width != 2 && width % 4 != 0)
- {
- return false;
- }
-
- if (height != 1 && height != 2 && height % 4 != 0)
- {
- return false;
- }
-
- return true;
-}
-
-// Verify that format/type are one of the combinations from table 3.4.
-bool checkTextureFormatType(GLenum format, GLenum type)
-{
- // validate <format> by itself (used as secondary key below)
- switch (format)
- {
- case GL_RGBA:
- case GL_BGRA_EXT:
- case GL_RGB:
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- // invalid <type> -> sets INVALID_ENUM
- // invalid <format>+<type> combination -> sets INVALID_OPERATION
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- switch (format)
- {
- case GL_RGBA:
- case GL_BGRA_EXT:
- case GL_RGB:
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- switch (format)
- {
- case GL_RGBA:
- case GL_RGB:
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- switch (format)
- {
- case GL_RGBA:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- case GL_UNSIGNED_SHORT_5_6_5:
- switch (format)
- {
- case GL_RGB:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- switch (format)
- {
- case GL_DEPTH_COMPONENT:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- case GL_UNSIGNED_INT_24_8_OES:
- switch (format)
- {
- case GL_DEPTH_STENCIL_OES:
- return true;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-}
-
-bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
- GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
- gl::Texture2D *texture)
-{
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (compressed != texture->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (format != GL_NONE)
- {
- GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
- if (internalformat != texture->getInternalFormat(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (compressed)
- {
- if ((width % 4 != 0 && width != texture->getWidth(0)) ||
- (height % 4 != 0 && height != texture->getHeight(0)))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (xoffset + width > texture->getWidth(level) ||
- yoffset + height > texture->getHeight(level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- return true;
-}
-
-bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
- GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
- gl::TextureCubeMap *texture)
-{
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (compressed != texture->isCompressed(target, level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (format != GL_NONE)
- {
- GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
- if (internalformat != texture->getInternalFormat(target, level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (compressed)
- {
- if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
- (height % 4 != 0 && height != texture->getHeight(target, 0)))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (xoffset + width > texture->getWidth(target, level) ||
- yoffset + height > texture->getHeight(target, level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- return true;
-}
-
-bool validateES2TexImageParameters(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
- GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
- GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- if (!validImageSize(context, level, width, height, 1))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (isCompressed && !validCompressedImageSize(width, height))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (level < 0 || xoffset < 0 ||
- std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (!isSubImage && !isCompressed && internalformat != GLint(format))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- gl::Texture *texture = NULL;
- bool textureCompressed = false;
- GLenum textureInternalFormat = GL_NONE;
- GLint textureLevelWidth = 0;
- GLint textureLevelHeight = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- if (width > (context->getMaximum2DTextureDimension() >> level) ||
- height > (context->getMaximum2DTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2D *tex2d = context->getTexture2D();
- if (tex2d)
- {
- textureCompressed = tex2d->isCompressed(level);
- textureInternalFormat = tex2d->getInternalFormat(level);
- textureLevelWidth = tex2d->getWidth(level);
- textureLevelHeight = tex2d->getHeight(level);
- texture = tex2d;
- }
-
- if (isSubImage && !validateSubImageParams2D(isCompressed, width, height, xoffset, yoffset,
- level, format, type, tex2d))
- {
- return false;
- }
-
- texture = tex2d;
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (!isSubImage && width != height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width > (context->getMaximumCubeTextureDimension() >> level) ||
- height > (context->getMaximumCubeTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::TextureCubeMap *texCube = context->getTextureCubeMap();
- if (texCube)
- {
- textureCompressed = texCube->isCompressed(target, level);
- textureInternalFormat = texCube->getInternalFormat(target, level);
- textureLevelWidth = texCube->getWidth(target, level);
- textureLevelHeight = texCube->getHeight(target, level);
- texture = texCube;
- }
-
- if (isSubImage && !validateSubImageParamsCube(isCompressed, width, height, xoffset, yoffset,
- target, level, format, type, texCube))
- {
- return false;
- }
- }
- break;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (!isSubImage && texture->isImmutable())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- // Verify zero border
- if (border != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- // Verify texture is not requesting more mip levels than are available.
- if (level > context->getMaximumTextureLevel())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
- if (isCompressed)
- {
- switch (actualInternalFormat)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (!context->supportsDXT1Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (!context->supportsDXT3Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (!context->supportsDXT5Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- else
- {
- // validate <type> by itself (used as secondary key below)
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- case GL_UNSIGNED_INT_24_8_OES:
- case GL_HALF_FLOAT_OES:
- case GL_FLOAT:
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- // validate <format> + <type> combinations
- // - invalid <format> -> sets INVALID_ENUM
- // - invalid <format>+<type> combination -> sets INVALID_OPERATION
- switch (format)
- {
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_RGB:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_RGBA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_BGRA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- break;
- case GL_DEPTH_COMPONENT:
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_DEPTH_STENCIL_OES:
- switch (type)
- {
- case GL_UNSIGNED_INT_24_8_OES:
- break;
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- switch (format)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (context->supportsDXT1Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (context->supportsDXT3Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (context->supportsDXT5Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- if (!context->supportsDepthTextures())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- if (target != GL_TEXTURE_2D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- // OES_depth_texture supports loading depth data and multiple levels,
- // but ANGLE_depth_texture does not
- if (pixels != NULL || level != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- default:
- break;
- }
-
- if (type == GL_FLOAT)
- {
- if (!context->supportsFloat32Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- else if (type == GL_HALF_FLOAT_OES)
- {
- if (!context->supportsFloat16Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- }
-
- return true;
-}
-
-bool validateES3TexImageParameters(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
- GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLenum format, GLenum type)
-{
- // Validate image size
- if (!validImageSize(context, level, width, height, depth))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (isCompressed && !validCompressedImageSize(width, height))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- // Verify zero border
- if (border != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- // Validate dimensions based on Context limits and validate the texture
- if (level > context->getMaximumTextureLevel())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture *texture = NULL;
- bool textureCompressed = false;
- GLenum textureInternalFormat = GL_NONE;
- GLint textureLevelWidth = 0;
- GLint textureLevelHeight = 0;
- GLint textureLevelDepth = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- if (width > (context->getMaximum2DTextureDimension() >> level) ||
- height > (context->getMaximum2DTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2D *texture2d = context->getTexture2D();
- if (texture2d)
- {
- textureCompressed = texture2d->isCompressed(level);
- textureInternalFormat = texture2d->getInternalFormat(level);
- textureLevelWidth = texture2d->getWidth(level);
- textureLevelHeight = texture2d->getHeight(level);
- textureLevelDepth = 1;
- texture = texture2d;
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (!isSubImage && width != height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width > (context->getMaximumCubeTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
- if (textureCube)
- {
- textureCompressed = textureCube->isCompressed(target, level);
- textureInternalFormat = textureCube->getInternalFormat(target, level);
- textureLevelWidth = textureCube->getWidth(target, level);
- textureLevelHeight = textureCube->getHeight(target, level);
- textureLevelDepth = 1;
- texture = textureCube;
- }
- }
- break;
-
- case GL_TEXTURE_3D:
- {
- if (width > (context->getMaximum3DTextureDimension() >> level) ||
- height > (context->getMaximum3DTextureDimension() >> level) ||
- depth > (context->getMaximum3DTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture3D *texture3d = context->getTexture3D();
- if (texture3d)
- {
- textureCompressed = texture3d->isCompressed(level);
- textureInternalFormat = texture3d->getInternalFormat(level);
- textureLevelWidth = texture3d->getWidth(level);
- textureLevelHeight = texture3d->getHeight(level);
- textureLevelDepth = texture3d->getDepth(level);
- texture = texture3d;
- }
- }
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- {
- if (width > (context->getMaximum2DTextureDimension() >> level) ||
- height > (context->getMaximum2DTextureDimension() >> level) ||
- depth > (context->getMaximum2DArrayTextureLayers() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2DArray *texture2darray = context->getTexture2DArray();
- if (texture2darray)
- {
- textureCompressed = texture2darray->isCompressed(level);
- textureInternalFormat = texture2darray->getInternalFormat(level);
- textureLevelWidth = texture2darray->getWidth(level);
- textureLevelHeight = texture2darray->getHeight(level);
- textureLevelDepth = texture2darray->getDepth(level);
- texture = texture2darray;
- }
- }
- break;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (texture->isImmutable() && !isSubImage)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- // Validate texture formats
- GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
- if (isCompressed)
- {
- if (!gl::IsFormatCompressed(actualInternalFormat, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (target == GL_TEXTURE_3D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- else
- {
- if (!gl::IsValidInternalFormat(actualInternalFormat, context) ||
- !gl::IsValidFormat(format, context->getClientVersion()) ||
- !gl::IsValidType(type, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!gl::IsValidFormatCombination(actualInternalFormat, format, type, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (target == GL_TEXTURE_3D && (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- // Validate sub image parameters
- if (isSubImage)
- {
- if (isCompressed != textureCompressed)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (format != GL_NONE)
- {
- GLenum internalformat = gl::GetSizedInternalFormat(format, type, context->getClientVersion());
- if (internalformat != textureInternalFormat)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (isCompressed)
- {
- if ((width % 4 != 0 && width != textureLevelWidth) ||
- (height % 4 != 0 && height != textureLevelHeight))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (width == 0 || height == 0 || depth == 0)
- {
- return false;
- }
-
- if (xoffset < 0 || yoffset < 0 || zoffset < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height ||
- std::numeric_limits<GLsizei>::max() - zoffset < depth)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (xoffset + width > textureLevelWidth ||
- yoffset + height > textureLevelHeight ||
- zoffset + depth > textureLevelDepth)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
-
- return true;
-}
-
-
-bool validateES2CopyTexImageParameters(gl::Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
- GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height,
- GLint border)
-{
- if (!gl::IsInternalTextureTarget(target, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width == 0 || height == 0)
- {
- return false;
- }
-
- // Verify zero border
- if (border != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- // Validate dimensions based on Context limits and validate the texture
- if (level > context->getMaximumTextureLevel())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Framebuffer *framebuffer = context->getReadFramebuffer();
-
- if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
- {
- return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
- }
-
- if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- GLenum colorbufferFormat = framebuffer->getReadColorbuffer()->getInternalFormat();
- gl::Texture *texture = NULL;
- GLenum textureFormat = GL_RGBA;
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- if (width > (context->getMaximum2DTextureDimension() >> level) ||
- height > (context->getMaximum2DTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2D *tex2d = context->getTexture2D();
- if (tex2d)
- {
- if (isSubImage && !validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
- {
- return false; // error already registered by validateSubImageParams
- }
- texture = tex2d;
- textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (!isSubImage && width != height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width > (context->getMaximumCubeTextureDimension() >> level) ||
- height > (context->getMaximumCubeTextureDimension() >> level))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::TextureCubeMap *texcube = context->getTextureCubeMap();
- if (texcube)
- {
- if (isSubImage && !validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
- {
- return false; // error already registered by validateSubImageParams
- }
- texture = texcube;
- textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
- }
- }
- break;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (texture->isImmutable() && !isSubImage)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
-
- // [OpenGL ES 2.0.24] table 3.9
- if (isSubImage)
- {
- switch (textureFormat)
- {
- case GL_ALPHA:
- if (colorbufferFormat != GL_ALPHA8_EXT &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE:
- case GL_RGB:
- if (colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if (colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- return gl::error(GL_INVALID_OPERATION, false);
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- return gl::error(GL_INVALID_OPERATION, false);
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- else
- {
- switch (internalformat)
- {
- case GL_ALPHA:
- if (colorbufferFormat != GL_ALPHA8_EXT &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE:
- case GL_RGB:
- if (colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if (colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA8_OES)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (context->supportsDXT1Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (context->supportsDXT3Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (context->supportsDXT5Textures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32_OES:
- case GL_DEPTH_STENCIL_OES:
- case GL_DEPTH24_STENCIL8_OES:
- if (context->supportsDepthTextures())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- else
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
-
- return true;
-}
-
-bool validateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLint level, GLenum internalformat,
- bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
- GLsizei width, GLsizei height, GLint border)
-{
- if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width == 0 || height == 0)
- {
- return false;
- }
-
- if (border != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (level > context->getMaximumTextureLevel())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Framebuffer *framebuffer = context->getReadFramebuffer();
-
- if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
- {
- return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
- }
-
- if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
- GLenum colorbufferInternalFormat = source->getInternalFormat();
- gl::Texture *texture = NULL;
- GLenum textureInternalFormat = GL_NONE;
- bool textureCompressed = false;
- bool textureIsDepth = false;
- GLint textureLevelWidth = 0;
- GLint textureLevelHeight = 0;
- GLint textureLevelDepth = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- gl::Texture2D *texture2d = context->getTexture2D();
- if (texture2d)
- {
- textureInternalFormat = texture2d->getInternalFormat(level);
- textureCompressed = texture2d->isCompressed(level);
- textureIsDepth = texture2d->isDepth(level);
- textureLevelWidth = texture2d->getWidth(level);
- textureLevelHeight = texture2d->getHeight(level);
- textureLevelDepth = 1;
- texture = texture2d;
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
- if (textureCube)
- {
- textureInternalFormat = textureCube->getInternalFormat(target, level);
- textureCompressed = textureCube->isCompressed(target, level);
- textureIsDepth = false;
- textureLevelWidth = textureCube->getWidth(target, level);
- textureLevelHeight = textureCube->getHeight(target, level);
- textureLevelDepth = 1;
- texture = textureCube;
- }
- }
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- {
- gl::Texture2DArray *texture2dArray = context->getTexture2DArray();
- if (texture2dArray)
- {
- textureInternalFormat = texture2dArray->getInternalFormat(level);
- textureCompressed = texture2dArray->isCompressed(level);
- textureIsDepth = texture2dArray->isDepth(level);
- textureLevelWidth = texture2dArray->getWidth(level);
- textureLevelHeight = texture2dArray->getHeight(level);
- textureLevelDepth = texture2dArray->getDepth(level);
- texture = texture2dArray;
- }
- }
- break;
-
- case GL_TEXTURE_3D:
- {
- gl::Texture3D *texture3d = context->getTexture3D();
- if (texture3d)
- {
- textureInternalFormat = texture3d->getInternalFormat(level);
- textureCompressed = texture3d->isCompressed(level);
- textureIsDepth = texture3d->isDepth(level);
- textureLevelWidth = texture3d->getWidth(level);
- textureLevelHeight = texture3d->getHeight(level);
- textureLevelDepth = texture3d->getDepth(level);
- texture = texture3d;
- }
- }
- break;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!texture)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (texture->isImmutable() && !isSubImage)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (textureIsDepth)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (textureCompressed)
- {
- if ((width % 4 != 0 && width != textureLevelWidth) ||
- (height % 4 != 0 && height != textureLevelHeight))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- if (isSubImage)
- {
- if (xoffset + width > textureLevelWidth ||
- yoffset + height > textureLevelHeight ||
- zoffset >= textureLevelDepth)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (!gl::IsValidCopyTexImageCombination(textureInternalFormat, colorbufferInternalFormat,
- context->getClientVersion()))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- return true;
-}
-
-bool validateES2TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat,
- GLsizei width, GLsizei height)
-{
- if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (width < 1 || height < 1 || levels < 1)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (target == GL_TEXTURE_CUBE_MAP && width != height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
- GLenum type = gl::GetType(internalformat, context->getClientVersion());
-
- if (format == GL_NONE || type == GL_NONE)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- if (width > context->getMaximum2DTextureDimension() ||
- height > context->getMaximum2DTextureDimension())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- break;
- case GL_TEXTURE_CUBE_MAP:
- if (width > context->getMaximumCubeTextureDimension() ||
- height > context->getMaximumCubeTextureDimension())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (levels != 1 && !context->supportsNonPower2Texture())
- {
- if (!gl::isPow2(width) || !gl::isPow2(height))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
-
- switch (internalformat)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (!context->supportsDXT1Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (!context->supportsDXT3Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (!context->supportsDXT5Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_RGBA32F_EXT:
- case GL_RGB32F_EXT:
- case GL_ALPHA32F_EXT:
- case GL_LUMINANCE32F_EXT:
- case GL_LUMINANCE_ALPHA32F_EXT:
- if (!context->supportsFloat32Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_RGBA16F_EXT:
- case GL_RGB16F_EXT:
- case GL_ALPHA16F_EXT:
- case GL_LUMINANCE16F_EXT:
- case GL_LUMINANCE_ALPHA16F_EXT:
- if (!context->supportsFloat16Textures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32_OES:
- case GL_DEPTH24_STENCIL8_OES:
- if (!context->supportsDepthTextures())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- if (target != GL_TEXTURE_2D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- // ANGLE_depth_texture only supports 1-level textures
- if (levels != 1)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- default:
- break;
- }
-
- gl::Texture *texture = NULL;
- switch(target)
- {
- case GL_TEXTURE_2D:
- texture = context->getTexture2D();
- break;
- case GL_TEXTURE_CUBE_MAP:
- texture = context->getTextureCubeMap();
- break;
- default:
- UNREACHABLE();
- }
-
- if (!texture || texture->id() == 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (texture->isImmutable())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- return true;
-}
-
-bool validateES3TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat,
- GLsizei width, GLsizei height, GLsizei depth)
-{
- if (width < 1 || height < 1 || depth < 1 || levels < 1)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (levels > gl::log2(std::max(std::max(width, height), depth)) + 1)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- gl::Texture *texture = NULL;
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- texture = context->getTexture2D();
-
- if (width > (context->getMaximum2DTextureDimension()) ||
- height > (context->getMaximum2DTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- texture = context->getTextureCubeMap();
-
- if (width != height)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (width > (context->getMaximumCubeTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- break;
-
- case GL_TEXTURE_3D:
- {
- texture = context->getTexture3D();
-
- if (width > (context->getMaximum3DTextureDimension()) ||
- height > (context->getMaximum3DTextureDimension()) ||
- depth > (context->getMaximum3DTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- {
- texture = context->getTexture2DArray();
-
- if (width > (context->getMaximum2DTextureDimension()) ||
- height > (context->getMaximum2DTextureDimension()) ||
- depth > (context->getMaximum2DArrayTextureLayers()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- break;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!texture || texture->id() == 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (texture->isImmutable())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (!gl::IsValidInternalFormat(internalformat, context))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!gl::IsSizedInternalFormat(internalformat, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- return true;
-}
-
-bool validateRenderbufferStorageParameters(const gl::Context *context, GLenum target, GLsizei samples,
- GLenum internalformat, GLsizei width, GLsizei height,
- bool angleExtension)
-{
- switch (target)
- {
- case GL_RENDERBUFFER:
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (width < 0 || height < 0 || samples < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (!gl::IsValidInternalFormat(internalformat, context))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- // ANGLE_framebuffer_multisample does not explicitly state that the internal format must be
- // sized but it does state that the format must be in the ES2.0 spec table 4.5 which contains
- // only sized internal formats. The ES3 spec (section 4.4.2) does, however, state that the
- // internal format must be sized and not an integer format if samples is greater than zero.
- if (!gl::IsSizedInternalFormat(internalformat, context->getClientVersion()))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (gl::IsIntegerFormat(internalformat, context->getClientVersion()) && samples > 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (!gl::IsColorRenderingSupported(internalformat, context) &&
- !gl::IsDepthRenderingSupported(internalformat, context) &&
- !gl::IsStencilRenderingSupported(internalformat, context))
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (std::max(width, height) > context->getMaximumRenderbufferDimension())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
- // to MAX_SAMPLES_ANGLE (Context::getMaxSupportedSamples) while the ES3.0 spec (section 4.4.2)
- // states that samples must be less than or equal to the maximum samples for the specified
- // internal format.
- if (angleExtension)
- {
- if (samples > context->getMaxSupportedSamples())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- else
- {
- if (samples > context->getMaxSupportedFormatSamples(internalformat))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
-
- GLuint handle = context->getRenderbufferHandle();
- if (handle == 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- return true;
-}
-
-bool validateES2FramebufferTextureParameters(gl::Context *context, GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture, GLint level)
-{
- META_ASSERT(GL_DRAW_FRAMEBUFFER == GL_DRAW_FRAMEBUFFER_ANGLE && GL_READ_FRAMEBUFFER == GL_READ_FRAMEBUFFER_ANGLE);
-
- if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (attachment >= GL_COLOR_ATTACHMENT0 && attachment <= GL_COLOR_ATTACHMENT15)
- {
- const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0);
- if (colorAttachment >= context->getMaximumRenderTargets())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- else
- {
- switch (attachment)
- {
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
-
- if (texture != 0)
- {
- gl::Texture *tex = context->getTexture(texture);
-
- if (tex == NULL)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- switch (textarget)
- {
- case GL_TEXTURE_2D:
- {
- if (tex->getTarget() != GL_TEXTURE_2D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
- if (tex2d->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
- if (texcube->isCompressed(textarget, level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (level != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
-
- gl::Framebuffer *framebuffer = NULL;
- GLuint framebufferHandle = 0;
- if (target == GL_READ_FRAMEBUFFER)
- {
- framebuffer = context->getReadFramebuffer();
- framebufferHandle = context->getReadFramebufferHandle();
- }
- else
- {
- framebuffer = context->getDrawFramebuffer();
- framebufferHandle = context->getDrawFramebufferHandle();
- }
-
- if (framebufferHandle == 0 || !framebuffer)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- return true;
-}
-
-bool validateES3FramebufferTextureParameters(gl::Context *context, GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture, GLint level, GLint layer,
- bool layerCall)
-{
- if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (attachment >= GL_COLOR_ATTACHMENT0 && attachment <= GL_COLOR_ATTACHMENT15)
- {
- const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0);
- if (colorAttachment >= context->getMaximumRenderTargets())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- }
- else
- {
- switch (attachment)
- {
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
-
- if (texture != 0)
- {
- gl::Texture *tex = context->getTexture(texture);
-
- if (tex == NULL)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (level < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (layer < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (!layerCall)
- {
- switch (textarget)
- {
- case GL_TEXTURE_2D:
- {
- if (level > gl::log2(context->getMaximum2DTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- if (tex->getTarget() != GL_TEXTURE_2D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
- if (tex2d->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (level > gl::log2(context->getMaximumCubeTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
- if (texcube->isCompressed(textarget, level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- else
- {
- switch (tex->getTarget())
- {
- case GL_TEXTURE_2D_ARRAY:
- {
- if (level > gl::log2(context->getMaximum2DTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (layer >= context->getMaximum2DArrayTextureLayers())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2DArray *texArray = static_cast<gl::Texture2DArray *>(tex);
- if (texArray->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- break;
- }
-
- case GL_TEXTURE_3D:
- {
- if (level > gl::log2(context->getMaximum3DTextureDimension()))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (layer >= context->getMaximum3DTextureDimension())
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture3D *tex3d = static_cast<gl::Texture3D *>(tex);
- if (tex3d->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- break;
- }
-
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
-
- gl::Framebuffer *framebuffer = NULL;
- GLuint framebufferHandle = 0;
- if (target == GL_READ_FRAMEBUFFER)
- {
- framebuffer = context->getReadFramebuffer();
- framebufferHandle = context->getReadFramebufferHandle();
- }
- else
- {
- framebuffer = context->getDrawFramebuffer();
- framebufferHandle = context->getDrawFramebufferHandle();
- }
-
- if (framebufferHandle == 0 || !framebuffer)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- return true;
-}
-
-// check for combinations of format and type that are valid for ReadPixels
-bool validES2ReadFormatType(GLenum format, GLenum type)
-{
- switch (format)
- {
- case GL_RGBA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- default:
- return false;
- }
- break;
- case GL_BGRA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- break;
- default:
- return false;
- }
- break;
- default:
- return false;
- }
- return true;
-}
-
-bool validES3ReadFormatType(GLenum internalFormat, GLenum format, GLenum type)
-{
- switch (format)
- {
- case GL_RGBA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- if (internalFormat != GL_RGB10_A2)
- {
- return false;
- }
- break;
- default:
- return false;
- }
- break;
- case GL_RGBA_INTEGER:
- switch (type)
- {
- case GL_INT:
- if (!gl::IsSignedIntegerFormat(internalFormat, 3))
- {
- return false;
- }
- break;
- case GL_UNSIGNED_INT:
- if (!gl::IsUnsignedIntegerFormat(internalFormat, 3))
- {
- return false;
- }
- break;
- default:
- return false;
- }
- break;
- case GL_BGRA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- break;
- default:
- return false;
- }
- break;
- default:
- return false;
- }
- return true;
-}
-
-bool validateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
- const GLenum* attachments)
-{
- bool defaultFramebuffer = false;
-
- switch (target)
- {
- case GL_DRAW_FRAMEBUFFER:
- case GL_FRAMEBUFFER:
- defaultFramebuffer = context->getDrawFramebufferHandle() == 0;
- break;
- case GL_READ_FRAMEBUFFER:
- defaultFramebuffer = context->getReadFramebufferHandle() == 0;
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- for (int i = 0; i < numAttachments; ++i)
- {
- if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
- {
- if (defaultFramebuffer)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getMaximumRenderTargets())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- else
- {
- switch (attachments[i])
- {
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (defaultFramebuffer)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- case GL_COLOR:
- case GL_DEPTH:
- case GL_STENCIL:
- if (!defaultFramebuffer)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- }
-
- return true;
-}
-
-bool validateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
- GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,
- GLenum filter, bool fromAngleExtension)
-{
- switch (filter)
- {
- case GL_NEAREST:
- break;
- case GL_LINEAR:
- if (fromAngleExtension)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (mask == 0)
- {
- // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
- // buffers are copied.
- return false;
- }
-
- if (fromAngleExtension && (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0))
- {
- ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation.");
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- // ES3.0 spec, section 4.3.2 states that linear filtering is only available for the
- // color buffer, leaving only nearest being unfiltered from above
- if ((mask & ~GL_COLOR_BUFFER_BIT) != 0 && filter != GL_NEAREST)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
- {
- if (fromAngleExtension)
- {
- ERR("Blits with the same source and destination framebuffer are not supported by this "
- "implementation.");
- }
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- gl::Framebuffer *readFramebuffer = context->getReadFramebuffer();
- gl::Framebuffer *drawFramebuffer = context->getDrawFramebuffer();
- if (!readFramebuffer || readFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE ||
- !drawFramebuffer || drawFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
- {
- return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
- }
-
- if (drawFramebuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- gl::Rectangle sourceClippedRect, destClippedRect;
- bool partialCopy;
- if (!context->clipBlitFramebufferCoordinates(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
- &sourceClippedRect, &destClippedRect, &partialCopy))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- bool sameBounds = srcX0 == dstX0 && srcY0 == dstY0 && srcX1 == dstX1 && srcY1 == dstY1;
-
- GLuint clientVersion = context->getClientVersion();
-
- if (mask & GL_COLOR_BUFFER_BIT)
- {
- gl::Renderbuffer *readColorBuffer = readFramebuffer->getReadColorbuffer();
- gl::Renderbuffer *drawColorBuffer = drawFramebuffer->getFirstColorbuffer();
-
- if (readColorBuffer && drawColorBuffer)
- {
- GLint readInternalFormat = readColorBuffer->getActualFormat();
- GLint drawInternalFormat = drawColorBuffer->getActualFormat();
-
- for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; i++)
- {
- if (drawFramebuffer->isEnabledColorAttachment(i))
- {
- GLint drawbufferAttachmentFormat = drawFramebuffer->getColorbuffer(i)->getActualFormat();
-
- if (gl::IsNormalizedFixedPointFormat(readInternalFormat, clientVersion) &&
- !gl::IsNormalizedFixedPointFormat(drawbufferAttachmentFormat, clientVersion))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (gl::IsUnsignedIntegerFormat(readInternalFormat, clientVersion) &&
- !gl::IsUnsignedIntegerFormat(drawbufferAttachmentFormat, clientVersion))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (gl::IsSignedIntegerFormat(readInternalFormat, clientVersion) &&
- !gl::IsSignedIntegerFormat(drawbufferAttachmentFormat, clientVersion))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (readColorBuffer->getSamples() > 0 && (readInternalFormat != drawbufferAttachmentFormat || !sameBounds))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
-
- if (gl::IsIntegerFormat(readInternalFormat, clientVersion) && filter == GL_LINEAR)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (fromAngleExtension)
- {
- const GLenum readColorbufferType = readFramebuffer->getReadColorbufferType();
- if (readColorbufferType != GL_TEXTURE_2D && readColorbufferType != GL_RENDERBUFFER)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
- {
- if (drawFramebuffer->isEnabledColorAttachment(colorAttachment))
- {
- if (drawFramebuffer->getColorbufferType(colorAttachment) != GL_TEXTURE_2D &&
- drawFramebuffer->getColorbufferType(colorAttachment) != GL_RENDERBUFFER)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (drawFramebuffer->getColorbuffer(colorAttachment)->getActualFormat() != readColorBuffer->getActualFormat())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
-
- if (partialCopy && readFramebuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
- }
-
- if (mask & GL_DEPTH_BUFFER_BIT)
- {
- gl::Renderbuffer *readDepthBuffer = readFramebuffer->getDepthbuffer();
- gl::Renderbuffer *drawDepthBuffer = drawFramebuffer->getDepthbuffer();
-
- if (readDepthBuffer && drawDepthBuffer)
- {
- if (readDepthBuffer->getActualFormat() != drawDepthBuffer->getActualFormat())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (readDepthBuffer->getSamples() > 0 && !sameBounds)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (fromAngleExtension)
- {
- if (partialCopy)
- {
- ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
- return gl::error(GL_INVALID_OPERATION, false); // only whole-buffer copies are permitted
- }
-
- if (readDepthBuffer->getSamples() != 0 || drawDepthBuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
- }
-
- if (mask & GL_STENCIL_BUFFER_BIT)
- {
- gl::Renderbuffer *readStencilBuffer = readFramebuffer->getStencilbuffer();
- gl::Renderbuffer *drawStencilBuffer = drawFramebuffer->getStencilbuffer();
-
- if (fromAngleExtension && partialCopy)
- {
- ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
- return gl::error(GL_INVALID_OPERATION, false); // only whole-buffer copies are permitted
- }
-
- if (readStencilBuffer && drawStencilBuffer)
- {
- if (readStencilBuffer->getActualFormat() != drawStencilBuffer->getActualFormat())
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (readStencilBuffer->getSamples() > 0 && !sameBounds)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (fromAngleExtension)
- {
- if (partialCopy)
- {
- ERR("Only whole-buffer depth and stencil blits are supported by this implementation.");
- return gl::error(GL_INVALID_OPERATION, false); // only whole-buffer copies are permitted
- }
-
- if (readStencilBuffer->getSamples() != 0 || drawStencilBuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
- }
-
- return true;
-}
-
-bool validateGetVertexAttribParameters(GLenum pname, int clientVersion)
-{
- switch (pname)
- {
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- case GL_CURRENT_VERTEX_ATTRIB:
- return true;
-
- case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
- // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
- // the same constant.
- META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
- return true;
-
- case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
- return ((clientVersion >= 3) ? true : gl::error(GL_INVALID_ENUM, false));
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-}
-
-bool validateTexParamParameters(gl::Context *context, GLenum pname, GLint param)
-{
- switch (pname)
- {
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_SWIZZLE_R:
- case GL_TEXTURE_SWIZZLE_G:
- case GL_TEXTURE_SWIZZLE_B:
- case GL_TEXTURE_SWIZZLE_A:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- if (context->getClientVersion() < 3)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- default: break;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- switch (param)
- {
- case GL_REPEAT:
- case GL_CLAMP_TO_EDGE:
- case GL_MIRRORED_REPEAT:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- case GL_TEXTURE_MIN_FILTER:
- switch (param)
- {
- case GL_NEAREST:
- case GL_LINEAR:
- case GL_NEAREST_MIPMAP_NEAREST:
- case GL_LINEAR_MIPMAP_NEAREST:
- case GL_NEAREST_MIPMAP_LINEAR:
- case GL_LINEAR_MIPMAP_LINEAR:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- case GL_TEXTURE_MAG_FILTER:
- switch (param)
- {
- case GL_NEAREST:
- case GL_LINEAR:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- case GL_TEXTURE_USAGE_ANGLE:
- switch (param)
- {
- case GL_NONE:
- case GL_FRAMEBUFFER_ATTACHMENT_ANGLE:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- if (!context->supportsTextureFilterAnisotropy())
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- // we assume the parameter passed to this validation method is truncated, not rounded
- if (param < 1)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- return true;
-
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- // any value is permissible
- return true;
-
- case GL_TEXTURE_COMPARE_MODE:
- switch (param)
- {
- case GL_NONE:
- case GL_COMPARE_REF_TO_TEXTURE:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- case GL_TEXTURE_COMPARE_FUNC:
- switch (param)
- {
- case GL_LEQUAL:
- case GL_GEQUAL:
- case GL_LESS:
- case GL_GREATER:
- case GL_EQUAL:
- case GL_NOTEQUAL:
- case GL_ALWAYS:
- case GL_NEVER:
- return true;
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- break;
-
- case GL_TEXTURE_SWIZZLE_R:
- case GL_TEXTURE_SWIZZLE_G:
- case GL_TEXTURE_SWIZZLE_B:
- case GL_TEXTURE_SWIZZLE_A:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- UNIMPLEMENTED();
- return true;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-}
+#include "libGLESv2/validationES.h"
+#include "libGLESv2/validationES2.h"
+#include "libGLESv2/validationES3.h"
gl::Texture *getTargetTexture(gl::Context *context, GLenum target)
@@ -2382,25 +48,6 @@
}
}
-bool validateSamplerObjectParameter(GLenum pname)
-{
- switch (pname)
- {
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- return true;
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
-}
extern "C"
{
@@ -6326,7 +3973,7 @@
const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
- if (!validateGetVertexAttribParameters(pname, context->getClientVersion()))
+ if (!gl::validateGetVertexAttribParameters(pname, context->getClientVersion()))
{
return;
}
@@ -6368,7 +4015,7 @@
const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
- if (!validateGetVertexAttribParameters(pname, context->getClientVersion()))
+ if (!gl::validateGetVertexAttribParameters(pname, context->getClientVersion()))
{
return;
}
@@ -6871,8 +4518,8 @@
if (!context->getCurrentReadFormatType(¤tInternalFormat, ¤tFormat, ¤tType))
return;
- bool validReadFormat = (context->getClientVersion() < 3) ? validES2ReadFormatType(format, type) :
- validES3ReadFormatType(currentInternalFormat, format, type);
+ bool validReadFormat = (context->getClientVersion() < 3) ? gl::validES2ReadFormatType(format, type) :
+ gl::validES3ReadFormatType(currentInternalFormat, format, type);
if (!(currentFormat == format && currentType == type) && !validReadFormat)
{
@@ -6915,8 +4562,8 @@
if (!context->getCurrentReadFormatType(¤tInternalFormat, ¤tFormat, ¤tType))
return;
- bool validReadFormat = (context->getClientVersion() < 3) ? validES2ReadFormatType(format, type) :
- validES3ReadFormatType(currentInternalFormat, format, type);
+ bool validReadFormat = (context->getClientVersion() < 3) ? gl::validES2ReadFormatType(format, type) :
+ gl::validES3ReadFormatType(currentInternalFormat, format, type);
if (!(currentFormat == format && currentType == type) && !validReadFormat)
{
@@ -10075,7 +7722,7 @@
const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
- if (!validateGetVertexAttribParameters(pname, context->getClientVersion()))
+ if (!gl::validateGetVertexAttribParameters(pname, context->getClientVersion()))
{
return;
}
@@ -10123,7 +7770,7 @@
const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
- if (!validateGetVertexAttribParameters(pname, context->getClientVersion()))
+ if (!gl::validateGetVertexAttribParameters(pname, context->getClientVersion()))
{
return;
}
@@ -11661,12 +9308,12 @@
return gl::error(GL_INVALID_OPERATION);
}
- if (!validateSamplerObjectParameter(pname))
+ if (!gl::validateSamplerObjectParameter(pname))
{
return;
}
- if (!validateTexParamParameters(context, pname, param))
+ if (!gl::validateTexParamParameters(context, pname, param))
{
return;
}
@@ -11705,12 +9352,12 @@
return gl::error(GL_INVALID_OPERATION);
}
- if (!validateSamplerObjectParameter(pname))
+ if (!gl::validateSamplerObjectParameter(pname))
{
return;
}
- if (!validateTexParamParameters(context, pname, static_cast<GLint>(param)))
+ if (!gl::validateTexParamParameters(context, pname, static_cast<GLint>(param)))
{
return;
}
@@ -11749,7 +9396,7 @@
return gl::error(GL_INVALID_OPERATION);
}
- if (!validateSamplerObjectParameter(pname))
+ if (!gl::validateSamplerObjectParameter(pname))
{
return;
}
@@ -11783,7 +9430,7 @@
return gl::error(GL_INVALID_OPERATION);
}
- if (!validateSamplerObjectParameter(pname))
+ if (!gl::validateSamplerObjectParameter(pname))
{
return;
}