1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "GLEScmValidate.h"
17 #include <GLcommon/GLutils.h>
18 #include <GLES/gl.h>
19 #include <GLES/glext.h>
20 #include <GLcommon/GLEScontext.h>
21 #include "GLEScmValidate.h"
22
23
lightEnum(GLenum e,unsigned int maxLights)24 bool GLEScmValidate::lightEnum(GLenum e,unsigned int maxLights) {
25 return e >=GL_LIGHT0 && e <= (GL_LIGHT0+maxLights);
26 }
27
clipPlaneEnum(GLenum e,unsigned int maxClipPlanes)28 bool GLEScmValidate::clipPlaneEnum(GLenum e,unsigned int maxClipPlanes) {
29 return e >=GL_CLIP_PLANE0 && e <= (GL_CLIP_PLANE0+maxClipPlanes);
30 }
31
alphaFunc(GLenum f)32 bool GLEScmValidate::alphaFunc(GLenum f) {
33 switch(f) {
34 case GL_NEVER:
35 case GL_LESS:
36 case GL_EQUAL:
37 case GL_LEQUAL:
38 case GL_GREATER:
39 case GL_NOTEQUAL:
40 case GL_GEQUAL:
41 case GL_ALWAYS:
42 return true;
43 }
44 return false;
45 }
46
blendSrc(GLenum s)47 bool GLEScmValidate::blendSrc(GLenum s) {
48 switch(s) {
49 case GL_ZERO:
50 case GL_ONE:
51 case GL_DST_COLOR:
52 case GL_ONE_MINUS_DST_COLOR:
53 case GL_SRC_ALPHA:
54 case GL_ONE_MINUS_SRC_ALPHA:
55 case GL_DST_ALPHA:
56 case GL_ONE_MINUS_DST_ALPHA:
57 case GL_SRC_ALPHA_SATURATE:
58 return true;
59 }
60 return false;
61 }
62
vertexPointerParams(GLint size,GLsizei stride)63 bool GLEScmValidate::vertexPointerParams(GLint size,GLsizei stride) {
64 return ((size >=2) && (size <= 4)) && (stride >=0) ;
65 }
66
colorPointerParams(GLint size,GLsizei stride)67 bool GLEScmValidate::colorPointerParams(GLint size,GLsizei stride) {
68 return ((size >=3) && (size <= 4)) && (stride >=0) ;
69 }
70
texCoordPointerParams(GLint size,GLsizei stride)71 bool GLEScmValidate::texCoordPointerParams(GLint size,GLsizei stride) {
72 return ((size >=2) && (size <= 4)) && (stride >=0) ;
73 }
74
supportedArrays(GLenum arr)75 bool GLEScmValidate::supportedArrays(GLenum arr) {
76 switch(arr) {
77 case GL_COLOR_ARRAY:
78 case GL_NORMAL_ARRAY:
79 case GL_POINT_SIZE_ARRAY_OES:
80 case GL_TEXTURE_COORD_ARRAY:
81 case GL_VERTEX_ARRAY:
82 return true;
83 }
84 return false;
85 }
86
hintTargetMode(GLenum target,GLenum mode)87 bool GLEScmValidate::hintTargetMode(GLenum target,GLenum mode) {
88 switch(target) {
89 case GL_FOG_HINT:
90 case GL_GENERATE_MIPMAP_HINT:
91 case GL_LINE_SMOOTH_HINT:
92 case GL_PERSPECTIVE_CORRECTION_HINT:
93 case GL_POINT_SMOOTH_HINT:
94 break;
95 default: return false;
96 }
97 switch(mode) {
98 case GL_FASTEST:
99 case GL_NICEST:
100 case GL_DONT_CARE:
101 break;
102 default: return false;
103 }
104 return true;
105 }
106
texParams(GLenum target,GLenum pname)107 bool GLEScmValidate::texParams(GLenum target,GLenum pname) {
108 switch(pname) {
109 case GL_TEXTURE_MIN_FILTER:
110 case GL_TEXTURE_MAG_FILTER:
111 case GL_TEXTURE_WRAP_S:
112 case GL_TEXTURE_WRAP_T:
113 case GL_TEXTURE_CROP_RECT_OES:
114 case GL_GENERATE_MIPMAP:
115 break;
116 default:
117 return false;
118 }
119 return (target == GL_TEXTURE_2D)||(target == GL_TEXTURE_CUBE_MAP_OES);
120 }
121
texEnv(GLenum target,GLenum pname)122 bool GLEScmValidate::texEnv(GLenum target,GLenum pname) {
123 switch(pname) {
124 case GL_TEXTURE_ENV_MODE:
125 case GL_TEXTURE_ENV_COLOR:
126 case GL_COMBINE_RGB:
127 case GL_COMBINE_ALPHA:
128 case GL_SRC0_RGB:
129 case GL_SRC1_RGB:
130 case GL_SRC2_RGB:
131 case GL_SRC0_ALPHA:
132 case GL_SRC1_ALPHA:
133 case GL_SRC2_ALPHA:
134 case GL_OPERAND0_RGB:
135 case GL_OPERAND1_RGB:
136 case GL_OPERAND2_RGB:
137 case GL_OPERAND0_ALPHA:
138 case GL_OPERAND1_ALPHA:
139 case GL_OPERAND2_ALPHA:
140 case GL_RGB_SCALE:
141 case GL_ALPHA_SCALE:
142 case GL_COORD_REPLACE_OES:
143 break;
144 default:
145 return false;
146 }
147 return (target == GL_TEXTURE_ENV || target == GL_POINT_SPRITE_OES);
148 }
149
capability(GLenum cap,int maxLights,int maxClipPlanes)150 bool GLEScmValidate::capability(GLenum cap,int maxLights,int maxClipPlanes) {
151 switch(cap) {
152 case GL_ALPHA_TEST:
153 case GL_BLEND:
154 case GL_COLOR_ARRAY:
155 case GL_COLOR_LOGIC_OP:
156 case GL_COLOR_MATERIAL:
157 case GL_CULL_FACE:
158 case GL_DEPTH_TEST:
159 case GL_DITHER:
160 case GL_FOG:
161 case GL_LIGHTING:
162 case GL_LINE_SMOOTH:
163 case GL_MULTISAMPLE:
164 case GL_NORMAL_ARRAY:
165 case GL_NORMALIZE:
166 case GL_POINT_SIZE_ARRAY_OES:
167 case GL_POINT_SMOOTH:
168 case GL_POINT_SPRITE_OES:
169 case GL_POLYGON_OFFSET_FILL:
170 case GL_RESCALE_NORMAL:
171 case GL_SAMPLE_ALPHA_TO_COVERAGE:
172 case GL_SAMPLE_ALPHA_TO_ONE:
173 case GL_SAMPLE_COVERAGE:
174 case GL_SCISSOR_TEST:
175 case GL_STENCIL_TEST:
176 case GL_TEXTURE_2D:
177 case GL_TEXTURE_COORD_ARRAY:
178 case GL_VERTEX_ARRAY:
179 return true;
180 }
181 return GLEScmValidate::lightEnum(cap,maxLights) || GLEScmValidate::clipPlaneEnum(cap,maxClipPlanes);
182 }
183
184
texCompImgFrmt(GLenum format)185 bool GLEScmValidate::texCompImgFrmt(GLenum format) {
186 switch(format) {
187 case GL_PALETTE4_RGB8_OES:
188 case GL_PALETTE4_RGBA8_OES:
189 case GL_PALETTE4_R5_G6_B5_OES:
190 case GL_PALETTE4_RGBA4_OES:
191 case GL_PALETTE4_RGB5_A1_OES:
192 case GL_PALETTE8_RGB8_OES:
193 case GL_PALETTE8_RGBA8_OES:
194 case GL_PALETTE8_R5_G6_B5_OES:
195 case GL_PALETTE8_RGBA4_OES:
196 case GL_PALETTE8_RGB5_A1_OES:
197 return true;
198 }
199 return false;
200 }
201
blendDst(GLenum d)202 bool GLEScmValidate::blendDst(GLenum d) {
203 switch(d) {
204 case GL_ZERO:
205 case GL_ONE:
206 case GL_SRC_COLOR:
207 case GL_ONE_MINUS_SRC_COLOR:
208 case GL_SRC_ALPHA:
209 case GL_ONE_MINUS_SRC_ALPHA:
210 case GL_DST_ALPHA:
211 case GL_ONE_MINUS_DST_ALPHA:
212 return true;
213 }
214 return false;
215 }
216
renderbufferInternalFrmt(GLEScontext * ctx,GLenum internalformat)217 bool GLEScmValidate::renderbufferInternalFrmt(GLEScontext* ctx, GLenum internalformat)
218 {
219 switch (internalformat) {
220 case GL_DEPTH_COMPONENT16_OES:
221 case GL_RGBA4_OES:
222 case GL_RGB5_A1_OES:
223 case GL_RGB565_OES:
224 case GL_STENCIL_INDEX1_OES:
225 case GL_STENCIL_INDEX4_OES:
226 case GL_STENCIL_INDEX8_OES:
227 case GL_RGB8_OES:
228 case GL_RGBA8_OES:
229 case GL_DEPTH_COMPONENT24_OES:
230 case GL_DEPTH_COMPONENT32_OES:
231 return true;
232 }
233 if (ctx->getCaps()->GL_EXT_PACKED_DEPTH_STENCIL && internalformat==GL_DEPTH24_STENCIL8_OES)
234 return true;
235
236 return false;
237 }
238
stencilOp(GLenum param)239 bool GLEScmValidate::stencilOp(GLenum param) {
240 switch (param) {
241 case GL_KEEP:
242 case GL_ZERO:
243 case GL_REPLACE:
244 case GL_INCR:
245 case GL_DECR:
246 case GL_INVERT:
247 case GL_INCR_WRAP_OES:
248 case GL_DECR_WRAP_OES:
249 return true;
250 }
251 return false;
252 }
253
texGen(GLenum coord,GLenum pname)254 bool GLEScmValidate::texGen(GLenum coord, GLenum pname) {
255 return (coord == GL_TEXTURE_GEN_STR_OES && pname == GL_TEXTURE_GEN_MODE_OES);
256 }
257
colorPointerType(GLenum type)258 bool GLEScmValidate::colorPointerType(GLenum type){
259 switch(type){
260 case GL_UNSIGNED_BYTE:
261 case GL_FIXED:
262 case GL_FLOAT:
263 return true;
264 }
265 return false;
266 }
267
normalPointerType(GLenum type)268 bool GLEScmValidate::normalPointerType(GLenum type){
269
270 switch(type){
271 case GL_BYTE:
272 case GL_SHORT:
273 case GL_FLOAT:
274 case GL_FIXED:
275 return true;
276 }
277 return false;
278 }
279
pointPointerType(GLenum type)280 bool GLEScmValidate::pointPointerType(GLenum type){
281 return type == GL_FIXED || type == GL_FLOAT;
282 }
283
texCoordPointerType(GLenum type)284 bool GLEScmValidate::texCoordPointerType(GLenum type){
285 switch(type){
286 case GL_BYTE:
287 case GL_SHORT:
288 case GL_FLOAT:
289 case GL_FIXED:
290 return true;
291 }
292 return false;
293 }
294
vertexPointerType(GLenum type)295 bool GLEScmValidate::vertexPointerType(GLenum type){
296 switch(type){
297 case GL_BYTE:
298 case GL_SHORT:
299 case GL_FLOAT:
300 case GL_FIXED:
301 return true;
302 }
303 return false;
304 }
305
306