• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "GLESv2Validate.h"
17 #include <string.h>
18 
19 #define LIST_VALID_TEXFORMATS(f) \
20     f(GL_DEPTH_COMPONENT) \
21     f(GL_DEPTH_STENCIL) \
22     f(GL_RED) \
23     f(GL_RED_INTEGER) \
24     f(GL_RG) \
25     f(GL_RGB) \
26     f(GL_RGBA) \
27     f(GL_RGBA_INTEGER) \
28     f(GL_RGB_INTEGER) \
29     f(GL_RG_INTEGER) \
30 
31 #define LIST_VALID_TEXTYPES(f) \
32     f(GL_BYTE) \
33     f(GL_FLOAT) \
34     f(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
35     f(GL_HALF_FLOAT) \
36     f(GL_HALF_FLOAT_OES) \
37     f(GL_INT) \
38     f(GL_SHORT) \
39     f(GL_UNSIGNED_BYTE) \
40     f(GL_UNSIGNED_INT) \
41     f(GL_UNSIGNED_INT_10F_11F_11F_REV) \
42     f(GL_UNSIGNED_INT_2_10_10_10_REV) \
43     f(GL_UNSIGNED_INT_24_8) \
44     f(GL_UNSIGNED_INT_5_9_9_9_REV) \
45     f(GL_UNSIGNED_SHORT) \
46     f(GL_UNSIGNED_SHORT_4_4_4_4) \
47     f(GL_UNSIGNED_SHORT_5_5_5_1) \
48     f(GL_UNSIGNED_SHORT_5_6_5) \
49 
50 #define LIST_VALID_TEXFORMAT_COMBINATIONS(f) \
51     f(GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE) \
52     f(GL_R8, GL_RED, GL_UNSIGNED_BYTE) \
53     f(GL_R8_SNORM, GL_RED, GL_BYTE) \
54     f(GL_R16F, GL_RED, GL_FLOAT) \
55     f(GL_R16F, GL_RED, GL_HALF_FLOAT) \
56     f(GL_R32F, GL_RED, GL_FLOAT) \
57     f(GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE) \
58     f(GL_R8I, GL_RED_INTEGER, GL_BYTE) \
59     f(GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT) \
60     f(GL_R16I, GL_RED_INTEGER, GL_SHORT) \
61     f(GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT) \
62     f(GL_R32I, GL_RED_INTEGER, GL_INT) \
63     f(GL_RG8, GL_RG, GL_UNSIGNED_BYTE) \
64     f(GL_RG8_SNORM, GL_RG, GL_BYTE) \
65     f(GL_RG16F, GL_RG, GL_HALF_FLOAT) \
66     f(GL_RG16F, GL_RG, GL_FLOAT) \
67     f(GL_RG32F, GL_RG, GL_FLOAT) \
68     f(GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE) \
69     f(GL_RG8I, GL_RG_INTEGER, GL_BYTE) \
70     f(GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT) \
71     f(GL_RG16I, GL_RG_INTEGER, GL_SHORT) \
72     f(GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT) \
73     f(GL_RG32I, GL_RG_INTEGER, GL_INT) \
74     f(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE) \
75     f(GL_SRGB8, GL_RGB, GL_UNSIGNED_BYTE) \
76     f(GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE) \
77     f(GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5) \
78     f(GL_RGB8_SNORM, GL_RGB, GL_BYTE) \
79     f(GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV) \
80     f(GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT) \
81     f(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT) \
82     f(GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV) \
83     f(GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT) \
84     f(GL_RGB9_E5, GL_RGB, GL_FLOAT) \
85     f(GL_RGB16F, GL_RGB, GL_HALF_FLOAT) \
86     f(GL_RGB16F, GL_RGB, GL_FLOAT) \
87     f(GL_RGB32F, GL_RGB, GL_FLOAT) \
88     f(GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE) \
89     f(GL_RGB8I, GL_RGB_INTEGER, GL_BYTE) \
90     f(GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT) \
91     f(GL_RGB16I, GL_RGB_INTEGER, GL_SHORT) \
92     f(GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT) \
93     f(GL_RGB32I, GL_RGB_INTEGER, GL_INT) \
94     f(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE) \
95     f(GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE) \
96     f(GL_RGBA8_SNORM, GL_RGBA, GL_BYTE) \
97     f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE) \
98     f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1) \
99     f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
100     f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE) \
101     f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4) \
102     f(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
103     f(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT) \
104     f(GL_RGBA16F, GL_RGBA, GL_FLOAT) \
105     f(GL_RGBA32F, GL_RGBA, GL_FLOAT) \
106     f(GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE) \
107     f(GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE) \
108     f(GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV) \
109     f(GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT) \
110     f(GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT) \
111     f(GL_RGBA32I, GL_RGBA_INTEGER, GL_INT) \
112     f(GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT) \
113     f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT) \
114     f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
115     f(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
116     f(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT) \
117     f(GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8) \
118     f(GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
119     f(GL_COMPRESSED_R11_EAC, GL_RED, GL_FLOAT) \
120     f(GL_COMPRESSED_SIGNED_R11_EAC, GL_RED, GL_FLOAT) \
121     f(GL_COMPRESSED_RG11_EAC, GL_RG, GL_FLOAT) \
122     f(GL_COMPRESSED_SIGNED_RG11_EAC, GL_RG, GL_FLOAT) \
123     f(GL_COMPRESSED_RGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
124     f(GL_COMPRESSED_SRGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
125     f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
126     f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
127     f(GL_COMPRESSED_RGBA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
128     f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
129     f(GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
130     f(GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
131     f(GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
132     f(GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
133     f(GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
134     f(GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
135     f(GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
136     f(GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
137     f(GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
138     f(GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
139     f(GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
140     f(GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
141     f(GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
142     f(GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
143     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
144     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
145     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
146     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
147     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
148     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
149     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
150     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
151     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
152     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
153     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
154     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
155     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
156     f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
157 
158 
renderbufferParam(GLEScontext * ctx,GLenum pname)159 bool GLESv2Validate::renderbufferParam(GLEScontext* ctx, GLenum pname){
160     int glesMajorVersion = ctx->getMajorVersion();
161     switch(pname){
162     case GL_RENDERBUFFER_WIDTH:
163     case GL_RENDERBUFFER_HEIGHT:
164     case GL_RENDERBUFFER_INTERNAL_FORMAT:
165     case GL_RENDERBUFFER_RED_SIZE:
166     case GL_RENDERBUFFER_GREEN_SIZE:
167     case GL_RENDERBUFFER_BLUE_SIZE:
168     case GL_RENDERBUFFER_ALPHA_SIZE:
169     case GL_RENDERBUFFER_DEPTH_SIZE:
170     case GL_RENDERBUFFER_STENCIL_SIZE:
171         return true;
172     case GL_RENDERBUFFER_SAMPLES:
173         return glesMajorVersion >= 3;
174     }
175     return false;
176 }
177 
framebufferTarget(GLEScontext * ctx,GLenum target)178 bool GLESv2Validate::framebufferTarget(GLEScontext* ctx, GLenum target) {
179     int glesMajorVersion = ctx->getMajorVersion();
180     switch (target) {
181     case GL_FRAMEBUFFER:
182         return true;
183     case GL_DRAW_FRAMEBUFFER:
184     case GL_READ_FRAMEBUFFER:
185         return glesMajorVersion >= 3;
186     }
187     return false;
188 }
189 
framebufferAttachment(GLEScontext * ctx,GLenum attachment)190 bool GLESv2Validate::framebufferAttachment(GLEScontext* ctx, GLenum attachment) {
191     int glesMajorVersion = ctx->getMajorVersion();
192     switch (attachment) {
193     case GL_COLOR_ATTACHMENT0:
194     case GL_DEPTH_ATTACHMENT:
195     case GL_STENCIL_ATTACHMENT:
196         return true;
197     case GL_COLOR_ATTACHMENT1:
198     case GL_COLOR_ATTACHMENT2:
199     case GL_COLOR_ATTACHMENT3:
200     case GL_COLOR_ATTACHMENT4:
201     case GL_COLOR_ATTACHMENT5:
202     case GL_COLOR_ATTACHMENT6:
203     case GL_COLOR_ATTACHMENT7:
204     case GL_COLOR_ATTACHMENT8:
205     case GL_COLOR_ATTACHMENT9:
206     case GL_COLOR_ATTACHMENT10:
207     case GL_COLOR_ATTACHMENT11:
208     case GL_COLOR_ATTACHMENT12:
209     case GL_COLOR_ATTACHMENT13:
210     case GL_COLOR_ATTACHMENT14:
211     case GL_COLOR_ATTACHMENT15:
212     case GL_DEPTH_STENCIL_ATTACHMENT:
213         return glesMajorVersion >= 3;
214     }
215     return false;
216 }
217 
bufferTarget(GLEScontext * ctx,GLenum target)218 bool GLESv2Validate::bufferTarget(GLEScontext* ctx, GLenum target) {
219     int glesMajorVersion = ctx->getMajorVersion();
220     int glesMinorVersion = ctx->getMinorVersion();
221     switch (target) {
222     case GL_ARRAY_BUFFER: // Vertex attributes
223     case GL_ELEMENT_ARRAY_BUFFER: // Vertex array indices
224         return true;
225         // GLES 3.0 buffers
226     case GL_COPY_READ_BUFFER: // Buffer copy source
227     case GL_COPY_WRITE_BUFFER: // Buffer copy destination
228     case GL_PIXEL_PACK_BUFFER: // Pixel read target
229     case GL_PIXEL_UNPACK_BUFFER: // Texture data source
230     case GL_TRANSFORM_FEEDBACK_BUFFER: // Transform feedback buffer
231     case GL_UNIFORM_BUFFER: // Uniform block storage
232         return glesMajorVersion >= 3;
233         // GLES 3.1 buffers
234     case GL_ATOMIC_COUNTER_BUFFER: // Atomic counter storage
235     case GL_DISPATCH_INDIRECT_BUFFER: // Indirect compute dispatch commands
236     case GL_DRAW_INDIRECT_BUFFER: // Indirect command arguments
237     case GL_SHADER_STORAGE_BUFFER: // Read-write storage for shaders
238         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
239     default:
240         return false;
241     }
242 }
243 
bufferUsage(GLEScontext * ctx,GLenum usage)244 bool GLESv2Validate::bufferUsage(GLEScontext* ctx, GLenum usage) {
245     int glesMajorVersion = ctx->getMajorVersion();
246     switch(usage) {
247         case GL_STREAM_DRAW:
248         case GL_STATIC_DRAW:
249         case GL_DYNAMIC_DRAW:
250             return true;
251         case GL_STREAM_READ:
252         case GL_STATIC_READ:
253         case GL_DYNAMIC_READ:
254         case GL_STREAM_COPY:
255         case GL_STATIC_COPY:
256         case GL_DYNAMIC_COPY:
257             return glesMajorVersion >= 3;
258     }
259     return false;
260 
261 }
262 
263 
bufferParam(GLEScontext * ctx,GLenum pname)264 bool GLESv2Validate::bufferParam(GLEScontext* ctx, GLenum pname) {
265     int glesMajorVersion = ctx->getMajorVersion();
266     switch (pname) {
267     case GL_BUFFER_SIZE:
268     case GL_BUFFER_USAGE:
269         return true;
270     case GL_BUFFER_ACCESS_FLAGS:
271     case GL_BUFFER_MAPPED:
272     case GL_BUFFER_MAP_LENGTH:
273     case GL_BUFFER_MAP_OFFSET:
274         return glesMajorVersion >= 3;
275     default:
276         return false;
277     }
278 }
279 
280 
blendEquationMode(GLEScontext * ctx,GLenum mode)281 bool GLESv2Validate::blendEquationMode(GLEScontext* ctx, GLenum mode){
282     int glesMajorVersion = ctx->getMajorVersion();
283     switch (mode) {
284     case GL_FUNC_ADD:
285     case GL_FUNC_SUBTRACT:
286     case GL_FUNC_REVERSE_SUBTRACT:
287         return true;
288     case GL_MIN:
289     case GL_MAX:
290         return glesMajorVersion >= 3;
291     }
292     return false;
293 }
294 
blendSrc(GLenum s)295 bool GLESv2Validate::blendSrc(GLenum s) {
296    switch(s) {
297    case GL_ZERO:
298    case GL_ONE:
299    case GL_SRC_COLOR:
300    case GL_ONE_MINUS_SRC_COLOR:
301    case GL_DST_COLOR:
302    case GL_ONE_MINUS_DST_COLOR:
303    case GL_SRC_ALPHA:
304    case GL_ONE_MINUS_SRC_ALPHA:
305    case GL_DST_ALPHA:
306    case GL_ONE_MINUS_DST_ALPHA:
307    case GL_CONSTANT_COLOR:
308    case GL_ONE_MINUS_CONSTANT_COLOR:
309    case GL_CONSTANT_ALPHA:
310    case GL_ONE_MINUS_CONSTANT_ALPHA:
311    case GL_SRC_ALPHA_SATURATE:
312         return true;
313   }
314   return false;
315 }
316 
317 
blendDst(GLenum d)318 bool GLESv2Validate::blendDst(GLenum d) {
319    switch(d) {
320    case GL_ZERO:
321    case GL_ONE:
322    case GL_SRC_COLOR:
323    case GL_ONE_MINUS_SRC_COLOR:
324    case GL_DST_COLOR:
325    case GL_ONE_MINUS_DST_COLOR:
326    case GL_SRC_ALPHA:
327    case GL_ONE_MINUS_SRC_ALPHA:
328    case GL_DST_ALPHA:
329    case GL_ONE_MINUS_DST_ALPHA:
330    case GL_CONSTANT_COLOR:
331    case GL_ONE_MINUS_CONSTANT_COLOR:
332    case GL_CONSTANT_ALPHA:
333    case GL_ONE_MINUS_CONSTANT_ALPHA:
334    case GL_SRC_ALPHA_SATURATE:
335         return true;
336    }
337    return false;
338 }
339 
textureTarget(GLEScontext * ctx,GLenum target)340 bool GLESv2Validate::textureTarget(GLEScontext* ctx, GLenum target) {
341     int glesMajorVersion = ctx->getMajorVersion();
342     int glesMinorVersion = ctx->getMinorVersion();
343     switch (target) {
344     case GL_TEXTURE_2D:
345     case GL_TEXTURE_CUBE_MAP:
346         return true;
347     case GL_TEXTURE_2D_ARRAY:
348     case GL_TEXTURE_3D:
349         return glesMajorVersion >= 3;
350     case GL_TEXTURE_2D_MULTISAMPLE:
351         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
352     default:
353         return false;
354     }
355 }
356 
textureParams(GLEScontext * ctx,GLenum param)357 bool GLESv2Validate::textureParams(GLEScontext* ctx, GLenum param) {
358     int glesMajorVersion = ctx->getMajorVersion();
359     int glesMinorVersion = ctx->getMinorVersion();
360     switch(param) {
361     case GL_TEXTURE_MIN_FILTER:
362     case GL_TEXTURE_MAG_FILTER:
363     case GL_TEXTURE_WRAP_S:
364     case GL_TEXTURE_WRAP_T:
365     case GL_TEXTURE_MAX_ANISOTROPY_EXT:
366         return true;
367     case GL_TEXTURE_SWIZZLE_R:
368     case GL_TEXTURE_SWIZZLE_G:
369     case GL_TEXTURE_SWIZZLE_B:
370     case GL_TEXTURE_SWIZZLE_A:
371     case GL_TEXTURE_MIN_LOD:
372     case GL_TEXTURE_MAX_LOD:
373     case GL_TEXTURE_BASE_LEVEL:
374     case GL_TEXTURE_MAX_LEVEL:
375     case GL_TEXTURE_COMPARE_MODE:
376     case GL_TEXTURE_COMPARE_FUNC:
377     case GL_TEXTURE_WRAP_R:
378     case GL_TEXTURE_IMMUTABLE_FORMAT:
379     case GL_TEXTURE_IMMUTABLE_LEVELS:
380         return glesMajorVersion >= 3;
381     case GL_DEPTH_STENCIL_TEXTURE_MODE:
382         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
383     default:
384         return false;
385     }
386 }
387 
hintTargetMode(GLenum target,GLenum mode)388 bool GLESv2Validate::hintTargetMode(GLenum target,GLenum mode){
389 
390    switch(mode) {
391    case GL_FASTEST:
392    case GL_NICEST:
393    case GL_DONT_CARE:
394        break;
395    default: return false;
396    }
397    return target == GL_GENERATE_MIPMAP_HINT || target == GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES;
398 }
399 
capability(GLenum cap)400 bool GLESv2Validate::capability(GLenum cap){
401     switch(cap){
402     case GL_BLEND:
403     case GL_CULL_FACE:
404     case GL_DEPTH_TEST:
405     case GL_DITHER:
406     case GL_POLYGON_OFFSET_FILL:
407     case GL_SAMPLE_ALPHA_TO_COVERAGE:
408     case GL_SAMPLE_COVERAGE:
409     case GL_SCISSOR_TEST:
410     case GL_STENCIL_TEST:
411         return true;
412     }
413     return false;
414 }
415 
pixelStoreParam(GLEScontext * ctx,GLenum param)416 bool GLESv2Validate::pixelStoreParam(GLEScontext* ctx, GLenum param){
417     int glesMajorVersion = ctx->getMajorVersion();
418     switch(param) {
419     case GL_PACK_ALIGNMENT:
420     case GL_UNPACK_ALIGNMENT:
421         return true;
422     case GL_PACK_ROW_LENGTH:
423     case GL_PACK_SKIP_PIXELS:
424     case GL_PACK_SKIP_ROWS:
425     case GL_UNPACK_ROW_LENGTH:
426     case GL_UNPACK_IMAGE_HEIGHT:
427     case GL_UNPACK_SKIP_PIXELS:
428     case GL_UNPACK_SKIP_ROWS:
429     case GL_UNPACK_SKIP_IMAGES:
430         return glesMajorVersion >= 3;
431     default:
432         return false;
433     }
434 }
435 
readPixelFrmt(GLenum format)436 bool GLESv2Validate::readPixelFrmt(GLenum format){
437     switch(format) {
438     case GL_ALPHA:
439     case GL_LUMINANCE_ALPHA:
440     case GL_RGB:
441     case GL_RGBA:
442         return true;
443     }
444     return false;
445 }
446 
447 
shaderType(GLEScontext * ctx,GLenum type)448 bool GLESv2Validate::shaderType(GLEScontext* ctx, GLenum type){
449     int glesMajorVersion = ctx->getMajorVersion();
450     int glesMinorVersion = ctx->getMinorVersion();
451     switch (type) {
452     case GL_VERTEX_SHADER:
453     case GL_FRAGMENT_SHADER:
454         return true;
455     case GL_COMPUTE_SHADER:
456         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
457     }
458     return false;
459 }
460 
precisionType(GLenum type)461 bool GLESv2Validate::precisionType(GLenum type){
462     switch(type){
463     case GL_LOW_FLOAT:
464     case GL_MEDIUM_FLOAT:
465     case GL_HIGH_FLOAT:
466     case GL_LOW_INT:
467     case GL_MEDIUM_INT:
468     case GL_HIGH_INT:
469         return true;
470     }
471     return false;
472 }
473 
arrayIndex(GLEScontext * ctx,GLuint index)474 bool GLESv2Validate::arrayIndex(GLEScontext * ctx,GLuint index) {
475     return index < (GLuint)ctx->getCaps()->maxVertexAttribs;
476 }
477 
478 #define GL_RED                              0x1903
479 #define GL_RG                               0x8227
480 #define GL_R8                               0x8229
481 #define GL_RG8                              0x822B
482 #define GL_R16F                             0x822D
483 #define GL_RG16F                            0x822F
484 #define GL_RGBA16F                          0x881A
485 #define GL_RGB16F                           0x881B
486 #define GL_R11F_G11F_B10F                   0x8C3A
487 #define GL_UNSIGNED_INT_10F_11F_11F_REV     0x8C3B
488 
pixelType(GLEScontext * ctx,GLenum type)489 bool GLESv2Validate::pixelType(GLEScontext * ctx,GLenum type) {
490     int glesMajorVersion = ctx->getMajorVersion();
491     if (glesMajorVersion < 3) {
492         if(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT
493                 || type == GL_UNSIGNED_INT_10F_11F_11F_REV)
494             return true;
495 
496         return GLESvalidate::pixelType(ctx, type);
497     }
498 
499 #define GLES3_TYPE_CASE(type) \
500     case type: \
501 
502     switch (type) {
503         LIST_VALID_TEXTYPES(GLES3_TYPE_CASE)
504             return glesMajorVersion >= 3;
505         default:
506             break;
507     }
508 
509     return false;
510 }
511 
pixelFrmt(GLEScontext * ctx,GLenum format)512 bool GLESv2Validate::pixelFrmt(GLEScontext* ctx,GLenum format) {
513     int glesMajorVersion = ctx->getMajorVersion();
514     if (glesMajorVersion < 3) {
515         switch (format) {
516             case GL_DEPTH_COMPONENT:
517                 // GLES3 compatible
518                 // Required in dEQP
519             case GL_RED:
520             case GL_RG:
521                 return true;
522         }
523         return GLESvalidate::pixelFrmt(ctx, format);
524     }
525 
526 #define GLES3_FORMAT_CASE(format) \
527     case format:
528 
529     switch (format) {
530         LIST_VALID_TEXFORMATS(GLES3_FORMAT_CASE)
531             return glesMajorVersion >= 3;
532         default:
533             break;
534     }
535     return GLESvalidate::pixelFrmt(ctx, format);
536 }
537 
pixelItnlFrmt(GLEScontext * ctx,GLenum internalformat)538 bool GLESv2Validate::pixelItnlFrmt(GLEScontext* ctx ,GLenum internalformat) {
539     int glesMajorVersion = ctx->getMajorVersion();
540     switch (internalformat) {
541     case GL_R8:
542     case GL_RG8:
543     case GL_R16F:
544     case GL_RG16F:
545     case GL_RGBA16F:
546     case GL_RGB16F:
547     case GL_R11F_G11F_B10F:
548     case GL_RGB8:
549     case GL_RGBA8:
550         return true;
551     case GL_R8_SNORM:
552     case GL_R32F:
553     case GL_R8UI:
554     case GL_R8I:
555     case GL_R16UI:
556     case GL_R16I:
557     case GL_R32UI:
558     case GL_R32I:
559     case GL_RG8_SNORM:
560     case GL_RG32F:
561     case GL_RG8UI:
562     case GL_RG8I:
563     case GL_RG16UI:
564     case GL_RG16I:
565     case GL_RG32UI:
566     case GL_RG32I:
567     case GL_SRGB8:
568     case GL_RGB565:
569     case GL_RGB8_SNORM:
570     case GL_RGB9_E5:
571     case GL_RGB32F:
572     case GL_RGB8UI:
573     case GL_RGB8I:
574     case GL_RGB16UI:
575     case GL_RGB16I:
576     case GL_RGB32UI:
577     case GL_RGB32I:
578     case GL_SRGB8_ALPHA8:
579     case GL_RGBA8_SNORM:
580     case GL_RGB5_A1:
581     case GL_RGBA4:
582     case GL_RGB10_A2:
583     case GL_RGBA32F:
584     case GL_RGBA8UI:
585     case GL_RGBA8I:
586     case GL_RGB10_A2UI:
587     case GL_RGBA16UI:
588     case GL_RGBA16I:
589     case GL_RGBA32I:
590     case GL_RGBA32UI:
591     case GL_DEPTH_COMPONENT16:
592     case GL_DEPTH_COMPONENT24:
593     case GL_DEPTH_COMPONENT32F:
594     case GL_DEPTH24_STENCIL8:
595     case GL_DEPTH32F_STENCIL8:
596     case GL_COMPRESSED_R11_EAC:
597     case GL_COMPRESSED_SIGNED_R11_EAC:
598     case GL_COMPRESSED_RG11_EAC:
599     case GL_COMPRESSED_SIGNED_RG11_EAC:
600     case GL_COMPRESSED_RGB8_ETC2:
601     case GL_COMPRESSED_SRGB8_ETC2:
602     case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
603     case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
604     case GL_COMPRESSED_RGBA8_ETC2_EAC:
605     case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
606     case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
607     case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
608     case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
609     case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
610     case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
611     case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
612     case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
613     case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
614     case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
615     case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
616     case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
617     case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
618     case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
619     case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
620     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
621     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
622     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
623     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
624     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
625     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
626     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
627     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
628     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
629     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
630     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
631     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
632     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
633     case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
634         if (glesMajorVersion >= 3) {
635             return true;
636         }
637         break;
638     }
639     return pixelFrmt(ctx, internalformat);
640 }
641 
pixelSizedFrmt(GLEScontext * ctx,GLenum internalformat,GLenum format,GLenum type)642 bool GLESv2Validate::pixelSizedFrmt(GLEScontext* ctx, GLenum internalformat,
643                                     GLenum format, GLenum type) {
644     int glesMajorVersion = ctx->getMajorVersion();
645     if (internalformat == format) {
646         return true;
647     }
648 
649     if (glesMajorVersion < 3) {
650         switch (format) {
651             case GL_RED:
652                 switch (type) {
653                     case GL_UNSIGNED_BYTE:
654                         return internalformat == GL_R8;
655                     case GL_HALF_FLOAT:
656                     case GL_FLOAT:
657                         return internalformat == GL_R16F;
658                     case GL_BYTE:
659                         return internalformat == GL_R8_SNORM;
660                     default:
661                         return false;
662                 }
663                 break;
664             case GL_RG:
665                 switch (type) {
666                     case GL_UNSIGNED_BYTE:
667                         return internalformat == GL_RG8;
668                     case GL_HALF_FLOAT:
669                     case GL_FLOAT:
670                         return internalformat == GL_RG16F;
671                     default:
672                         return false;
673                 }
674                 break;
675             case GL_RGB:
676                 switch (type) {
677                     case GL_HALF_FLOAT:
678                     case GL_FLOAT:
679                         return internalformat == GL_RGB16F
680                             || internalformat == GL_R11F_G11F_B10F;
681                     case GL_UNSIGNED_INT_10F_11F_11F_REV:
682                         return internalformat == GL_R11F_G11F_B10F;
683                     default:
684                         return internalformat == GL_RGB8 ||
685                                internalformat == GL_RGB;
686                 }
687                 break;
688             case GL_RGBA:
689                 switch (type) {
690                     case GL_HALF_FLOAT:
691                     case GL_FLOAT:
692                         return internalformat == GL_RGBA16F;
693                     default:
694                         return internalformat == GL_RGBA8 ||
695                                internalformat == GL_RGBA;
696                 }
697                 break;
698         }
699     }
700 
701 #define VALIDATE_FORMAT_COMBINATION(x, y, z) \
702     if (internalformat == x && format == y && type == z) return true; \
703 
704     LIST_VALID_TEXFORMAT_COMBINATIONS(VALIDATE_FORMAT_COMBINATION)
705 
706     return false;
707 }
708 
isCompressedFormat(GLenum format)709 bool GLESv2Validate::isCompressedFormat(GLenum format) {
710     switch (format) {
711         case GL_ETC1_RGB8_OES:
712         case GL_COMPRESSED_R11_EAC:
713         case GL_COMPRESSED_SIGNED_R11_EAC:
714         case GL_COMPRESSED_RG11_EAC:
715         case GL_COMPRESSED_SIGNED_RG11_EAC:
716         case GL_COMPRESSED_RGB8_ETC2:
717         case GL_COMPRESSED_SRGB8_ETC2:
718         case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
719         case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
720         case GL_COMPRESSED_RGBA8_ETC2_EAC:
721         case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
722         case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
723         case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
724         case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
725         case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
726         case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
727         case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
728         case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
729         case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
730         case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
731         case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
732         case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
733         case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
734         case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
735         case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
736         case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
737         case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
738         case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
739         case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
740         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
741         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
742         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
743         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
744         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
745         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
746         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
747         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
748         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
749         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
750         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
751         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
752         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
753         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
754         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
755         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
756         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
757         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
758         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
759         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
760         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
761         case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
762             return true;
763     }
764     return false;
765 }
766 
getCompatibleFormatTypeForInternalFormat(GLenum internalformat,GLenum * format_out,GLenum * type_out)767 void GLESv2Validate::getCompatibleFormatTypeForInternalFormat(GLenum internalformat, GLenum* format_out, GLenum* type_out) {
768 #define RETURN_COMPATIBLE_FORMAT(x, y, z) \
769     if (internalformat == x) { \
770         *format_out = y; \
771         *type_out = z; \
772         return; \
773     } \
774 
775     LIST_VALID_TEXFORMAT_COMBINATIONS(RETURN_COMPATIBLE_FORMAT)
776 }
attribName(const GLchar * name)777 bool GLESv2Validate::attribName(const GLchar* name){
778     const GLchar* found = strstr(name,"gl_");
779     return (!found) ||
780            (found != name) ; // attrib name does not start with gl_
781 }
782 
attribIndex(int index,int max)783 bool GLESv2Validate::attribIndex(int index, int max){
784     return index >=0 && index < max;
785 }
786 
programParam(GLEScontext * ctx,GLenum pname)787 bool GLESv2Validate::programParam(GLEScontext* ctx, GLenum pname){
788     int glesMajorVersion = ctx->getMajorVersion();
789     int glesMinorVersion = ctx->getMinorVersion();
790     switch(pname){
791         case GL_DELETE_STATUS:
792         case GL_LINK_STATUS:
793         case GL_VALIDATE_STATUS:
794         case GL_INFO_LOG_LENGTH:
795         case GL_ATTACHED_SHADERS:
796         case GL_ACTIVE_ATTRIBUTES:
797         case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
798         case GL_ACTIVE_UNIFORMS:
799         case GL_ACTIVE_UNIFORM_MAX_LENGTH:
800             return true;
801         case GL_ACTIVE_UNIFORM_BLOCKS:
802         case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
803         case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
804         case GL_PROGRAM_BINARY_LENGTH:
805         case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
806         case GL_TRANSFORM_FEEDBACK_VARYINGS:
807         case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
808         case GL_PROGRAM_SEPARABLE:
809             return glesMajorVersion >= 3;
810         case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
811         case GL_COMPUTE_WORK_GROUP_SIZE:
812             return glesMajorVersion >= 3 && glesMinorVersion >= 1;
813     }
814     return false;
815 }
816 
textureIsCubeMap(GLenum target)817 bool GLESv2Validate::textureIsCubeMap(GLenum target){
818     switch(target){
819         case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
820         case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
821         case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
822         case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
823         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
824         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
825             return true;
826     }
827     return false;
828 }
829 
textureTargetEx(GLEScontext * ctx,GLenum textarget)830 bool GLESv2Validate::textureTargetEx(GLEScontext* ctx, GLenum textarget) {
831     int glesMajorVersion = ctx->getMajorVersion();
832     int glesMinorVersion = ctx->getMinorVersion();
833     switch (textarget) {
834     case GL_TEXTURE_2D_MULTISAMPLE:
835         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
836     default:
837         return GLESvalidate::textureTargetEx(textarget);
838     }
839 }
840 
sizeOfType(GLenum type)841 int GLESv2Validate::sizeOfType(GLenum type) {
842     size_t retval = 0;
843     switch(type) {
844     case GL_BYTE:
845     case GL_UNSIGNED_BYTE:
846         retval = 1;
847         break;
848     case GL_SHORT:
849     case GL_UNSIGNED_SHORT:
850     case GL_HALF_FLOAT:
851     case GL_HALF_FLOAT_OES:
852         retval = 2;
853         break;
854     case GL_UNSIGNED_INT:
855     case GL_INT:
856     case GL_FLOAT:
857     case GL_FIXED:
858     case GL_BOOL:
859         retval =  4;
860         break;
861 #ifdef GL_DOUBLE
862     case GL_DOUBLE:
863         retval = 8;
864         break;
865 #endif
866     case GL_FLOAT_VEC2:
867     case GL_INT_VEC2:
868     case GL_UNSIGNED_INT_VEC2:
869     case GL_BOOL_VEC2:
870         retval = 8;
871         break;
872     case GL_INT_VEC3:
873     case GL_UNSIGNED_INT_VEC3:
874     case GL_BOOL_VEC3:
875     case GL_FLOAT_VEC3:
876         retval = 12;
877         break;
878     case GL_FLOAT_VEC4:
879     case GL_BOOL_VEC4:
880     case GL_INT_VEC4:
881     case GL_UNSIGNED_INT_VEC4:
882     case GL_FLOAT_MAT2:
883         retval = 16;
884         break;
885     case GL_FLOAT_MAT3:
886         retval = 36;
887         break;
888     case GL_FLOAT_MAT4:
889         retval = 64;
890         break;
891     case GL_FLOAT_MAT2x3:
892     case GL_FLOAT_MAT3x2:
893         retval = 4 * 6;
894         break;
895     case GL_FLOAT_MAT2x4:
896     case GL_FLOAT_MAT4x2:
897         retval = 4 * 8;
898         break;
899     case GL_FLOAT_MAT3x4:
900     case GL_FLOAT_MAT4x3:
901         retval = 4 * 12;
902         break;
903     case GL_SAMPLER_2D:
904     case GL_SAMPLER_CUBE:
905         retval = 4;
906         break;
907     case GL_UNSIGNED_SHORT_4_4_4_4:
908 	case GL_UNSIGNED_SHORT_5_5_5_1:
909 	case GL_UNSIGNED_SHORT_5_6_5:
910 	case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
911 	case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
912         retval = 2;
913         break;
914 	case GL_INT_2_10_10_10_REV:
915 	case GL_UNSIGNED_INT_10F_11F_11F_REV:
916 	case GL_UNSIGNED_INT_5_9_9_9_REV:
917 	case GL_UNSIGNED_INT_2_10_10_10_REV:
918 	case GL_UNSIGNED_INT_24_8_OES:;
919         retval = 4;
920         break;
921 	case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
922 		retval = 4 + 4;
923         break;
924     default:
925         fprintf(stderr, "%s: WARNING: unknown type 0x%x. assuming 32 bits.\n", __FUNCTION__, type);
926         retval = 4;
927     }
928     return retval;
929 }
930 
931