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