glUtils.cpp revision d3ae106098bc2338151971247dd182e7b88a5b0e
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
23size_t glSizeof(GLenum type)
24{
25    size_t retval = 0;
26    switch(type) {
27    case GL_BYTE:
28    case GL_UNSIGNED_BYTE:
29        retval = 1;
30        break;
31    case GL_SHORT:
32    case GL_UNSIGNED_SHORT:
33    case GL_HALF_FLOAT:
34    case GL_HALF_FLOAT_OES:
35        retval = 2;
36        break;
37    case GL_IMAGE_2D:
38    case GL_IMAGE_3D:
39    case GL_UNSIGNED_INT:
40    case GL_INT:
41    case GL_FLOAT:
42    case GL_FIXED:
43    case GL_BOOL:
44        retval =  4;
45        break;
46#ifdef GL_DOUBLE
47    case GL_DOUBLE:
48        retval = 8;
49        break;
50#endif
51    case GL_FLOAT_VEC2:
52    case GL_INT_VEC2:
53    case GL_UNSIGNED_INT_VEC2:
54    case GL_BOOL_VEC2:
55        retval = 8;
56        break;
57    case GL_INT_VEC3:
58    case GL_UNSIGNED_INT_VEC3:
59    case GL_BOOL_VEC3:
60    case GL_FLOAT_VEC3:
61        retval = 12;
62        break;
63    case GL_FLOAT_VEC4:
64    case GL_BOOL_VEC4:
65    case GL_INT_VEC4:
66    case GL_UNSIGNED_INT_VEC4:
67    case GL_FLOAT_MAT2:
68        retval = 16;
69        break;
70    case GL_FLOAT_MAT3:
71        retval = 36;
72        break;
73    case GL_FLOAT_MAT4:
74        retval = 64;
75        break;
76    case GL_FLOAT_MAT2x3:
77    case GL_FLOAT_MAT3x2:
78        retval = 4 * 6;
79        break;
80    case GL_FLOAT_MAT2x4:
81    case GL_FLOAT_MAT4x2:
82        retval = 4 * 8;
83        break;
84    case GL_FLOAT_MAT3x4:
85    case GL_FLOAT_MAT4x3:
86        retval = 4 * 12;
87        break;
88    case GL_SAMPLER_2D:
89    case GL_SAMPLER_3D:
90    case GL_SAMPLER_CUBE:
91        retval = 4;
92        break;
93    case GL_UNSIGNED_SHORT_4_4_4_4:
94	case GL_UNSIGNED_SHORT_5_5_5_1:
95	case GL_UNSIGNED_SHORT_5_6_5:
96	case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
97	case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
98        retval = 2;
99        break;
100	case GL_INT_2_10_10_10_REV:
101	case GL_UNSIGNED_INT_10F_11F_11F_REV:
102	case GL_UNSIGNED_INT_5_9_9_9_REV:
103	case GL_UNSIGNED_INT_2_10_10_10_REV:
104	case GL_UNSIGNED_INT_24_8_OES:;
105        retval = 4;
106        break;
107	case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
108		retval = 4 + 4;
109        break;
110    default:
111        ALOGE("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
112        retval = 4;
113    }
114    return retval;
115
116}
117
118size_t glUtilsParamSize(GLenum param)
119{
120    size_t s = 0;
121
122    switch(param)
123    {
124    case GL_DEPTH_TEST:
125    case GL_DEPTH_FUNC:
126    case GL_DEPTH_BITS:
127    case GL_MAX_CLIP_PLANES:
128    case GL_GREEN_BITS:
129    case GL_MAX_MODELVIEW_STACK_DEPTH:
130    case GL_MAX_PROJECTION_STACK_DEPTH:
131    case GL_MAX_TEXTURE_STACK_DEPTH:
132    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
133    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
134    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
135    case GL_MAX_TEXTURE_SIZE:
136    case GL_TEXTURE_GEN_MODE_OES:
137    case GL_TEXTURE_ENV_MODE:
138    case GL_FOG_MODE:
139    case GL_FOG_DENSITY:
140    case GL_FOG_START:
141    case GL_FOG_END:
142    case GL_SPOT_EXPONENT:
143    case GL_CONSTANT_ATTENUATION:
144    case GL_LINEAR_ATTENUATION:
145    case GL_QUADRATIC_ATTENUATION:
146    case GL_SHININESS:
147    case GL_LIGHT_MODEL_TWO_SIDE:
148    case GL_POINT_SIZE:
149    case GL_POINT_SIZE_MIN:
150    case GL_POINT_SIZE_MAX:
151    case GL_POINT_FADE_THRESHOLD_SIZE:
152    case GL_CULL_FACE:
153    case GL_CULL_FACE_MODE:
154    case GL_FRONT_FACE:
155    case GL_SHADE_MODEL:
156    case GL_DEPTH_WRITEMASK:
157    case GL_DEPTH_CLEAR_VALUE:
158    case GL_STENCIL_FAIL:
159    case GL_STENCIL_PASS_DEPTH_FAIL:
160    case GL_STENCIL_PASS_DEPTH_PASS:
161    case GL_STENCIL_REF:
162    case GL_STENCIL_WRITEMASK:
163    case GL_MATRIX_MODE:
164    case GL_MODELVIEW_STACK_DEPTH:
165    case GL_PROJECTION_STACK_DEPTH:
166    case GL_TEXTURE_STACK_DEPTH:
167    case GL_ALPHA_TEST_FUNC:
168    case GL_ALPHA_TEST_REF:
169    case GL_ALPHA_TEST:
170    case GL_DITHER:
171    case GL_BLEND_DST:
172    case GL_BLEND_SRC:
173    case GL_BLEND:
174    case GL_LOGIC_OP_MODE:
175    case GL_SCISSOR_TEST:
176    case GL_MAX_TEXTURE_UNITS:
177    case GL_ACTIVE_TEXTURE:
178    case GL_ALPHA_BITS:
179    case GL_ARRAY_BUFFER_BINDING:
180    case GL_BLUE_BITS:
181    case GL_CLIENT_ACTIVE_TEXTURE:
182    case GL_CLIP_PLANE0:
183    case GL_CLIP_PLANE1:
184    case GL_CLIP_PLANE2:
185    case GL_CLIP_PLANE3:
186    case GL_CLIP_PLANE4:
187    case GL_CLIP_PLANE5:
188    case GL_COLOR_ARRAY:
189    case GL_COLOR_ARRAY_BUFFER_BINDING:
190    case GL_COLOR_ARRAY_SIZE:
191    case GL_COLOR_ARRAY_STRIDE:
192    case GL_COLOR_ARRAY_TYPE:
193    case GL_COLOR_LOGIC_OP:
194    case GL_COLOR_MATERIAL:
195    case GL_PACK_ALIGNMENT:
196    case GL_PERSPECTIVE_CORRECTION_HINT:
197    case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
198    case GL_POINT_SIZE_ARRAY_STRIDE_OES:
199    case GL_POINT_SIZE_ARRAY_TYPE_OES:
200    case GL_POINT_SMOOTH:
201    case GL_POINT_SMOOTH_HINT:
202    case GL_POINT_SPRITE_OES:
203    case GL_COORD_REPLACE_OES:
204    case GL_COMBINE_ALPHA:
205    case GL_SRC0_RGB:
206    case GL_SRC1_RGB:
207    case GL_SRC2_RGB:
208    case GL_OPERAND0_RGB:
209    case GL_OPERAND1_RGB:
210    case GL_OPERAND2_RGB:
211    case GL_SRC0_ALPHA:
212    case GL_SRC1_ALPHA:
213    case GL_SRC2_ALPHA:
214    case GL_OPERAND0_ALPHA:
215    case GL_OPERAND1_ALPHA:
216    case GL_OPERAND2_ALPHA:
217    case GL_RGB_SCALE:
218    case GL_ALPHA_SCALE:
219    case GL_COMBINE_RGB:
220    case GL_POLYGON_OFFSET_FACTOR:
221    case GL_POLYGON_OFFSET_FILL:
222    case GL_POLYGON_OFFSET_UNITS:
223    case GL_RED_BITS:
224    case GL_RESCALE_NORMAL:
225    case GL_SAMPLE_ALPHA_TO_COVERAGE:
226    case GL_SAMPLE_ALPHA_TO_ONE:
227    case GL_SAMPLE_BUFFERS:
228    case GL_SAMPLE_COVERAGE:
229    case GL_SAMPLE_COVERAGE_INVERT:
230    case GL_SAMPLE_COVERAGE_VALUE:
231    case GL_SAMPLES:
232    case GL_MAX_SAMPLES_EXT:
233    case GL_STENCIL_BITS:
234    case GL_STENCIL_CLEAR_VALUE:
235    case GL_STENCIL_FUNC:
236    case GL_STENCIL_TEST:
237    case GL_STENCIL_VALUE_MASK:
238    case GL_STENCIL_BACK_FUNC:
239    case GL_STENCIL_BACK_VALUE_MASK:
240    case GL_STENCIL_BACK_REF:
241    case GL_STENCIL_BACK_FAIL:
242    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
243    case GL_STENCIL_BACK_PASS_DEPTH_PASS:
244    case GL_STENCIL_BACK_WRITEMASK:
245    case GL_TEXTURE_2D:
246    case GL_TEXTURE_BINDING_2D:
247    case GL_TEXTURE_BINDING_CUBE_MAP:
248    case GL_TEXTURE_BINDING_EXTERNAL_OES:
249    case GL_TEXTURE_COORD_ARRAY:
250    case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
251    case GL_TEXTURE_COORD_ARRAY_SIZE:
252    case GL_TEXTURE_COORD_ARRAY_STRIDE:
253    case GL_TEXTURE_COORD_ARRAY_TYPE:
254    case GL_UNPACK_ALIGNMENT:
255    case GL_VERTEX_ARRAY:
256    case GL_VERTEX_ARRAY_BUFFER_BINDING:
257    case GL_VERTEX_ARRAY_SIZE:
258    case GL_VERTEX_ARRAY_STRIDE:
259    case GL_VERTEX_ARRAY_TYPE:
260    case GL_SPOT_CUTOFF:
261    case GL_TEXTURE_MIN_FILTER:
262    case GL_TEXTURE_MAG_FILTER:
263    case GL_TEXTURE_WRAP_S:
264    case GL_TEXTURE_WRAP_T:
265    case GL_GENERATE_MIPMAP:
266    case GL_GENERATE_MIPMAP_HINT:
267    case GL_RENDERBUFFER_WIDTH_OES:
268    case GL_RENDERBUFFER_HEIGHT_OES:
269    case GL_RENDERBUFFER_INTERNAL_FORMAT_OES:
270    case GL_RENDERBUFFER_RED_SIZE_OES:
271    case GL_RENDERBUFFER_GREEN_SIZE_OES:
272    case GL_RENDERBUFFER_BLUE_SIZE_OES:
273    case GL_RENDERBUFFER_ALPHA_SIZE_OES:
274    case GL_RENDERBUFFER_DEPTH_SIZE_OES:
275    case GL_RENDERBUFFER_STENCIL_SIZE_OES:
276    case GL_RENDERBUFFER_BINDING:
277    case GL_FRAMEBUFFER_BINDING:
278    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES:
279    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES:
280    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES:
281    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES:
282    case GL_FENCE_STATUS_NV:
283    case GL_FENCE_CONDITION_NV:
284    case GL_TEXTURE_WIDTH_QCOM:
285    case GL_TEXTURE_HEIGHT_QCOM:
286    case GL_TEXTURE_DEPTH_QCOM:
287    case GL_TEXTURE_INTERNAL_FORMAT_QCOM:
288    case GL_TEXTURE_FORMAT_QCOM:
289    case GL_TEXTURE_TYPE_QCOM:
290    case GL_TEXTURE_IMAGE_VALID_QCOM:
291    case GL_TEXTURE_NUM_LEVELS_QCOM:
292    case GL_TEXTURE_TARGET_QCOM:
293    case GL_TEXTURE_OBJECT_VALID_QCOM:
294    case GL_BLEND_EQUATION_RGB_OES:
295    case GL_BLEND_EQUATION_ALPHA_OES:
296    case GL_BLEND_DST_RGB_OES:
297    case GL_BLEND_SRC_RGB_OES:
298    case GL_BLEND_DST_ALPHA_OES:
299    case GL_BLEND_SRC_ALPHA_OES:
300    case GL_MAX_LIGHTS:
301    case GL_SHADER_TYPE:
302    case GL_COMPILE_STATUS:
303    case GL_SHADER_SOURCE_LENGTH:
304    case GL_CURRENT_PROGRAM:
305    case GL_SUBPIXEL_BITS:
306    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
307    case GL_NUM_SHADER_BINARY_FORMATS:
308    case GL_SHADER_COMPILER:
309    case GL_MAX_VERTEX_ATTRIBS:
310    case GL_MAX_VERTEX_UNIFORM_VECTORS:
311    case GL_MAX_VARYING_VECTORS:
312    case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
313    case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
314    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
315    case GL_MAX_RENDERBUFFER_SIZE:
316    case GL_MAX_TEXTURE_IMAGE_UNITS:
317    case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
318    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
319    case GL_LINE_WIDTH:
320    case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
321    case GL_MAX_UNIFORM_BUFFER_BINDINGS:
322    case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
323    case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
324    case GL_UNIFORM_BLOCK_BINDING:
325    case GL_UNIFORM_BLOCK_DATA_SIZE:
326    case GL_UNIFORM_BLOCK_NAME_LENGTH:
327    case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
328    case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
329    case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
330    case GL_CURRENT_QUERY:
331    case GL_QUERY_RESULT:
332    case GL_QUERY_RESULT_AVAILABLE:
333    case GL_READ_BUFFER:
334
335    case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
336    case GL_ACTIVE_ATTRIBUTES:
337    case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
338    case GL_ACTIVE_UNIFORM_BLOCKS:
339    case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
340    case GL_ACTIVE_UNIFORMS:
341    case GL_ACTIVE_UNIFORM_MAX_LENGTH:
342    case GL_ATTACHED_SHADERS:
343    case GL_DELETE_STATUS:
344    case GL_INFO_LOG_LENGTH:
345    case GL_LINK_STATUS:
346    case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
347    case GL_PROGRAM_SEPARABLE:
348    case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
349    case GL_TRANSFORM_FEEDBACK_VARYINGS:
350    case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
351    case GL_VALIDATE_STATUS:
352        s = 1;
353        break;
354    case GL_ALIASED_LINE_WIDTH_RANGE:
355    case GL_ALIASED_POINT_SIZE_RANGE:
356    case GL_DEPTH_RANGE:
357    case GL_MAX_VIEWPORT_DIMS:
358    case GL_SMOOTH_POINT_SIZE_RANGE:
359    case GL_SMOOTH_LINE_WIDTH_RANGE:
360    case GL_SAMPLE_POSITION:
361        s= 2;
362        break;
363    case GL_SPOT_DIRECTION:
364    case GL_POINT_DISTANCE_ATTENUATION:
365    case GL_CURRENT_NORMAL:
366    case GL_COMPUTE_WORK_GROUP_SIZE:
367        s =  3;
368        break;
369    case GL_CURRENT_VERTEX_ATTRIB:
370    case GL_CURRENT_TEXTURE_COORDS:
371    case GL_CURRENT_COLOR:
372    case GL_FOG_COLOR:
373    case GL_AMBIENT:
374    case GL_DIFFUSE:
375    case GL_SPECULAR:
376    case GL_EMISSION:
377    case GL_POSITION:
378    case GL_LIGHT_MODEL_AMBIENT:
379    case GL_TEXTURE_ENV_COLOR:
380    case GL_SCISSOR_BOX:
381    case GL_VIEWPORT:
382    case GL_TEXTURE_CROP_RECT_OES:
383    case GL_COLOR_CLEAR_VALUE:
384    case GL_COLOR_WRITEMASK:
385    case GL_AMBIENT_AND_DIFFUSE:
386    case GL_BLEND_COLOR:
387        s =  4;
388        break;
389    case GL_MODELVIEW_MATRIX:
390    case GL_PROJECTION_MATRIX:
391    case GL_TEXTURE_MATRIX:
392        s = 16;
393    break;
394    default:
395        ERR("glUtilsParamSize: unknow param 0x%08x\n", param);
396        s = 1; // assume 1
397    }
398    return s;
399}
400
401void glUtilsPackPointerData(unsigned char *dst, unsigned char *src,
402                     int size, GLenum type, unsigned int stride,
403                     unsigned int datalen)
404{
405    unsigned int  vsize = size * glSizeof(type);
406    switch (type) {
407    case GL_INT_2_10_10_10_REV:
408    case GL_UNSIGNED_INT_2_10_10_10_REV:
409        vsize = vsize / 4;
410        break;
411    default:
412        break;
413    }
414
415    if (stride == 0) stride = vsize;
416
417    if (stride == vsize) {
418        memcpy(dst, src, datalen);
419    } else {
420        for (unsigned int i = 0; i < datalen; i += vsize) {
421            memcpy(dst, src, vsize);
422            dst += vsize;
423            src += stride;
424        }
425    }
426}
427
428void glUtilsWritePackPointerData(void* _stream, unsigned char *src,
429                                 int size, GLenum type, unsigned int stride,
430                                 unsigned int datalen)
431{
432    IOStream* stream = reinterpret_cast<IOStream*>(_stream);
433
434    unsigned int  vsize = size * glSizeof(type);
435    if (stride == 0) stride = vsize;
436
437    if (stride == vsize) {
438        stream->writeFully(src, datalen);
439    } else {
440        for (unsigned int i = 0; i < datalen; i += vsize) {
441            stream->writeFully(src, (size_t)vsize);
442            src += stride;
443        }
444    }
445}
446
447int glUtilsPixelBitSize(GLenum format, GLenum type)
448{
449    int components = 0;
450    int componentsize = 0;
451    int pixelsize = 0;
452    switch(type) {
453    case GL_BYTE:
454    case GL_UNSIGNED_BYTE:
455        componentsize = 8;
456        break;
457    case GL_SHORT:
458    case GL_UNSIGNED_SHORT:
459    case GL_UNSIGNED_SHORT_5_6_5:
460    case GL_UNSIGNED_SHORT_4_4_4_4:
461    case GL_UNSIGNED_SHORT_5_5_5_1:
462    case GL_RGB565_OES:
463    case GL_RGB5_A1_OES:
464    case GL_RGBA4_OES:
465        pixelsize = 16;
466        break;
467    case GL_INT:
468    case GL_UNSIGNED_INT:
469    case GL_FLOAT:
470    case GL_FIXED:
471    case GL_UNSIGNED_INT_24_8_OES:
472        pixelsize = 32;
473        break;
474    default:
475        ERR("glUtilsPixelBitSize: unknown pixel type - assuming pixel data 0\n");
476        componentsize = 0;
477    }
478
479    if (pixelsize == 0) {
480        switch(format) {
481#if 0
482        case GL_RED:
483        case GL_GREEN:
484        case GL_BLUE:
485#endif
486        case GL_ALPHA:
487        case GL_LUMINANCE:
488        case GL_DEPTH_COMPONENT:
489        case GL_DEPTH_STENCIL_OES:
490            components = 1;
491            break;
492        case GL_LUMINANCE_ALPHA:
493            components = 2;
494            break;
495        case GL_RGB:
496#if 0
497        case GL_BGR:
498#endif
499            components = 3;
500            break;
501        case GL_RGBA:
502        case GL_BGRA_EXT:
503            components = 4;
504            break;
505        default:
506            ERR("glUtilsPixelBitSize: unknown pixel format...\n");
507            components = 0;
508        }
509        pixelsize = components * componentsize;
510    }
511
512    return pixelsize;
513}
514
515// pack a list of strings into one.
516void glUtilsPackStrings(char *ptr,  char **strings,  GLint *length, GLsizei count)
517{
518    char *p = ptr;
519    *p = '\0';
520    for (int i = 0; i < count; i++) {
521        int l=0;
522        if (strings[i]!=NULL) {
523            if (length == NULL || length[i] < 0) {
524                l = strlen(strings[i]);
525                strcat(p, strings[i]);
526            } else {
527                l = length[i];
528                strncat(p, strings[i], l);
529            }
530        }
531        p += l;
532    }
533}
534
535// claculate the length of a list of strings
536int glUtilsCalcShaderSourceLen( char **strings,  GLint *length, GLsizei count)
537{
538    int len = 0;
539    for (int i = 0; i < count; i++) {
540        int l;
541        if (length == NULL || length[i] < 0) {
542            l = strings[i]!=NULL ? strlen(strings[i]) : 0;
543        } else {
544            l = length[i];
545        }
546        len += l;
547    }
548    return len;
549
550}
551
552// helper to get GL_COLOR_ATTACHMENTn names
553GLenum glUtilsColorAttachmentName(int i) {
554#undef COLOR_ATTACHMENT_CASE
555#define COLOR_ATTACHMENT_CASE(i) \
556    case i: \
557        return GL_COLOR_ATTACHMENT##i; \
558
559    switch (i) {
560        COLOR_ATTACHMENT_CASE(0)
561        COLOR_ATTACHMENT_CASE(1)
562        COLOR_ATTACHMENT_CASE(2)
563        COLOR_ATTACHMENT_CASE(3)
564        COLOR_ATTACHMENT_CASE(4)
565        COLOR_ATTACHMENT_CASE(5)
566        COLOR_ATTACHMENT_CASE(6)
567        COLOR_ATTACHMENT_CASE(7)
568        COLOR_ATTACHMENT_CASE(8)
569        COLOR_ATTACHMENT_CASE(9)
570        COLOR_ATTACHMENT_CASE(10)
571        COLOR_ATTACHMENT_CASE(11)
572        COLOR_ATTACHMENT_CASE(12)
573        COLOR_ATTACHMENT_CASE(13)
574        COLOR_ATTACHMENT_CASE(14)
575        COLOR_ATTACHMENT_CASE(15)
576    }
577    return GL_NONE;
578#undef COLOR_ATTACHMENT_CASE
579}
580
581int glUtilsColorAttachmentIndex(GLenum attachment) {
582#undef COLOR_ATTACHMENT_CASE
583#define COLOR_ATTACHMENT_CASE(i) \
584    case GL_COLOR_ATTACHMENT##i: \
585        return i; \
586
587    switch (attachment) {
588        COLOR_ATTACHMENT_CASE(0)
589        COLOR_ATTACHMENT_CASE(1)
590        COLOR_ATTACHMENT_CASE(2)
591        COLOR_ATTACHMENT_CASE(3)
592        COLOR_ATTACHMENT_CASE(4)
593        COLOR_ATTACHMENT_CASE(5)
594        COLOR_ATTACHMENT_CASE(6)
595        COLOR_ATTACHMENT_CASE(7)
596        COLOR_ATTACHMENT_CASE(8)
597        COLOR_ATTACHMENT_CASE(9)
598        COLOR_ATTACHMENT_CASE(10)
599        COLOR_ATTACHMENT_CASE(11)
600        COLOR_ATTACHMENT_CASE(12)
601        COLOR_ATTACHMENT_CASE(13)
602        COLOR_ATTACHMENT_CASE(14)
603        COLOR_ATTACHMENT_CASE(15)
604    }
605    return -1;
606#undef COLOR_ATTACHMENT_CASE
607}
608
609struct glUtilsDrawArraysIndirectCommand {
610    GLuint count;
611    GLuint primCount;
612    GLuint first;
613    GLuint reserved;
614};
615
616struct glUtilsDrawElementsIndirectCommand {
617    GLuint count;
618    GLuint primCount;
619    GLuint first;
620    GLint baseVertex;
621    GLuint reserved;
622};
623
624GLuint glUtilsIndirectStructSize(IndirectCommandType cmdType) {
625    switch (cmdType) {
626    case INDIRECT_COMMAND_DRAWARRAYS:
627        return sizeof(glUtilsDrawArraysIndirectCommand);
628    case INDIRECT_COMMAND_DRAWELEMENTS:
629        return sizeof(glUtilsDrawElementsIndirectCommand);
630    }
631    return 4;
632}
633