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