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