• 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 "glUtils.h"
17 #include <string.h>
18 #include "ErrorLog.h"
19 #include <IOStream.h>
20 
21 #include <GLES3/gl31.h>
22 
isSamplerType(GLenum type)23 bool isSamplerType(GLenum type) {
24     switch (type) {
25         case GL_SAMPLER_2D:
26         case GL_SAMPLER_3D:
27         case GL_SAMPLER_CUBE:
28         case GL_SAMPLER_2D_SHADOW:
29         case GL_SAMPLER_2D_ARRAY:
30         case GL_SAMPLER_2D_ARRAY_SHADOW:
31         case GL_SAMPLER_2D_MULTISAMPLE:
32         case GL_SAMPLER_CUBE_SHADOW:
33         case GL_INT_SAMPLER_2D:
34         case GL_INT_SAMPLER_3D:
35         case GL_INT_SAMPLER_CUBE:
36         case GL_INT_SAMPLER_2D_ARRAY:
37         case GL_INT_SAMPLER_2D_MULTISAMPLE:
38         case GL_UNSIGNED_INT_SAMPLER_2D:
39         case GL_UNSIGNED_INT_SAMPLER_3D:
40         case GL_UNSIGNED_INT_SAMPLER_CUBE:
41         case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
42         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
43             return true;
44         default:
45             return false;
46     }
47 }
48 
isIntegerType(GLenum type)49 bool isIntegerType(GLenum type) {
50     switch (type) {
51         case GL_UNSIGNED_INT:
52         case GL_INT:
53         case GL_INT_VEC2:
54         case GL_UNSIGNED_INT_VEC2:
55         case GL_INT_VEC3:
56         case GL_UNSIGNED_INT_VEC3:
57         case GL_INT_VEC4:
58         case GL_UNSIGNED_INT_VEC4:
59         case GL_INT_IMAGE_2D:
60         case GL_INT_IMAGE_3D:
61         case GL_INT_IMAGE_CUBE:
62         case GL_INT_IMAGE_2D_ARRAY:
63         case GL_UNSIGNED_INT_IMAGE_2D:
64         case GL_UNSIGNED_INT_IMAGE_3D:
65         case GL_UNSIGNED_INT_IMAGE_CUBE:
66         case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
67         case GL_UNSIGNED_INT_ATOMIC_COUNTER:
68             return true;
69         default:
70             return false;
71     }
72 }
73 
isUnsignedIntType(GLenum type)74 bool isUnsignedIntType(GLenum type) {
75     switch (type) {
76         case GL_UNSIGNED_INT:
77         case GL_UNSIGNED_INT_VEC2:
78         case GL_UNSIGNED_INT_VEC3:
79         case GL_UNSIGNED_INT_VEC4:
80         case GL_UNSIGNED_INT_IMAGE_2D:
81         case GL_UNSIGNED_INT_IMAGE_3D:
82         case GL_UNSIGNED_INT_IMAGE_CUBE:
83         case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
84         case GL_UNSIGNED_INT_ATOMIC_COUNTER:
85             return true;
86         default:
87             return false;
88     }
89 }
90 
isBoolType(GLenum type)91 bool isBoolType(GLenum type) {
92     switch (type) {
93         case GL_BOOL:
94         case GL_BOOL_VEC2:
95         case GL_BOOL_VEC3:
96         case GL_BOOL_VEC4:
97             return true;
98         default:
99             return false;
100     }
101 }
102 
getColumnsOfType(GLenum type)103 uint32_t getColumnsOfType(GLenum type) {
104     switch (type) {
105     case GL_BYTE:
106     case GL_UNSIGNED_BYTE:
107     case GL_SHORT:
108     case GL_UNSIGNED_SHORT:
109     case GL_HALF_FLOAT:
110     case GL_HALF_FLOAT_OES:
111     case GL_IMAGE_2D:
112     case GL_IMAGE_3D:
113     case GL_UNSIGNED_INT:
114     case GL_INT:
115     case GL_FLOAT:
116     case GL_FIXED:
117     case GL_BOOL:
118         return 1;
119 #ifdef GL_DOUBLE
120     case GL_DOUBLE:
121         return 1;
122     case GL_DOUBLE_VEC2:
123     case GL_DOUBLE_MAT2:
124     case GL_DOUBLE_MAT2x3:
125     case GL_DOUBLE_MAT2x4:
126         return 2;
127     case GL_DOUBLE_VEC3:
128     case GL_DOUBLE_MAT3:
129     case GL_DOUBLE_MAT3x2:
130     case GL_DOUBLE_MAT3x4:
131         return 3;
132     case GL_DOUBLE_VEC4:
133     case GL_DOUBLE_MAT4:
134     case GL_DOUBLE_MAT4x2:
135     case GL_DOUBLE_MAT4x3:
136         return 4;
137 #endif
138     case GL_FLOAT_VEC2:
139     case GL_INT_VEC2:
140     case GL_UNSIGNED_INT_VEC2:
141     case GL_BOOL_VEC2:
142     case GL_FLOAT_MAT2:
143     case GL_FLOAT_MAT2x3:
144     case GL_FLOAT_MAT2x4:
145         return 2;
146     case GL_INT_VEC3:
147     case GL_UNSIGNED_INT_VEC3:
148     case GL_BOOL_VEC3:
149     case GL_FLOAT_VEC3:
150     case GL_FLOAT_MAT3:
151     case GL_FLOAT_MAT3x2:
152     case GL_FLOAT_MAT3x4:
153         return 3;
154     case GL_FLOAT_VEC4:
155     case GL_BOOL_VEC4:
156     case GL_INT_VEC4:
157     case GL_UNSIGNED_INT_VEC4:
158     case GL_FLOAT_MAT4:
159     case GL_FLOAT_MAT4x2:
160     case GL_FLOAT_MAT4x3:
161         return 4;
162     case GL_SAMPLER_2D:
163     case GL_SAMPLER_3D:
164     case GL_SAMPLER_CUBE:
165     case GL_SAMPLER_2D_SHADOW:
166     case GL_SAMPLER_2D_ARRAY:
167     case GL_SAMPLER_2D_ARRAY_SHADOW:
168     case GL_SAMPLER_2D_MULTISAMPLE:
169     case GL_SAMPLER_CUBE_SHADOW:
170     case GL_INT_SAMPLER_2D:
171     case GL_INT_SAMPLER_3D:
172     case GL_INT_SAMPLER_CUBE:
173     case GL_INT_SAMPLER_2D_ARRAY:
174     case GL_INT_SAMPLER_2D_MULTISAMPLE:
175     case GL_UNSIGNED_INT_SAMPLER_2D:
176     case GL_UNSIGNED_INT_SAMPLER_3D:
177     case GL_UNSIGNED_INT_SAMPLER_CUBE:
178     case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
179     case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
180     case GL_IMAGE_CUBE:
181     case GL_IMAGE_2D_ARRAY:
182     case GL_INT_IMAGE_2D:
183     case GL_INT_IMAGE_3D:
184     case GL_INT_IMAGE_CUBE:
185     case GL_INT_IMAGE_2D_ARRAY:
186     case GL_UNSIGNED_INT_IMAGE_2D:
187     case GL_UNSIGNED_INT_IMAGE_3D:
188     case GL_UNSIGNED_INT_IMAGE_CUBE:
189     case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
190     case GL_UNSIGNED_INT_ATOMIC_COUNTER:
191     default:
192         return 1;
193     }
194 }
195 
getRowsOfType(GLenum type)196 uint32_t getRowsOfType(GLenum type) {
197     switch (type) {
198     case GL_BYTE:
199     case GL_UNSIGNED_BYTE:
200     case GL_SHORT:
201     case GL_UNSIGNED_SHORT:
202     case GL_HALF_FLOAT:
203     case GL_HALF_FLOAT_OES:
204     case GL_IMAGE_2D:
205     case GL_IMAGE_3D:
206     case GL_UNSIGNED_INT:
207     case GL_INT:
208     case GL_FLOAT:
209     case GL_FIXED:
210     case GL_BOOL:
211         return 1;
212 #ifdef GL_DOUBLE
213     case GL_DOUBLE:
214     case GL_DOUBLE_VEC2:
215     case GL_DOUBLE_VEC3:
216     case GL_DOUBLE_VEC4:
217         return 1;
218     case GL_DOUBLE_MAT2:
219     case GL_DOUBLE_MAT3x2:
220     case GL_DOUBLE_MAT4x2:
221         return 2;
222     case GL_DOUBLE_MAT3:
223     case GL_DOUBLE_MAT2x3:
224     case GL_DOUBLE_MAT4x3:
225         return 3;
226     case GL_DOUBLE_MAT4:
227     case GL_DOUBLE_MAT3x4:
228     case GL_DOUBLE_MAT2x4:
229         return 4;
230 #endif
231     case GL_FLOAT_VEC2:
232     case GL_INT_VEC2:
233     case GL_UNSIGNED_INT_VEC2:
234     case GL_BOOL_VEC2:
235     case GL_INT_VEC3:
236     case GL_UNSIGNED_INT_VEC3:
237     case GL_BOOL_VEC3:
238     case GL_FLOAT_VEC3:
239     case GL_FLOAT_VEC4:
240     case GL_BOOL_VEC4:
241     case GL_INT_VEC4:
242     case GL_UNSIGNED_INT_VEC4:
243         return 1;
244     case GL_FLOAT_MAT2:
245     case GL_FLOAT_MAT3x2:
246     case GL_FLOAT_MAT4x2:
247         return 2;
248     case GL_FLOAT_MAT3:
249     case GL_FLOAT_MAT2x3:
250     case GL_FLOAT_MAT4x3:
251         return 3;
252     case GL_FLOAT_MAT4:
253     case GL_FLOAT_MAT2x4:
254     case GL_FLOAT_MAT3x4:
255         return 4;
256     case GL_SAMPLER_2D:
257     case GL_SAMPLER_3D:
258     case GL_SAMPLER_CUBE:
259     case GL_SAMPLER_2D_SHADOW:
260     case GL_SAMPLER_2D_ARRAY:
261     case GL_SAMPLER_2D_ARRAY_SHADOW:
262     case GL_SAMPLER_2D_MULTISAMPLE:
263     case GL_SAMPLER_CUBE_SHADOW:
264     case GL_INT_SAMPLER_2D:
265     case GL_INT_SAMPLER_3D:
266     case GL_INT_SAMPLER_CUBE:
267     case GL_INT_SAMPLER_2D_ARRAY:
268     case GL_INT_SAMPLER_2D_MULTISAMPLE:
269     case GL_UNSIGNED_INT_SAMPLER_2D:
270     case GL_UNSIGNED_INT_SAMPLER_3D:
271     case GL_UNSIGNED_INT_SAMPLER_CUBE:
272     case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
273     case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
274     case GL_IMAGE_CUBE:
275     case GL_IMAGE_2D_ARRAY:
276     case GL_INT_IMAGE_2D:
277     case GL_INT_IMAGE_3D:
278     case GL_INT_IMAGE_CUBE:
279     case GL_INT_IMAGE_2D_ARRAY:
280     case GL_UNSIGNED_INT_IMAGE_2D:
281     case GL_UNSIGNED_INT_IMAGE_3D:
282     case GL_UNSIGNED_INT_IMAGE_CUBE:
283     case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
284     case GL_UNSIGNED_INT_ATOMIC_COUNTER:
285     default:
286         return 1;
287     }
288 }
289 
getAttributeCountOfType(GLenum type)290 uint32_t getAttributeCountOfType(GLenum type) {
291     switch (type) {
292     case GL_BYTE:
293     case GL_UNSIGNED_BYTE:
294     case GL_SHORT:
295     case GL_UNSIGNED_SHORT:
296     case GL_HALF_FLOAT:
297     case GL_HALF_FLOAT_OES:
298     case GL_IMAGE_2D:
299     case GL_IMAGE_3D:
300     case GL_UNSIGNED_INT:
301     case GL_INT:
302     case GL_FLOAT:
303     case GL_FIXED:
304     case GL_BOOL:
305         return 1;
306 #ifdef GL_DOUBLE
307     case GL_DOUBLE:
308     case GL_DOUBLE_VEC2:
309     case GL_DOUBLE_VEC3:
310     case GL_DOUBLE_VEC4:
311         return 1;
312     case GL_DOUBLE_MAT2:
313     case GL_DOUBLE_MAT2x3:
314     case GL_DOUBLE_MAT2x4:
315         return 4;
316     case GL_DOUBLE_MAT3:
317     case GL_DOUBLE_MAT3x2:
318     case GL_DOUBLE_MAT3x4:
319         return 6;
320     case GL_DOUBLE_MAT4:
321     case GL_DOUBLE_MAT4x2:
322     case GL_DOUBLE_MAT4x3:
323         return 8;
324 #endif
325     case GL_FLOAT_VEC2:
326     case GL_INT_VEC2:
327     case GL_UNSIGNED_INT_VEC2:
328     case GL_BOOL_VEC2:
329     case GL_INT_VEC3:
330     case GL_UNSIGNED_INT_VEC3:
331     case GL_BOOL_VEC3:
332     case GL_FLOAT_VEC3:
333     case GL_FLOAT_VEC4:
334     case GL_BOOL_VEC4:
335     case GL_INT_VEC4:
336     case GL_UNSIGNED_INT_VEC4:
337         return 1;
338     case GL_FLOAT_MAT2:
339     case GL_FLOAT_MAT2x3:
340     case GL_FLOAT_MAT2x4:
341         return 2;
342     case GL_FLOAT_MAT3:
343     case GL_FLOAT_MAT3x2:
344     case GL_FLOAT_MAT3x4:
345         return 3;
346     case GL_FLOAT_MAT4:
347     case GL_FLOAT_MAT4x2:
348     case GL_FLOAT_MAT4x3:
349         return 4;
350     case GL_SAMPLER_2D:
351     case GL_SAMPLER_3D:
352     case GL_SAMPLER_CUBE:
353     case GL_SAMPLER_2D_SHADOW:
354     case GL_SAMPLER_2D_ARRAY:
355     case GL_SAMPLER_2D_ARRAY_SHADOW:
356     case GL_SAMPLER_2D_MULTISAMPLE:
357     case GL_SAMPLER_CUBE_SHADOW:
358     case GL_INT_SAMPLER_2D:
359     case GL_INT_SAMPLER_3D:
360     case GL_INT_SAMPLER_CUBE:
361     case GL_INT_SAMPLER_2D_ARRAY:
362     case GL_INT_SAMPLER_2D_MULTISAMPLE:
363     case GL_UNSIGNED_INT_SAMPLER_2D:
364     case GL_UNSIGNED_INT_SAMPLER_3D:
365     case GL_UNSIGNED_INT_SAMPLER_CUBE:
366     case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
367     case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
368     case GL_IMAGE_CUBE:
369     case GL_IMAGE_2D_ARRAY:
370     case GL_INT_IMAGE_2D:
371     case GL_INT_IMAGE_3D:
372     case GL_INT_IMAGE_CUBE:
373     case GL_INT_IMAGE_2D_ARRAY:
374     case GL_UNSIGNED_INT_IMAGE_2D:
375     case GL_UNSIGNED_INT_IMAGE_3D:
376     case GL_UNSIGNED_INT_IMAGE_CUBE:
377     case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
378     case GL_UNSIGNED_INT_ATOMIC_COUNTER:
379     default:
380         return 1;
381     }
382 }
383 
glSizeof(GLenum type)384 size_t glSizeof(GLenum type)
385 {
386     size_t retval = 0;
387     switch(type) {
388     case GL_BYTE:
389     case GL_UNSIGNED_BYTE:
390         retval = 1;
391         break;
392     case GL_SHORT:
393     case GL_UNSIGNED_SHORT:
394     case GL_HALF_FLOAT:
395     case GL_HALF_FLOAT_OES:
396         retval = 2;
397         break;
398     case GL_IMAGE_2D:
399     case GL_IMAGE_3D:
400     case GL_UNSIGNED_INT:
401     case GL_INT:
402     case GL_FLOAT:
403     case GL_FIXED:
404     case GL_BOOL:
405         retval =  4;
406         break;
407 #ifdef GL_DOUBLE
408     case GL_DOUBLE:
409         retval = 8;
410         break;
411     case GL_DOUBLE_VEC2:
412         retval = 16;
413         break;
414     case GL_DOUBLE_VEC3:
415         retval = 24;
416         break;
417     case GL_DOUBLE_VEC4:
418         retval = 32;
419         break;
420     case GL_DOUBLE_MAT2:
421         retval = 8 * 4;
422         break;
423     case GL_DOUBLE_MAT3:
424         retval = 8 * 9;
425         break;
426     case GL_DOUBLE_MAT4:
427         retval = 8 * 16;
428         break;
429     case GL_DOUBLE_MAT2x3:
430     case GL_DOUBLE_MAT3x2:
431         retval = 8 * 6;
432         break;
433     case GL_DOUBLE_MAT2x4:
434     case GL_DOUBLE_MAT4x2:
435         retval = 8 * 8;
436         break;
437     case GL_DOUBLE_MAT3x4:
438     case GL_DOUBLE_MAT4x3:
439         retval = 8 * 12;
440         break;
441 #endif
442     case GL_FLOAT_VEC2:
443     case GL_INT_VEC2:
444     case GL_UNSIGNED_INT_VEC2:
445     case GL_BOOL_VEC2:
446         retval = 8;
447         break;
448     case GL_INT_VEC3:
449     case GL_UNSIGNED_INT_VEC3:
450     case GL_BOOL_VEC3:
451     case GL_FLOAT_VEC3:
452         retval = 12;
453         break;
454     case GL_FLOAT_VEC4:
455     case GL_BOOL_VEC4:
456     case GL_INT_VEC4:
457     case GL_UNSIGNED_INT_VEC4:
458     case GL_FLOAT_MAT2:
459         retval = 16;
460         break;
461     case GL_FLOAT_MAT3:
462         retval = 36;
463         break;
464     case GL_FLOAT_MAT4:
465         retval = 64;
466         break;
467     case GL_FLOAT_MAT2x3:
468     case GL_FLOAT_MAT3x2:
469         retval = 4 * 6;
470         break;
471     case GL_FLOAT_MAT2x4:
472     case GL_FLOAT_MAT4x2:
473         retval = 4 * 8;
474         break;
475     case GL_FLOAT_MAT3x4:
476     case GL_FLOAT_MAT4x3:
477         retval = 4 * 12;
478         break;
479     case GL_SAMPLER_2D:
480     case GL_SAMPLER_3D:
481     case GL_SAMPLER_CUBE:
482     case GL_SAMPLER_2D_SHADOW:
483     case GL_SAMPLER_2D_ARRAY:
484     case GL_SAMPLER_2D_ARRAY_SHADOW:
485     case GL_SAMPLER_2D_MULTISAMPLE:
486     case GL_SAMPLER_CUBE_SHADOW:
487     case GL_INT_SAMPLER_2D:
488     case GL_INT_SAMPLER_3D:
489     case GL_INT_SAMPLER_CUBE:
490     case GL_INT_SAMPLER_2D_ARRAY:
491     case GL_INT_SAMPLER_2D_MULTISAMPLE:
492     case GL_UNSIGNED_INT_SAMPLER_2D:
493     case GL_UNSIGNED_INT_SAMPLER_3D:
494     case GL_UNSIGNED_INT_SAMPLER_CUBE:
495     case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
496     case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
497     case GL_IMAGE_CUBE:
498     case GL_IMAGE_2D_ARRAY:
499     case GL_INT_IMAGE_2D:
500     case GL_INT_IMAGE_3D:
501     case GL_INT_IMAGE_CUBE:
502     case GL_INT_IMAGE_2D_ARRAY:
503     case GL_UNSIGNED_INT_IMAGE_2D:
504     case GL_UNSIGNED_INT_IMAGE_3D:
505     case GL_UNSIGNED_INT_IMAGE_CUBE:
506     case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
507     case GL_UNSIGNED_INT_ATOMIC_COUNTER:
508         retval = 4;
509         break;
510     case GL_UNSIGNED_SHORT_4_4_4_4:
511 	case GL_UNSIGNED_SHORT_5_5_5_1:
512 	case GL_UNSIGNED_SHORT_5_6_5:
513 	case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
514 	case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
515         retval = 2;
516         break;
517 	case GL_INT_2_10_10_10_REV:
518 	case GL_UNSIGNED_INT_10F_11F_11F_REV:
519 	case GL_UNSIGNED_INT_5_9_9_9_REV:
520 	case GL_UNSIGNED_INT_2_10_10_10_REV:
521 	case GL_UNSIGNED_INT_24_8_OES:;
522         retval = 4;
523         break;
524 	case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
525 		retval = 4 + 4;
526         break;
527     default:
528         ALOGE("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
529         retval = 4;
530     }
531     return retval;
532 
533 }
534 
glUtilsParamSize(GLenum param)535 size_t glUtilsParamSize(GLenum param)
536 {
537     size_t s = 0;
538 
539     switch(param)
540     {
541     case GL_DEPTH_TEST:
542     case GL_DEPTH_FUNC:
543     case GL_DEPTH_BITS:
544     case GL_MAX_CLIP_PLANES:
545     case GL_MAX_COLOR_ATTACHMENTS:
546     case GL_MAX_DRAW_BUFFERS:
547     case GL_GREEN_BITS:
548     case GL_MAX_MODELVIEW_STACK_DEPTH:
549     case GL_MAX_PROJECTION_STACK_DEPTH:
550     case GL_MAX_TEXTURE_STACK_DEPTH:
551     case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
552     case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
553     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
554     case GL_MAX_TEXTURE_SIZE:
555     case GL_TEXTURE_GEN_MODE_OES:
556     case GL_TEXTURE_ENV_MODE:
557     case GL_FOG_MODE:
558     case GL_FOG_DENSITY:
559     case GL_FOG_START:
560     case GL_FOG_END:
561     case GL_SPOT_EXPONENT:
562     case GL_CONSTANT_ATTENUATION:
563     case GL_LINEAR_ATTENUATION:
564     case GL_QUADRATIC_ATTENUATION:
565     case GL_SHININESS:
566     case GL_LIGHT_MODEL_TWO_SIDE:
567     case GL_POINT_SIZE:
568     case GL_POINT_SIZE_MIN:
569     case GL_POINT_SIZE_MAX:
570     case GL_POINT_FADE_THRESHOLD_SIZE:
571     case GL_CULL_FACE:
572     case GL_CULL_FACE_MODE:
573     case GL_FRONT_FACE:
574     case GL_SHADE_MODEL:
575     case GL_DEPTH_WRITEMASK:
576     case GL_DEPTH_CLEAR_VALUE:
577     case GL_STENCIL_FAIL:
578     case GL_STENCIL_PASS_DEPTH_FAIL:
579     case GL_STENCIL_PASS_DEPTH_PASS:
580     case GL_STENCIL_REF:
581     case GL_STENCIL_WRITEMASK:
582     case GL_MATRIX_MODE:
583     case GL_MODELVIEW_STACK_DEPTH:
584     case GL_PROJECTION_STACK_DEPTH:
585     case GL_TEXTURE_STACK_DEPTH:
586     case GL_ALPHA_TEST_FUNC:
587     case GL_ALPHA_TEST_REF:
588     case GL_ALPHA_TEST:
589     case GL_DITHER:
590     case GL_BLEND_DST:
591     case GL_BLEND_SRC:
592     case GL_BLEND:
593     case GL_LOGIC_OP_MODE:
594     case GL_SCISSOR_TEST:
595     case GL_MAX_TEXTURE_UNITS:
596     case GL_ACTIVE_TEXTURE:
597     case GL_ALPHA_BITS:
598     case GL_ARRAY_BUFFER_BINDING:
599     case GL_BLUE_BITS:
600     case GL_CLIENT_ACTIVE_TEXTURE:
601     case GL_CLIP_PLANE0:
602     case GL_CLIP_PLANE1:
603     case GL_CLIP_PLANE2:
604     case GL_CLIP_PLANE3:
605     case GL_CLIP_PLANE4:
606     case GL_CLIP_PLANE5:
607     case GL_COLOR_ARRAY:
608     case GL_COLOR_ARRAY_BUFFER_BINDING:
609     case GL_COLOR_ARRAY_SIZE:
610     case GL_COLOR_ARRAY_STRIDE:
611     case GL_COLOR_ARRAY_TYPE:
612     case GL_COLOR_LOGIC_OP:
613     case GL_COLOR_MATERIAL:
614     case GL_PACK_ALIGNMENT:
615     case GL_PERSPECTIVE_CORRECTION_HINT:
616     case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
617     case GL_POINT_SIZE_ARRAY_STRIDE_OES:
618     case GL_POINT_SIZE_ARRAY_TYPE_OES:
619     case GL_POINT_SMOOTH:
620     case GL_POINT_SMOOTH_HINT:
621     case GL_POINT_SPRITE_OES:
622     case GL_COORD_REPLACE_OES:
623     case GL_COMBINE_ALPHA:
624     case GL_SRC0_RGB:
625     case GL_SRC1_RGB:
626     case GL_SRC2_RGB:
627     case GL_OPERAND0_RGB:
628     case GL_OPERAND1_RGB:
629     case GL_OPERAND2_RGB:
630     case GL_SRC0_ALPHA:
631     case GL_SRC1_ALPHA:
632     case GL_SRC2_ALPHA:
633     case GL_OPERAND0_ALPHA:
634     case GL_OPERAND1_ALPHA:
635     case GL_OPERAND2_ALPHA:
636     case GL_RGB_SCALE:
637     case GL_ALPHA_SCALE:
638     case GL_COMBINE_RGB:
639     case GL_POLYGON_OFFSET_FACTOR:
640     case GL_POLYGON_OFFSET_FILL:
641     case GL_POLYGON_OFFSET_UNITS:
642     case GL_RED_BITS:
643     case GL_RESCALE_NORMAL:
644     case GL_SAMPLE_ALPHA_TO_COVERAGE:
645     case GL_SAMPLE_ALPHA_TO_ONE:
646     case GL_SAMPLE_BUFFERS:
647     case GL_SAMPLE_COVERAGE:
648     case GL_SAMPLE_COVERAGE_INVERT:
649     case GL_SAMPLE_COVERAGE_VALUE:
650     case GL_SAMPLES:
651     case GL_MAX_SAMPLES_EXT:
652     case GL_STENCIL_BITS:
653     case GL_STENCIL_CLEAR_VALUE:
654     case GL_STENCIL_FUNC:
655     case GL_STENCIL_TEST:
656     case GL_STENCIL_VALUE_MASK:
657     case GL_STENCIL_BACK_FUNC:
658     case GL_STENCIL_BACK_VALUE_MASK:
659     case GL_STENCIL_BACK_REF:
660     case GL_STENCIL_BACK_FAIL:
661     case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
662     case GL_STENCIL_BACK_PASS_DEPTH_PASS:
663     case GL_STENCIL_BACK_WRITEMASK:
664     case GL_TEXTURE_2D:
665     case GL_TEXTURE_BASE_LEVEL:
666     case GL_TEXTURE_BINDING_2D:
667     case GL_TEXTURE_BINDING_CUBE_MAP:
668     case GL_TEXTURE_BINDING_EXTERNAL_OES:
669     case GL_TEXTURE_COMPARE_FUNC:
670     case GL_TEXTURE_COMPARE_MODE:
671     case GL_TEXTURE_COORD_ARRAY:
672     case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
673     case GL_TEXTURE_COORD_ARRAY_SIZE:
674     case GL_TEXTURE_COORD_ARRAY_STRIDE:
675     case GL_TEXTURE_COORD_ARRAY_TYPE:
676     case GL_TEXTURE_IMMUTABLE_FORMAT:
677     case GL_UNPACK_ALIGNMENT:
678     case GL_VERTEX_ARRAY:
679     case GL_VERTEX_ARRAY_BUFFER_BINDING:
680     case GL_VERTEX_ARRAY_SIZE:
681     case GL_VERTEX_ARRAY_STRIDE:
682     case GL_VERTEX_ARRAY_TYPE:
683     case GL_SPOT_CUTOFF:
684     case GL_TEXTURE_MIN_FILTER:
685     case GL_TEXTURE_MAG_FILTER:
686     case GL_TEXTURE_MAX_LOD:
687     case GL_TEXTURE_MIN_LOD:
688     case GL_TEXTURE_WRAP_S:
689     case GL_TEXTURE_WRAP_T:
690     case GL_TEXTURE_WRAP_R:
691     case GL_TEXTURE_SWIZZLE_R:
692     case GL_TEXTURE_SWIZZLE_G:
693     case GL_TEXTURE_SWIZZLE_B:
694     case GL_TEXTURE_SWIZZLE_A:
695     case GL_GENERATE_MIPMAP:
696     case GL_GENERATE_MIPMAP_HINT:
697     case GL_RENDERBUFFER_WIDTH_OES:
698     case GL_RENDERBUFFER_HEIGHT_OES:
699     case GL_RENDERBUFFER_INTERNAL_FORMAT_OES:
700     case GL_RENDERBUFFER_RED_SIZE_OES:
701     case GL_RENDERBUFFER_GREEN_SIZE_OES:
702     case GL_RENDERBUFFER_BLUE_SIZE_OES:
703     case GL_RENDERBUFFER_ALPHA_SIZE_OES:
704     case GL_RENDERBUFFER_DEPTH_SIZE_OES:
705     case GL_RENDERBUFFER_STENCIL_SIZE_OES:
706     case GL_RENDERBUFFER_BINDING:
707     case GL_FRAMEBUFFER_BINDING:
708     case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES:
709     case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES:
710     case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES:
711     case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES:
712     case GL_FENCE_STATUS_NV:
713     case GL_FENCE_CONDITION_NV:
714     case GL_TEXTURE_WIDTH_QCOM:
715     case GL_TEXTURE_HEIGHT_QCOM:
716     case GL_TEXTURE_DEPTH_QCOM:
717     case GL_TEXTURE_INTERNAL_FORMAT_QCOM:
718     case GL_TEXTURE_FORMAT_QCOM:
719     case GL_TEXTURE_TYPE_QCOM:
720     case GL_TEXTURE_IMAGE_VALID_QCOM:
721     case GL_TEXTURE_NUM_LEVELS_QCOM:
722     case GL_TEXTURE_TARGET_QCOM:
723     case GL_TEXTURE_OBJECT_VALID_QCOM:
724     case GL_BLEND_EQUATION_RGB_OES:
725     case GL_BLEND_EQUATION_ALPHA_OES:
726     case GL_BLEND_DST_RGB_OES:
727     case GL_BLEND_SRC_RGB_OES:
728     case GL_BLEND_DST_ALPHA_OES:
729     case GL_BLEND_SRC_ALPHA_OES:
730     case GL_MAX_LIGHTS:
731     case GL_SHADER_TYPE:
732     case GL_COMPILE_STATUS:
733     case GL_SHADER_SOURCE_LENGTH:
734     case GL_CURRENT_PROGRAM:
735     case GL_SUBPIXEL_BITS:
736     case GL_MAX_3D_TEXTURE_SIZE:
737     case GL_MAX_ARRAY_TEXTURE_LAYERS:
738     case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
739     case GL_NUM_SHADER_BINARY_FORMATS:
740     case GL_SHADER_COMPILER:
741     case GL_MAX_VERTEX_ATTRIBS:
742     case GL_MAX_VERTEX_UNIFORM_VECTORS:
743     case GL_MAX_VARYING_VECTORS:
744     case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
745     case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
746     case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
747     case GL_MAX_RENDERBUFFER_SIZE:
748     case GL_MAX_TEXTURE_IMAGE_UNITS:
749     case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
750     case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
751     case GL_LINE_WIDTH:
752     case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
753     case GL_MAX_UNIFORM_BUFFER_BINDINGS:
754     case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
755     case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
756     case GL_UNIFORM_BLOCK_BINDING:
757     case GL_UNIFORM_BLOCK_DATA_SIZE:
758     case GL_UNIFORM_BLOCK_NAME_LENGTH:
759     case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
760     case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
761     case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
762     case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
763     case GL_CURRENT_QUERY:
764     case GL_QUERY_RESULT:
765     case GL_QUERY_RESULT_AVAILABLE:
766     case GL_READ_BUFFER:
767     case GL_NUM_PROGRAM_BINARY_FORMATS:
768     case GL_PROGRAM_BINARY_FORMATS:
769 
770     case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
771     case GL_ACTIVE_ATTRIBUTES:
772     case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
773     case GL_ACTIVE_UNIFORM_BLOCKS:
774     case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
775     case GL_ACTIVE_UNIFORMS:
776     case GL_ACTIVE_UNIFORM_MAX_LENGTH:
777     case GL_ATTACHED_SHADERS:
778     case GL_DELETE_STATUS:
779     case GL_INFO_LOG_LENGTH:
780     case GL_LINK_STATUS:
781     case GL_PROGRAM_BINARY_LENGTH:
782     case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
783     case GL_PROGRAM_SEPARABLE:
784     case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
785     case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
786     case GL_TRANSFORM_FEEDBACK_VARYINGS:
787     case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
788     case GL_TRANSFORM_FEEDBACK_ACTIVE:
789 #define GL_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
790 #define GL_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
791     case GL_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
792     case GL_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
793     case GL_VALIDATE_STATUS:
794         s = 1;
795         break;
796     case GL_ALIASED_LINE_WIDTH_RANGE:
797     case GL_ALIASED_POINT_SIZE_RANGE:
798     case GL_DEPTH_RANGE:
799     case GL_MAX_VIEWPORT_DIMS:
800     case GL_SMOOTH_POINT_SIZE_RANGE:
801     case GL_SMOOTH_LINE_WIDTH_RANGE:
802     case GL_SAMPLE_POSITION:
803         s= 2;
804         break;
805     case GL_SPOT_DIRECTION:
806     case GL_POINT_DISTANCE_ATTENUATION:
807     case GL_CURRENT_NORMAL:
808     case GL_COMPUTE_WORK_GROUP_SIZE:
809         s =  3;
810         break;
811     case GL_CURRENT_VERTEX_ATTRIB:
812     case GL_CURRENT_TEXTURE_COORDS:
813     case GL_CURRENT_COLOR:
814     case GL_FOG_COLOR:
815     case GL_AMBIENT:
816     case GL_DIFFUSE:
817     case GL_SPECULAR:
818     case GL_EMISSION:
819     case GL_POSITION:
820     case GL_LIGHT_MODEL_AMBIENT:
821     case GL_TEXTURE_ENV_COLOR:
822     case GL_SCISSOR_BOX:
823     case GL_VIEWPORT:
824     case GL_TEXTURE_CROP_RECT_OES:
825     case GL_COLOR_CLEAR_VALUE:
826     case GL_COLOR_WRITEMASK:
827     case GL_AMBIENT_AND_DIFFUSE:
828     case GL_BLEND_COLOR:
829         s =  4;
830         break;
831     case GL_MODELVIEW_MATRIX:
832     case GL_PROJECTION_MATRIX:
833     case GL_TEXTURE_MATRIX:
834         s = 16;
835     break;
836     default:
837         s = 1; // assume 1 for everything else
838     }
839     return s;
840 }
841 
glUtilsPackPointerData(unsigned char * dst,unsigned char * src,int size,GLenum type,unsigned int stride,unsigned int datalen)842 void glUtilsPackPointerData(unsigned char *dst, unsigned char *src,
843                      int size, GLenum type, unsigned int stride,
844                      unsigned int datalen)
845 {
846     unsigned int  vsize = size * glSizeof(type);
847     switch (type) {
848     case GL_INT_2_10_10_10_REV:
849     case GL_UNSIGNED_INT_2_10_10_10_REV:
850         vsize = vsize / 4;
851         break;
852     default:
853         break;
854     }
855 
856     if (stride == 0) stride = vsize;
857 
858     if (stride == vsize) {
859         memcpy(dst, src, datalen);
860     } else {
861         for (unsigned int i = 0; i < datalen; i += vsize) {
862             memcpy(dst, src, vsize);
863             dst += vsize;
864             src += stride;
865         }
866     }
867 }
868 
glUtilsWritePackPointerData(void * _stream,unsigned char * src,int size,GLenum type,unsigned int stride,unsigned int datalen)869 void glUtilsWritePackPointerData(void* _stream, unsigned char *src,
870                                  int size, GLenum type, unsigned int stride,
871                                  unsigned int datalen)
872 {
873     IOStream* stream = reinterpret_cast<IOStream*>(_stream);
874 
875     unsigned int  vsize = size * glSizeof(type);
876     if (stride == 0) stride = vsize;
877 
878     if (stride == vsize) {
879         stream->writeFully(src, datalen);
880     } else {
881         for (unsigned int i = 0; i < datalen; i += vsize) {
882             stream->writeFully(src, (size_t)vsize);
883             src += stride;
884         }
885     }
886 }
887 
888 #ifndef GL_RGBA16F
889 #define GL_RGBA16F                        0x881A
890 #endif // GL_RGBA16F
891 
glUtilsPixelBitSize(GLenum format,GLenum type)892 int glUtilsPixelBitSize(GLenum format, GLenum type)
893 {
894     int components = 0;
895     int componentsize = 0;
896     int pixelsize = 0;
897     switch(type) {
898     case GL_BYTE:
899     case GL_UNSIGNED_BYTE:
900         componentsize = 8;
901         break;
902     case GL_SHORT:
903     case GL_HALF_FLOAT:
904     case GL_UNSIGNED_SHORT:
905         componentsize = 16;
906         break;
907     case GL_INT:
908     case GL_UNSIGNED_INT:
909     case GL_FLOAT:
910     case GL_FIXED:
911         componentsize = 32;
912         break;
913     case GL_UNSIGNED_SHORT_5_6_5:
914     case GL_UNSIGNED_SHORT_4_4_4_4:
915     case GL_UNSIGNED_SHORT_5_5_5_1:
916     case GL_RGB565_OES:
917     case GL_RGB5_A1_OES:
918     case GL_RGBA4_OES:
919         pixelsize = 16;
920         break;
921     case GL_UNSIGNED_INT_2_10_10_10_REV:
922     case GL_UNSIGNED_INT_24_8_OES:
923         pixelsize = 32;
924         break;
925     default:
926         ERR("glUtilsPixelBitSize: unknown pixel type %d - assuming pixel data 0\n", type);
927         componentsize = 0;
928     }
929 
930     if (pixelsize == 0) {
931         switch(format) {
932 #if 0
933         case GL_RED:
934         case GL_GREEN:
935         case GL_BLUE:
936 #endif
937         case GL_ALPHA:
938         case GL_LUMINANCE:
939         case GL_DEPTH_COMPONENT:
940         case GL_DEPTH_STENCIL_OES:
941             components = 1;
942             break;
943         case GL_LUMINANCE_ALPHA:
944             components = 2;
945             break;
946         case GL_RGB:
947 #if 0
948         case GL_BGR:
949 #endif
950             components = 3;
951             break;
952         case GL_RGBA:
953         case GL_BGRA_EXT:
954             components = 4;
955             break;
956         case GL_RGBA16F:
957             pixelsize = 64;
958             break;
959         default:
960             ERR("glUtilsPixelBitSize: unknown pixel format %d\n", format);
961             components = 0;
962         }
963         if (pixelsize == 0) {
964             pixelsize = components * componentsize;
965         }
966     }
967 
968     return pixelsize;
969 }
970 
971 // pack a list of strings into one.
glUtilsPackStrings(char * ptr,char ** strings,GLint * length,GLsizei count)972 void glUtilsPackStrings(char *ptr,  char **strings,  GLint *length, GLsizei count)
973 {
974     char *p = ptr;
975     *p = '\0';
976     for (int i = 0; i < count; i++) {
977         int l=0;
978         if (strings[i]!=NULL) {
979             if (length == NULL || length[i] < 0) {
980                 l = strlen(strings[i]);
981                 strcat(p, strings[i]);
982             } else {
983                 l = length[i];
984                 strncat(p, strings[i], l);
985             }
986         }
987         p += l;
988     }
989 }
990 
991 // claculate the length of a list of strings
glUtilsCalcShaderSourceLen(char ** strings,GLint * length,GLsizei count)992 int glUtilsCalcShaderSourceLen( char **strings,  GLint *length, GLsizei count)
993 {
994     int len = 0;
995     for (int i = 0; i < count; i++) {
996         int l;
997         if (length == NULL || length[i] < 0) {
998             l = strings[i]!=NULL ? strlen(strings[i]) : 0;
999         } else {
1000             l = length[i];
1001         }
1002         len += l;
1003     }
1004     return len;
1005 
1006 }
1007 
1008 // helper to get GL_COLOR_ATTACHMENTn names
glUtilsColorAttachmentName(int i)1009 GLenum glUtilsColorAttachmentName(int i) {
1010 #undef COLOR_ATTACHMENT_CASE
1011 #define COLOR_ATTACHMENT_CASE(i) \
1012     case i: \
1013         return GL_COLOR_ATTACHMENT##i; \
1014 
1015     switch (i) {
1016         COLOR_ATTACHMENT_CASE(0)
1017         COLOR_ATTACHMENT_CASE(1)
1018         COLOR_ATTACHMENT_CASE(2)
1019         COLOR_ATTACHMENT_CASE(3)
1020         COLOR_ATTACHMENT_CASE(4)
1021         COLOR_ATTACHMENT_CASE(5)
1022         COLOR_ATTACHMENT_CASE(6)
1023         COLOR_ATTACHMENT_CASE(7)
1024         COLOR_ATTACHMENT_CASE(8)
1025         COLOR_ATTACHMENT_CASE(9)
1026         COLOR_ATTACHMENT_CASE(10)
1027         COLOR_ATTACHMENT_CASE(11)
1028         COLOR_ATTACHMENT_CASE(12)
1029         COLOR_ATTACHMENT_CASE(13)
1030         COLOR_ATTACHMENT_CASE(14)
1031         COLOR_ATTACHMENT_CASE(15)
1032     }
1033     return GL_NONE;
1034 #undef COLOR_ATTACHMENT_CASE
1035 }
1036 
glUtilsColorAttachmentIndex(GLenum attachment)1037 int glUtilsColorAttachmentIndex(GLenum attachment) {
1038 #undef COLOR_ATTACHMENT_CASE
1039 #define COLOR_ATTACHMENT_CASE(i) \
1040     case GL_COLOR_ATTACHMENT##i: \
1041         return i; \
1042 
1043     switch (attachment) {
1044         COLOR_ATTACHMENT_CASE(0)
1045         COLOR_ATTACHMENT_CASE(1)
1046         COLOR_ATTACHMENT_CASE(2)
1047         COLOR_ATTACHMENT_CASE(3)
1048         COLOR_ATTACHMENT_CASE(4)
1049         COLOR_ATTACHMENT_CASE(5)
1050         COLOR_ATTACHMENT_CASE(6)
1051         COLOR_ATTACHMENT_CASE(7)
1052         COLOR_ATTACHMENT_CASE(8)
1053         COLOR_ATTACHMENT_CASE(9)
1054         COLOR_ATTACHMENT_CASE(10)
1055         COLOR_ATTACHMENT_CASE(11)
1056         COLOR_ATTACHMENT_CASE(12)
1057         COLOR_ATTACHMENT_CASE(13)
1058         COLOR_ATTACHMENT_CASE(14)
1059         COLOR_ATTACHMENT_CASE(15)
1060     }
1061     return -1;
1062 #undef COLOR_ATTACHMENT_CASE
1063 }
1064 
1065 struct glUtilsDrawArraysIndirectCommand {
1066     GLuint count;
1067     GLuint primCount;
1068     GLuint first;
1069     GLuint reserved;
1070 };
1071 
1072 struct glUtilsDrawElementsIndirectCommand {
1073     GLuint count;
1074     GLuint primCount;
1075     GLuint first;
1076     GLint baseVertex;
1077     GLuint reserved;
1078 };
1079 
glUtilsIndirectStructSize(IndirectCommandType cmdType)1080 GLuint glUtilsIndirectStructSize(IndirectCommandType cmdType) {
1081     switch (cmdType) {
1082     case INDIRECT_COMMAND_DRAWARRAYS:
1083         return sizeof(glUtilsDrawArraysIndirectCommand);
1084     case INDIRECT_COMMAND_DRAWELEMENTS:
1085         return sizeof(glUtilsDrawElementsIndirectCommand);
1086     }
1087     return 4;
1088 }
1089 
colorRenderableFormat(GLint internalformat,GLenum texturetype,int majorVersion,int minorVersion,bool hasColorBufferFloatExtension,bool hasColorBufferHalfFloatExtension)1090 bool colorRenderableFormat(GLint internalformat, GLenum texturetype, int majorVersion, int minorVersion, bool hasColorBufferFloatExtension, bool hasColorBufferHalfFloatExtension) {
1091     switch (internalformat) {
1092         case GL_RGB:
1093         case GL_RGBA:
1094         case GL_BGRA_EXT:
1095             switch (texturetype) {
1096                 case GL_FLOAT:
1097                 case GL_HALF_FLOAT_OES:
1098                 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1099                 case GL_UNSIGNED_INT_2_10_10_10_REV:
1100                     return false;
1101                 default:
1102                     return true;
1103             }
1104             break;
1105         case GL_R8:
1106         case GL_RG8:
1107         case GL_RGB8:
1108         case GL_RGB565:
1109         case GL_RGBA4:
1110         case GL_RGB5_A1:
1111         case GL_RGBA8:
1112         case GL_RGB10_A2:
1113         case GL_RGB10_A2UI:
1114         case GL_SRGB8_ALPHA8:
1115         case GL_R8I:
1116         case GL_R8UI:
1117         case GL_R16I:
1118         case GL_R16UI:
1119         case GL_R32I:
1120         case GL_R32UI:
1121         case GL_RG8I:
1122         case GL_RG8UI:
1123         case GL_RG16I:
1124         case GL_RG16UI:
1125         case GL_RG32I:
1126         case GL_RG32UI:
1127         case GL_RGBA8I:
1128         case GL_RGBA8UI:
1129         case GL_RGBA16I:
1130         case GL_RGBA16UI:
1131         case GL_RGBA32I:
1132         case GL_RGBA32UI:
1133         case GL_BGRA8_EXT:
1134             return true;
1135         case GL_R16F:
1136         case GL_RG16F:
1137         case GL_RGBA16F:
1138         case GL_R32F:
1139         case GL_RG32F:
1140         case GL_RGBA32F:
1141         case GL_R11F_G11F_B10F:
1142             return majorVersion >= 3 && hasColorBufferFloatExtension;
1143         case GL_RGB16F:
1144             return majorVersion >= 3 && hasColorBufferHalfFloatExtension;
1145         default:
1146             return false;
1147     }
1148 }
1149 
depthRenderableFormat(GLint internalformat)1150 bool depthRenderableFormat(GLint internalformat) {
1151     switch (internalformat) {
1152         case GL_DEPTH_STENCIL:
1153         case GL_DEPTH_COMPONENT:
1154         case GL_DEPTH_COMPONENT16:
1155         case GL_DEPTH_COMPONENT24:
1156         case GL_DEPTH_COMPONENT32F:
1157         case GL_DEPTH24_STENCIL8:
1158         case GL_DEPTH32F_STENCIL8:
1159         case 0X81A7: // GL_DEPTH_COMPONENT32
1160             return true;
1161         default:
1162             return false;
1163     }
1164 }
1165 
stencilRenderableFormat(GLint internalformat)1166 bool stencilRenderableFormat(GLint internalformat) {
1167     switch (internalformat) {
1168         case GL_STENCIL_INDEX:
1169         case GL_DEPTH_STENCIL:
1170         case GL_STENCIL_INDEX8:
1171         case GL_DEPTH24_STENCIL8:
1172         case GL_DEPTH32F_STENCIL8:
1173             return true;
1174         default:
1175             return false;
1176     }
1177 }
1178