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