blob: 953b3c565cdad75f3162440c6626703339f408b7 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "gles/gles_validate.h"
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <GLES2/gl2.h>
#include "gles/state.h"
bool IsValidAlphaFunc(GLenum func) {
switch (func) {
case GL_NEVER:
case GL_LESS:
case GL_EQUAL:
case GL_LEQUAL:
case GL_GREATER:
case GL_NOTEQUAL:
case GL_GEQUAL:
case GL_ALWAYS:
return true;
default:
return false;
}
}
bool IsValidBlendFunc(GLenum factor) {
switch (factor) {
case GL_ZERO:
case GL_ONE:
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
case GL_SRC_ALPHA_SATURATE:
return true;
default:
return false;
}
}
bool IsValidBufferTarget(GLenum target) {
return target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER;
}
bool IsValidBufferUsage(GLenum usage) {
return usage == GL_STATIC_DRAW || usage == GL_DYNAMIC_DRAW ||
usage == GL_STREAM_DRAW;
}
bool IsValidClientState(GLenum state) {
switch (state) {
case GL_COLOR_ARRAY:
case GL_NORMAL_ARRAY:
case GL_TEXTURE_COORD_ARRAY:
case GL_VERTEX_ARRAY:
case GL_POINT_SIZE_ARRAY_OES:
case GL_WEIGHT_ARRAY_OES:
case GL_MATRIX_INDEX_ARRAY_OES:
return true;
default:
return false;
}
}
bool IsValidColorPointerSize(GLint size) {
return ((size >= 3) && (size <= 4));
}
bool IsValidColorPointerType(GLenum type) {
switch (type) {
case GL_UNSIGNED_BYTE:
case GL_FIXED:
case GL_FLOAT:
return true;
}
return false;
}
bool IsValidCullFaceMode(GLenum mode) {
switch (mode) {
case GL_FRONT:
case GL_BACK:
case GL_FRONT_AND_BACK:
return true;
default:
return false;
}
}
bool IsValidDepthFunc(GLenum func) {
switch (func) {
case GL_NEVER:
case GL_LESS:
case GL_EQUAL:
case GL_LEQUAL:
case GL_GREATER:
case GL_NOTEQUAL:
case GL_GEQUAL:
case GL_ALWAYS:
return true;
default:
return false;
}
}
bool IsValidDrawMode(GLenum mode) {
switch (mode) {
case GL_POINTS:
case GL_LINE_STRIP:
case GL_LINE_LOOP:
case GL_LINES:
case GL_TRIANGLE_STRIP:
case GL_TRIANGLE_FAN:
case GL_TRIANGLES:
return true;
}
return false;
}
bool IsValidDrawType(GLenum mode) {
switch (mode) {
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
return true;
}
return false;
}
bool IsValidEmulatedCompressedTextureFormats(GLenum type) {
// Note: This should be kept in sync with kEmulatedCompressedTextureFormats
// in gles_context.cpp.
switch (type) {
case GL_PALETTE4_R5_G6_B5_OES:
case GL_PALETTE4_RGB5_A1_OES:
case GL_PALETTE4_RGB8_OES:
case GL_PALETTE4_RGBA4_OES:
case GL_PALETTE4_RGBA8_OES:
case GL_PALETTE8_R5_G6_B5_OES:
case GL_PALETTE8_RGB5_A1_OES:
case GL_PALETTE8_RGB8_OES:
case GL_PALETTE8_RGBA4_OES:
case GL_PALETTE8_RGBA8_OES:
case GL_ETC1_RGB8_OES:
return true;
default:
return false;
}
}
bool IsValidFramebufferAttachment(GLenum attachment) {
switch (attachment) {
case GL_COLOR_ATTACHMENT0:
case GL_DEPTH_ATTACHMENT:
case GL_STENCIL_ATTACHMENT:
return true;
}
return false;
}
bool IsValidFramebufferAttachmentParams(GLenum pname) {
switch (pname) {
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
return true;
}
return false;
}
bool IsValidFramebufferTarget(GLenum target) {
return target == GL_FRAMEBUFFER;
}
bool IsValidFrontFaceMode(GLenum mode) {
switch (mode) {
case GL_CW:
case GL_CCW:
return true;
default:
return false;
}
}
bool IsValidMatrixIndexPointerSize(GLint size) {
return ((size >= 1) && (size <= UniformContext::kMaxVertexUnitsOES));
}
bool IsValidMatrixIndexPointerType(GLenum type) {
return type == GL_UNSIGNED_BYTE;
}
bool IsValidMipmapHintMode(GLenum mode) {
switch (mode) {
case GL_FASTEST:
case GL_NICEST:
case GL_DONT_CARE:
return true;
default:
return false;
}
}
bool IsValidNormalPointerType(GLenum type) {
switch (type) {
case GL_BYTE:
case GL_SHORT:
case GL_FLOAT:
case GL_FIXED:
return true;
}
return false;
}
bool IsValidPixelFormat(GLenum format) {
switch (format) {
case GL_ALPHA:
case GL_DEPTH_COMPONENT:
case GL_RGB:
case GL_RGBA:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
return true;
}
return false;
}
bool IsValidPixelFormatAndType(GLenum format, GLenum type) {
switch (format) {
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:
return true;
}
break;
case GL_RGB:
switch (type) {
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
return true;
}
break;
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
case GL_ALPHA:
switch (type) {
case GL_UNSIGNED_BYTE:
return true;
}
break;
}
return false;
}
bool IsValidPixelStoreAlignment(GLint value) {
switch (value) {
case 1:
case 2:
case 4:
case 8:
return true;
default:
return false;
}
}
bool IsValidPixelStoreName(GLenum name) {
switch (name) {
case GL_PACK_ALIGNMENT:
case GL_UNPACK_ALIGNMENT:
return true;
default:
return false;
}
}
bool IsValidPixelType(GLenum type) {
switch (type) {
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_INT:
case GL_UNSIGNED_SHORT:
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_FLOAT:
return true;
}
return false;
}
bool IsValidPointPointerType(GLenum type) {
return type == GL_FIXED || type == GL_FLOAT;
}
bool IsValidPrecisionType(GLenum type) {
switch (type) {
case GL_LOW_FLOAT:
case GL_MEDIUM_FLOAT:
case GL_HIGH_FLOAT:
case GL_LOW_INT:
case GL_MEDIUM_INT:
case GL_HIGH_INT:
return true;
}
return false;
}
bool IsValidRenderbufferFormat(GLenum internalformat) {
switch (internalformat) {
case GL_DEPTH24_STENCIL8_OES:
case GL_DEPTH_COMPONENT16_OES:
case GL_DEPTH_COMPONENT24_OES:
case GL_DEPTH_COMPONENT32_OES:
case GL_RGB565_OES:
case GL_RGB5_A1_OES:
case GL_RGB8_OES:
case GL_RGBA4_OES:
case GL_RGBA8_OES:
case GL_STENCIL_INDEX1_OES:
case GL_STENCIL_INDEX4_OES:
case GL_STENCIL_INDEX8_OES:
return true;
}
return false;
}
bool IsValidRenderbufferParams(GLenum pname) {
switch (pname) {
case GL_RENDERBUFFER_WIDTH:
case GL_RENDERBUFFER_HEIGHT:
case GL_RENDERBUFFER_INTERNAL_FORMAT:
case GL_RENDERBUFFER_RED_SIZE:
case GL_RENDERBUFFER_GREEN_SIZE:
case GL_RENDERBUFFER_BLUE_SIZE:
case GL_RENDERBUFFER_ALPHA_SIZE:
case GL_RENDERBUFFER_DEPTH_SIZE:
case GL_RENDERBUFFER_STENCIL_SIZE:
return true;
}
return false;
}
bool IsValidRenderbufferTarget(GLenum target) {
return target == GL_RENDERBUFFER;
}
bool IsValidShaderType(GLenum type) {
return type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER;
}
bool IsValidStencilFunc(GLenum func) {
switch (func) {
case GL_NEVER:
case GL_LESS:
case GL_LEQUAL:
case GL_GREATER:
case GL_GEQUAL:
case GL_EQUAL:
case GL_NOTEQUAL:
case GL_ALWAYS:
return true;
default:
return false;
}
}
bool IsValidTexCoordPointerSize(GLint size) {
return ((size >= 2) && (size <= 4));
}
bool IsValidTexCoordPointerType(GLenum type) {
switch (type) {
case GL_BYTE:
case GL_SHORT:
case GL_FLOAT:
case GL_FIXED:
return true;
}
return false;
}
bool IsValidTexEnv(GLenum target, GLenum pname) {
switch (pname) {
case GL_TEXTURE_ENV_MODE:
case GL_TEXTURE_ENV_COLOR:
case GL_COMBINE_RGB:
case GL_COMBINE_ALPHA:
case GL_SRC0_RGB:
case GL_SRC1_RGB:
case GL_SRC2_RGB:
case GL_SRC0_ALPHA:
case GL_SRC1_ALPHA:
case GL_SRC2_ALPHA:
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
case GL_COORD_REPLACE_OES:
break;
default:
return false;
}
return (target == GL_TEXTURE_ENV || target == GL_POINT_SPRITE_OES);
}
bool IsValidTexEnvCombineAlpha(GLenum param) {
switch (param) {
case GL_REPLACE:
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED:
case GL_INTERPOLATE:
case GL_SUBTRACT:
return true;
default:
return false;
}
}
bool IsValidTexEnvCombineRgb(GLenum param) {
switch (param) {
case GL_REPLACE:
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED:
case GL_INTERPOLATE:
case GL_SUBTRACT:
case GL_DOT3_RGB:
case GL_DOT3_RGBA:
return true;
default:
return false;
}
}
bool IsValidTexEnvMode(GLenum param) {
switch (param) {
case GL_REPLACE:
case GL_MODULATE:
case GL_DECAL:
case GL_BLEND:
case GL_ADD:
case GL_COMBINE:
return true;
default:
return false;
}
}
bool IsValidTexEnvOperandAlpha(GLenum param) {
switch (param) {
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
return true;
default:
return false;
}
}
bool IsValidTexEnvOperandRgb(GLenum param) {
switch (param) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
return true;
default:
return false;
}
}
bool IsValidTexEnvScale(GLfloat scale) {
return (scale == 1.f || scale == 2.f || scale == 4.f);
}
bool IsValidTexEnvSource(GLenum param) {
switch (param) {
case GL_PREVIOUS:
case GL_PRIMARY_COLOR:
case GL_TEXTURE:
case GL_CONSTANT:
return true;
default:
return false;
}
}
bool IsValidTexGenCoord(GLenum coord) {
// GL_S, GL_T and GL_R are not defined in GLES1 and GLES1 headers.
// Only GL_TEXTURE_GEN_STR_OES is supported.
return coord == GL_TEXTURE_GEN_STR_OES;
}
bool IsValidTexGenMode(GLenum mode) {
// opengles_spec_1_1_extension_pack.pdf 4.1
// Only GL_NORMAL_MAP_OES & GL_REFLECTION_MAP_OES are supported.
switch (mode) {
case GL_NORMAL_MAP_OES:
case GL_REFLECTION_MAP_OES:
return true;
default:
return false;
}
}
bool IsValidTextureDimensions(GLsizei width, GLsizei height,
GLint max_texture_size) {
if (width < 0 || width > max_texture_size)
return false;
if (height < 0 || height > max_texture_size)
return false;
return IsPowerOf2(width) && IsPowerOf2(height);
}
bool IsValidTextureEnum(GLenum unit, GLuint max_num_textures) {
return unit >= GL_TEXTURE0 && unit <= (GL_TEXTURE0 + max_num_textures);
}
bool IsValidTextureParam(GLenum param) {
switch (param) {
case GL_GENERATE_MIPMAP:
case GL_TEXTURE_CROP_RECT_OES:
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
return true;
default:
return false;
}
}
bool IsValidTextureTarget(GLenum target) {
return target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP ||
target == GL_TEXTURE_EXTERNAL_OES;
}
bool IsValidTextureTargetAndParam(GLenum target, 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_GENERATE_MIPMAP:
break;
default:
return false;
}
return (target == GL_TEXTURE_2D) || (target == GL_TEXTURE_CUBE_MAP_OES);
}
bool IsValidTextureTargetEx(GLenum target) {
switch (target) {
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES:
case GL_TEXTURE_EXTERNAL_OES:
case GL_TEXTURE_2D:
return true;
}
return false;
}
bool IsValidTextureTargetLimited(GLenum target) {
return target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES;
}
bool IsValidVertexAttribSize(GLint size) {
return ((size >= 1) && (size <= 4));
}
bool IsValidVertexAttribType(GLenum type) {
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_FIXED:
case GL_FLOAT:
return true;
}
return false;
}
bool IsValidVertexPointerSize(GLint size) {
return ((size >= 2) && (size <= 4));
}
bool IsValidVertexPointerType(GLenum type) {
switch (type) {
case GL_BYTE:
case GL_SHORT:
case GL_FLOAT:
case GL_FIXED:
return true;
}
return false;
}
bool IsValidWeightPointerSize(GLint size) {
return ((size >= 1) && (size <= UniformContext::kMaxVertexUnitsOES));
}
bool IsValidWeightPointerType(GLenum type) {
switch (type) {
case GL_FIXED:
case GL_FLOAT:
return true;
}
return false;
}