2 * Copyright (C) 2011 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <GLES3/gl31.h>
23 size_t glSizeof(GLenum type)
28 case GL_UNSIGNED_BYTE:
32 case GL_UNSIGNED_SHORT:
34 case GL_HALF_FLOAT_OES:
53 case GL_UNSIGNED_INT_VEC2:
58 case GL_UNSIGNED_INT_VEC3:
66 case GL_UNSIGNED_INT_VEC4:
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:
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:;
107 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
111 ALOGE("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
118 size_t glUtilsParamSize(GLenum param)
127 case GL_MAX_CLIP_PLANES:
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:
142 case GL_SPOT_EXPONENT:
143 case GL_CONSTANT_ATTENUATION:
144 case GL_LINEAR_ATTENUATION:
145 case GL_QUADRATIC_ATTENUATION:
147 case GL_LIGHT_MODEL_TWO_SIDE:
149 case GL_POINT_SIZE_MIN:
150 case GL_POINT_SIZE_MAX:
151 case GL_POINT_FADE_THRESHOLD_SIZE:
153 case GL_CULL_FACE_MODE:
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:
162 case GL_STENCIL_WRITEMASK:
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:
174 case GL_LOGIC_OP_MODE:
175 case GL_SCISSOR_TEST:
176 case GL_MAX_TEXTURE_UNITS:
177 case GL_ACTIVE_TEXTURE:
179 case GL_ARRAY_BUFFER_BINDING:
181 case GL_CLIENT_ACTIVE_TEXTURE:
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:
208 case GL_OPERAND0_RGB:
209 case GL_OPERAND1_RGB:
210 case GL_OPERAND2_RGB:
214 case GL_OPERAND0_ALPHA:
215 case GL_OPERAND1_ALPHA:
216 case GL_OPERAND2_ALPHA:
220 case GL_POLYGON_OFFSET_FACTOR:
221 case GL_POLYGON_OFFSET_FILL:
222 case GL_POLYGON_OFFSET_UNITS:
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:
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:
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:
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:
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:
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:
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:
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:
354 case GL_ALIASED_LINE_WIDTH_RANGE:
355 case GL_ALIASED_POINT_SIZE_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:
363 case GL_SPOT_DIRECTION:
364 case GL_POINT_DISTANCE_ATTENUATION:
365 case GL_CURRENT_NORMAL:
366 case GL_COMPUTE_WORK_GROUP_SIZE:
369 case GL_CURRENT_VERTEX_ATTRIB:
370 case GL_CURRENT_TEXTURE_COORDS:
371 case GL_CURRENT_COLOR:
378 case GL_LIGHT_MODEL_AMBIENT:
379 case GL_TEXTURE_ENV_COLOR:
382 case GL_TEXTURE_CROP_RECT_OES:
383 case GL_COLOR_CLEAR_VALUE:
384 case GL_COLOR_WRITEMASK:
385 case GL_AMBIENT_AND_DIFFUSE:
389 case GL_MODELVIEW_MATRIX:
390 case GL_PROJECTION_MATRIX:
391 case GL_TEXTURE_MATRIX:
395 ERR("glUtilsParamSize: unknow param 0x%08x\n", param);
401 void glUtilsPackPointerData(unsigned char *dst, unsigned char *src,
402 int size, GLenum type, unsigned int stride,
403 unsigned int datalen)
405 unsigned int vsize = size * glSizeof(type);
407 case GL_INT_2_10_10_10_REV:
408 case GL_UNSIGNED_INT_2_10_10_10_REV:
415 if (stride == 0) stride = vsize;
417 if (stride == vsize) {
418 memcpy(dst, src, datalen);
420 for (unsigned int i = 0; i < datalen; i += vsize) {
421 memcpy(dst, src, vsize);
428 void glUtilsWritePackPointerData(void* _stream, unsigned char *src,
429 int size, GLenum type, unsigned int stride,
430 unsigned int datalen)
432 IOStream* stream = reinterpret_cast<IOStream*>(_stream);
434 unsigned int vsize = size * glSizeof(type);
435 if (stride == 0) stride = vsize;
437 if (stride == vsize) {
438 stream->writeFully(src, datalen);
440 for (unsigned int i = 0; i < datalen; i += vsize) {
441 stream->writeFully(src, (size_t)vsize);
447 int glUtilsPixelBitSize(GLenum format, GLenum type)
450 int componentsize = 0;
454 case GL_UNSIGNED_BYTE:
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:
468 case GL_UNSIGNED_INT:
471 case GL_UNSIGNED_INT_24_8_OES:
475 ERR("glUtilsPixelBitSize: unknown pixel type - assuming pixel data 0\n");
479 if (pixelsize == 0) {
488 case GL_DEPTH_COMPONENT:
489 case GL_DEPTH_STENCIL_OES:
492 case GL_LUMINANCE_ALPHA:
506 ERR("glUtilsPixelBitSize: unknown pixel format...\n");
509 pixelsize = components * componentsize;
515 // pack a list of strings into one.
516 void glUtilsPackStrings(char *ptr, char **strings, GLint *length, GLsizei count)
520 for (int i = 0; i < count; i++) {
522 if (strings[i]!=NULL) {
523 if (length == NULL || length[i] < 0) {
524 l = strlen(strings[i]);
525 strcat(p, strings[i]);
528 strncat(p, strings[i], l);
535 // claculate the length of a list of strings
536 int glUtilsCalcShaderSourceLen( char **strings, GLint *length, GLsizei count)
539 for (int i = 0; i < count; i++) {
541 if (length == NULL || length[i] < 0) {
542 l = strings[i]!=NULL ? strlen(strings[i]) : 0;
552 // helper to get GL_COLOR_ATTACHMENTn names
553 GLenum glUtilsColorAttachmentName(int i) {
554 #undef COLOR_ATTACHMENT_CASE
555 #define COLOR_ATTACHMENT_CASE(i) \
557 return GL_COLOR_ATTACHMENT##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)
578 #undef COLOR_ATTACHMENT_CASE
581 int glUtilsColorAttachmentIndex(GLenum attachment) {
582 #undef COLOR_ATTACHMENT_CASE
583 #define COLOR_ATTACHMENT_CASE(i) \
584 case GL_COLOR_ATTACHMENT##i: \
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)
606 #undef COLOR_ATTACHMENT_CASE
609 struct glUtilsDrawArraysIndirectCommand {
616 struct glUtilsDrawElementsIndirectCommand {
624 GLuint glUtilsIndirectStructSize(IndirectCommandType cmdType) {
626 case INDIRECT_COMMAND_DRAWARRAYS:
627 return sizeof(glUtilsDrawArraysIndirectCommand);
628 case INDIRECT_COMMAND_DRAWELEMENTS:
629 return sizeof(glUtilsDrawElementsIndirectCommand);