306 lines
7.3 KiB
C++
306 lines
7.3 KiB
C++
/*
|
|
* 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 <GLcommon/GLutils.h>
|
|
#include <GLES/gl.h>
|
|
#include <GLES/glext.h>
|
|
#include <GLcommon/GLEScontext.h>
|
|
#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;
|
|
}
|
|
|