/* * 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 "GLEScmValidate.h" #include #include #include #include #include "GLEScmValidate.h" bool GLEScmValidate::lightEnum(GLenum e,unsigned int maxLights) { return e >=GL_LIGHT0 && e <= (GL_LIGHT0+maxLights); } bool GLEScmValidate::clipPlaneEnum(GLenum e,unsigned int maxClipPlanes) { return e >=GL_CLIP_PLANE0 && e <= (GL_CLIP_PLANE0+maxClipPlanes); } bool GLEScmValidate::alphaFunc(GLenum f) { switch(f) { 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; } return false; } bool GLEScmValidate::blendSrc(GLenum s) { switch(s) { case GL_ZERO: case GL_ONE: 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_SRC_ALPHA_SATURATE: return true; } return false; } bool GLEScmValidate::vertexPointerParams(GLint size,GLsizei stride) { return ((size >=2) && (size <= 4)) && (stride >=0) ; } bool GLEScmValidate::colorPointerParams(GLint size,GLsizei stride) { return (size == 4) && (stride >=0) ; } bool GLEScmValidate::texCoordPointerParams(GLint size,GLsizei stride) { return ((size >=2) && (size <= 4)) && (stride >=0) ; } bool GLEScmValidate::supportedArrays(GLenum arr) { switch(arr) { case GL_COLOR_ARRAY: case GL_NORMAL_ARRAY: case GL_POINT_SIZE_ARRAY_OES: case GL_TEXTURE_COORD_ARRAY: case GL_VERTEX_ARRAY: return true; } return false; } bool GLEScmValidate::hintTargetMode(GLenum target,GLenum mode) { switch(target) { case GL_FOG_HINT: case GL_GENERATE_MIPMAP_HINT: case GL_LINE_SMOOTH_HINT: case GL_PERSPECTIVE_CORRECTION_HINT: case GL_POINT_SMOOTH_HINT: break; default: return false; } switch(mode) { case GL_FASTEST: case GL_NICEST: case GL_DONT_CARE: break; default: return false; } return true; } bool GLEScmValidate::texParams(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_TEXTURE_CROP_RECT_OES: case GL_GENERATE_MIPMAP: case GL_TEXTURE_MAX_ANISOTROPY_EXT: break; default: return false; } return (target == GL_TEXTURE_2D)||(target == GL_TEXTURE_CUBE_MAP_OES); } bool GLEScmValidate::texEnv(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 GLEScmValidate::capability(GLenum cap,int maxLights,int maxClipPlanes) { switch(cap) { case GL_ALPHA_TEST: case GL_BLEND: case GL_COLOR_ARRAY: case GL_COLOR_LOGIC_OP: case GL_COLOR_MATERIAL: case GL_CULL_FACE: case GL_DEPTH_TEST: case GL_DITHER: case GL_FOG: case GL_LIGHTING: case GL_LINE_SMOOTH: case GL_MULTISAMPLE: case GL_NORMAL_ARRAY: case GL_NORMALIZE: case GL_POINT_SIZE_ARRAY_OES: case GL_POINT_SMOOTH: case GL_POINT_SPRITE_OES: case GL_POLYGON_OFFSET_FILL: case GL_RESCALE_NORMAL: case GL_SAMPLE_ALPHA_TO_COVERAGE: case GL_SAMPLE_ALPHA_TO_ONE: case GL_SAMPLE_COVERAGE: case GL_SCISSOR_TEST: case GL_STENCIL_TEST: case GL_TEXTURE_2D: case GL_TEXTURE_COORD_ARRAY: case GL_VERTEX_ARRAY: return true; } return GLEScmValidate::lightEnum(cap,maxLights) || GLEScmValidate::clipPlaneEnum(cap,maxClipPlanes); } bool GLEScmValidate::texCompImgFrmt(GLenum format) { switch(format) { case GL_PALETTE4_RGB8_OES: case GL_PALETTE4_RGBA8_OES: case GL_PALETTE4_R5_G6_B5_OES: case GL_PALETTE4_RGBA4_OES: case GL_PALETTE4_RGB5_A1_OES: case GL_PALETTE8_RGB8_OES: case GL_PALETTE8_RGBA8_OES: case GL_PALETTE8_R5_G6_B5_OES: case GL_PALETTE8_RGBA4_OES: case GL_PALETTE8_RGB5_A1_OES: return true; } return false; } bool GLEScmValidate::blendDst(GLenum d) { switch(d) { case GL_ZERO: case GL_ONE: case GL_SRC_COLOR: case GL_ONE_MINUS_SRC_COLOR: case GL_SRC_ALPHA: case GL_ONE_MINUS_SRC_ALPHA: case GL_DST_ALPHA: case GL_ONE_MINUS_DST_ALPHA: return true; } return false; } bool GLEScmValidate::renderbufferInternalFrmt(GLEScontext* ctx, GLenum internalformat) { switch (internalformat) { case GL_DEPTH_COMPONENT16_OES: case GL_RGBA4_OES: case GL_RGB5_A1_OES: case GL_RGB565_OES: case GL_STENCIL_INDEX1_OES: case GL_STENCIL_INDEX4_OES: case GL_STENCIL_INDEX8_OES: case GL_RGB8_OES: case GL_RGBA8_OES: case GL_DEPTH_COMPONENT24_OES: case GL_DEPTH_COMPONENT32_OES: return true; } if (ctx->getCaps()->GL_EXT_PACKED_DEPTH_STENCIL && internalformat==GL_DEPTH24_STENCIL8_OES) return true; return false; } bool GLEScmValidate::stencilOp(GLenum param) { switch (param) { case GL_KEEP: case GL_ZERO: case GL_REPLACE: case GL_INCR: case GL_DECR: case GL_INVERT: case GL_INCR_WRAP_OES: case GL_DECR_WRAP_OES: return true; } return false; } bool GLEScmValidate::texGen(GLenum coord, GLenum pname) { return (coord == GL_TEXTURE_GEN_STR_OES && pname == GL_TEXTURE_GEN_MODE_OES); } bool GLEScmValidate::colorPointerType(GLenum type){ switch(type){ case GL_UNSIGNED_BYTE: case GL_FIXED: case GL_FLOAT: return true; } return false; } bool GLEScmValidate::normalPointerType(GLenum type){ switch(type){ case GL_BYTE: case GL_SHORT: case GL_FLOAT: case GL_FIXED: return true; } return false; } bool GLEScmValidate::pointPointerType(GLenum type){ return type == GL_FIXED || type == GL_FLOAT; } bool GLEScmValidate::texCoordPointerType(GLenum type){ switch(type){ case GL_BYTE: case GL_SHORT: case GL_FLOAT: case GL_FIXED: return true; } return false; } bool GLEScmValidate::vertexPointerType(GLenum type){ switch(type){ case GL_BYTE: case GL_SHORT: case GL_FLOAT: case GL_FIXED: return true; } return false; }