Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file is here so other GLES2 related files can have a common set of
      6 // includes where appropriate.
      7 
      8 #include <sstream>
      9 #include <GLES2/gl2.h>
     10 #include <GLES2/gl2ext.h>
     11 #include <GLES2/gl2extchromium.h>
     12 
     13 #include "gpu/command_buffer/common/gles2_cmd_format.h"
     14 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
     15 
     16 namespace gpu {
     17 namespace gles2 {
     18 
     19 namespace gl_error_bit {
     20 enum GLErrorBit {
     21   kNoError = 0,
     22   kInvalidEnum = (1 << 0),
     23   kInvalidValue = (1 << 1),
     24   kInvalidOperation = (1 << 2),
     25   kOutOfMemory = (1 << 3),
     26   kInvalidFrameBufferOperation = (1 << 4)
     27 };
     28 }
     29 
     30 int GLES2Util::GLGetNumValuesReturned(int id) const {
     31   switch (id) {
     32     // -- glGetBooleanv, glGetFloatv, glGetIntergerv
     33     case GL_ACTIVE_TEXTURE:
     34       return 1;
     35     case GL_ALIASED_LINE_WIDTH_RANGE:
     36       return 2;
     37     case GL_ALIASED_POINT_SIZE_RANGE:
     38       return 2;
     39     case GL_ALPHA_BITS:
     40       return 1;
     41     case GL_ARRAY_BUFFER_BINDING:
     42       return 1;
     43     case GL_BLEND:
     44       return 1;
     45     case GL_BLEND_COLOR:
     46       return 4;
     47     case GL_BLEND_DST_ALPHA:
     48       return 1;
     49     case GL_BLEND_DST_RGB:
     50       return 1;
     51     case GL_BLEND_EQUATION_ALPHA:
     52       return 1;
     53     case GL_BLEND_EQUATION_RGB:
     54       return 1;
     55     case GL_BLEND_SRC_ALPHA:
     56       return 1;
     57     case GL_BLEND_SRC_RGB:
     58       return 1;
     59     case GL_BLUE_BITS:
     60       return 1;
     61     case GL_COLOR_CLEAR_VALUE:
     62       return 4;
     63     case GL_COLOR_WRITEMASK:
     64       return 4;
     65     case GL_COMPRESSED_TEXTURE_FORMATS:
     66       return num_compressed_texture_formats_;
     67     case GL_CULL_FACE:
     68       return 1;
     69     case GL_CULL_FACE_MODE:
     70       return 1;
     71     case GL_CURRENT_PROGRAM:
     72       return 1;
     73     case GL_DEPTH_BITS:
     74       return 1;
     75     case GL_DEPTH_CLEAR_VALUE:
     76       return 1;
     77     case GL_DEPTH_FUNC:
     78       return 1;
     79     case GL_DEPTH_RANGE:
     80       return 2;
     81     case GL_DEPTH_TEST:
     82       return 1;
     83     case GL_DEPTH_WRITEMASK:
     84       return 1;
     85     case GL_DITHER:
     86       return 1;
     87     case GL_ELEMENT_ARRAY_BUFFER_BINDING:
     88       return 1;
     89     case GL_FRAMEBUFFER_BINDING:
     90       return 1;
     91     case GL_FRONT_FACE:
     92       return 1;
     93     case GL_GENERATE_MIPMAP_HINT:
     94       return 1;
     95     case GL_GREEN_BITS:
     96       return 1;
     97     case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
     98       return 1;
     99     case GL_IMPLEMENTATION_COLOR_READ_TYPE:
    100       return 1;
    101     case GL_LINE_WIDTH:
    102       return 1;
    103     case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
    104       return 1;
    105     case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
    106       return 1;
    107     case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
    108       return 1;
    109     case GL_MAX_RENDERBUFFER_SIZE:
    110       return 1;
    111     case GL_MAX_TEXTURE_IMAGE_UNITS:
    112       return 1;
    113     case GL_MAX_TEXTURE_SIZE:
    114       return 1;
    115     case GL_MAX_VARYING_VECTORS:
    116       return 1;
    117     case GL_MAX_VERTEX_ATTRIBS:
    118       return 1;
    119     case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
    120       return 1;
    121     case GL_MAX_VERTEX_UNIFORM_VECTORS:
    122       return 1;
    123     case GL_MAX_VIEWPORT_DIMS:
    124       return 2;
    125     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    126       return 1;
    127     case GL_NUM_SHADER_BINARY_FORMATS:
    128       return 1;
    129     case GL_PACK_ALIGNMENT:
    130       return 1;
    131     case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
    132       return 1;
    133     case GL_POLYGON_OFFSET_FACTOR:
    134       return 1;
    135     case GL_POLYGON_OFFSET_FILL:
    136       return 1;
    137     case GL_POLYGON_OFFSET_UNITS:
    138       return 1;
    139     case GL_RED_BITS:
    140       return 1;
    141     case GL_RENDERBUFFER_BINDING:
    142       return 1;
    143     case GL_SAMPLE_BUFFERS:
    144       return 1;
    145     case GL_SAMPLE_COVERAGE_INVERT:
    146       return 1;
    147     case GL_SAMPLE_COVERAGE_VALUE:
    148       return 1;
    149     case GL_SAMPLES:
    150       return 1;
    151     case GL_SCISSOR_BOX:
    152       return 4;
    153     case GL_SCISSOR_TEST:
    154       return 1;
    155     case GL_SHADER_BINARY_FORMATS:
    156       return num_shader_binary_formats_;
    157     case GL_SHADER_COMPILER:
    158       return 1;
    159     case GL_STENCIL_BACK_FAIL:
    160       return 1;
    161     case GL_STENCIL_BACK_FUNC:
    162       return 1;
    163     case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
    164       return 1;
    165     case GL_STENCIL_BACK_PASS_DEPTH_PASS:
    166       return 1;
    167     case GL_STENCIL_BACK_REF:
    168       return 1;
    169     case GL_STENCIL_BACK_VALUE_MASK:
    170       return 1;
    171     case GL_STENCIL_BACK_WRITEMASK:
    172       return 1;
    173     case GL_STENCIL_BITS:
    174       return 1;
    175     case GL_STENCIL_CLEAR_VALUE:
    176       return 1;
    177     case GL_STENCIL_FAIL:
    178       return 1;
    179     case GL_STENCIL_FUNC:
    180       return 1;
    181     case GL_STENCIL_PASS_DEPTH_FAIL:
    182       return 1;
    183     case GL_STENCIL_PASS_DEPTH_PASS:
    184       return 1;
    185     case GL_STENCIL_REF:
    186       return 1;
    187     case GL_STENCIL_TEST:
    188       return 1;
    189     case GL_STENCIL_VALUE_MASK:
    190       return 1;
    191     case GL_STENCIL_WRITEMASK:
    192       return 1;
    193     case GL_SUBPIXEL_BITS:
    194       return 1;
    195     case GL_TEXTURE_BINDING_2D:
    196       return 1;
    197     case GL_TEXTURE_BINDING_CUBE_MAP:
    198       return 1;
    199     case GL_TEXTURE_BINDING_EXTERNAL_OES:
    200       return 1;
    201     case GL_TEXTURE_BINDING_RECTANGLE_ARB:
    202       return 1;
    203     case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
    204       return 1;
    205     case GL_UNPACK_ALIGNMENT:
    206       return 1;
    207     case GL_VIEWPORT:
    208       return 4;
    209     // -- glGetBooleanv, glGetFloatv, glGetIntergerv with
    210     //    GL_CHROMIUM_framebuffer_multisample
    211     case GL_MAX_SAMPLES_EXT:
    212       return 1;
    213     case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
    214       return 1;
    215 
    216     // -- glGetBufferParameteriv
    217     case GL_BUFFER_SIZE:
    218       return 1;
    219     case GL_BUFFER_USAGE:
    220       return 1;
    221 
    222     // -- glGetFramebufferAttachmentParameteriv
    223     case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
    224       return 1;
    225     case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
    226       return 1;
    227     case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
    228       return 1;
    229     case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
    230       return 1;
    231     // -- glGetFramebufferAttachmentParameteriv with
    232     //    GL_EXT_multisampled_render_to_texture
    233     case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT:
    234       return 1;
    235 
    236     // -- glGetProgramiv
    237     case GL_DELETE_STATUS:
    238       return 1;
    239     case GL_LINK_STATUS:
    240       return 1;
    241     case GL_VALIDATE_STATUS:
    242       return 1;
    243     case GL_INFO_LOG_LENGTH:
    244       return 1;
    245     case GL_ATTACHED_SHADERS:
    246       return 1;
    247     case GL_ACTIVE_ATTRIBUTES:
    248       return 1;
    249     case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
    250       return 1;
    251     case GL_ACTIVE_UNIFORMS:
    252       return 1;
    253     case GL_ACTIVE_UNIFORM_MAX_LENGTH:
    254       return 1;
    255 
    256 
    257     // -- glGetRenderbufferAttachmentParameteriv
    258     case GL_RENDERBUFFER_WIDTH:
    259       return 1;
    260     case GL_RENDERBUFFER_HEIGHT:
    261       return 1;
    262     case GL_RENDERBUFFER_INTERNAL_FORMAT:
    263       return 1;
    264     case GL_RENDERBUFFER_RED_SIZE:
    265       return 1;
    266     case GL_RENDERBUFFER_GREEN_SIZE:
    267       return 1;
    268     case GL_RENDERBUFFER_BLUE_SIZE:
    269       return 1;
    270     case GL_RENDERBUFFER_ALPHA_SIZE:
    271       return 1;
    272     case GL_RENDERBUFFER_DEPTH_SIZE:
    273       return 1;
    274     case GL_RENDERBUFFER_STENCIL_SIZE:
    275       return 1;
    276     // -- glGetRenderbufferAttachmentParameteriv with
    277     //    GL_EXT_multisampled_render_to_texture
    278     case GL_RENDERBUFFER_SAMPLES_EXT:
    279       return 1;
    280 
    281     // -- glGetShaderiv
    282     case GL_SHADER_TYPE:
    283       return 1;
    284     // Already defined under glGetFramebufferAttachemntParameteriv.
    285     // case GL_DELETE_STATUS:
    286     //   return 1;
    287     case GL_COMPILE_STATUS:
    288       return 1;
    289     // Already defined under glGetFramebufferAttachemntParameteriv.
    290     // case GL_INFO_LOG_LENGTH:
    291     //   return 1;
    292     case GL_SHADER_SOURCE_LENGTH:
    293       return 1;
    294     case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
    295       return 1;
    296 
    297     // -- glGetTexParameterfv, glGetTexParameteriv
    298     case GL_TEXTURE_MAG_FILTER:
    299       return 1;
    300     case GL_TEXTURE_MIN_FILTER:
    301       return 1;
    302     case GL_TEXTURE_WRAP_S:
    303       return 1;
    304     case GL_TEXTURE_WRAP_T:
    305       return 1;
    306     case GL_TEXTURE_MAX_ANISOTROPY_EXT:
    307       return 1;
    308 
    309     // -- glGetVertexAttribfv, glGetVertexAttribiv
    310     case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
    311       return 1;
    312     case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
    313       return 1;
    314     case GL_VERTEX_ATTRIB_ARRAY_SIZE:
    315       return 1;
    316     case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
    317       return 1;
    318     case GL_VERTEX_ATTRIB_ARRAY_TYPE:
    319       return 1;
    320     case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
    321       return 1;
    322     case GL_CURRENT_VERTEX_ATTRIB:
    323       return 4;
    324 
    325     // -- glHint with GL_OES_standard_derivatives
    326     case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
    327       return 1;
    328 
    329     // Chromium internal bind_generates_resource query
    330     case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
    331       return 1;
    332 
    333     // bad enum
    334     default:
    335       return 0;
    336   }
    337 }
    338 
    339 namespace {
    340 
    341 // Return the number of elements per group of a specified format.
    342 int ElementsPerGroup(int format, int type) {
    343   switch (type) {
    344     case GL_UNSIGNED_SHORT_5_6_5:
    345     case GL_UNSIGNED_SHORT_4_4_4_4:
    346     case GL_UNSIGNED_SHORT_5_5_5_1:
    347     case GL_UNSIGNED_INT_24_8_OES:
    348        return 1;
    349     default:
    350        break;
    351     }
    352 
    353     switch (format) {
    354     case GL_RGB:
    355        return 3;
    356     case GL_LUMINANCE_ALPHA:
    357        return 2;
    358     case GL_RGBA:
    359     case GL_BGRA_EXT:
    360        return 4;
    361     case GL_ALPHA:
    362     case GL_LUMINANCE:
    363     case GL_DEPTH_COMPONENT:
    364     case GL_DEPTH_COMPONENT24_OES:
    365     case GL_DEPTH_COMPONENT32_OES:
    366     case GL_DEPTH_COMPONENT16:
    367     case GL_DEPTH24_STENCIL8_OES:
    368     case GL_DEPTH_STENCIL_OES:
    369        return 1;
    370     default:
    371        return 0;
    372   }
    373 }
    374 
    375 // Return the number of bytes per element, based on the element type.
    376 int BytesPerElement(int type) {
    377   switch (type) {
    378     case GL_FLOAT:
    379     case GL_UNSIGNED_INT_24_8_OES:
    380     case GL_UNSIGNED_INT:
    381       return 4;
    382     case GL_HALF_FLOAT_OES:
    383     case GL_UNSIGNED_SHORT:
    384     case GL_SHORT:
    385     case GL_UNSIGNED_SHORT_5_6_5:
    386     case GL_UNSIGNED_SHORT_4_4_4_4:
    387     case GL_UNSIGNED_SHORT_5_5_5_1:
    388        return 2;
    389     case GL_UNSIGNED_BYTE:
    390     case GL_BYTE:
    391        return 1;
    392     default:
    393        return 0;
    394   }
    395 }
    396 
    397 }  // anonymous namespace
    398 
    399 uint32 GLES2Util::ComputeImageGroupSize(int format, int type) {
    400   return BytesPerElement(type) * ElementsPerGroup(format, type);
    401 }
    402 
    403 bool GLES2Util::ComputeImagePaddedRowSize(
    404         int width, int format, int type, int unpack_alignment,
    405         uint32* padded_row_size) {
    406   uint32 bytes_per_group = ComputeImageGroupSize(format, type);
    407   uint32 unpadded_row_size;
    408   if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) {
    409     return false;
    410   }
    411   uint32 temp;
    412   if (!SafeAddUint32(unpadded_row_size, unpack_alignment - 1, &temp)) {
    413       return false;
    414   }
    415   *padded_row_size = (temp / unpack_alignment) * unpack_alignment;
    416   return true;
    417 }
    418 
    419 // Returns the amount of data glTexImage2D or glTexSubImage2D will access.
    420 bool GLES2Util::ComputeImageDataSizes(
    421     int width, int height, int format, int type, int unpack_alignment,
    422     uint32* size, uint32* ret_unpadded_row_size, uint32* ret_padded_row_size) {
    423   uint32 bytes_per_group = ComputeImageGroupSize(format, type);
    424   uint32 row_size;
    425   if (!SafeMultiplyUint32(width, bytes_per_group, &row_size)) {
    426     return false;
    427   }
    428   if (height > 1) {
    429     uint32 temp;
    430     if (!SafeAddUint32(row_size, unpack_alignment - 1, &temp)) {
    431       return false;
    432     }
    433     uint32 padded_row_size = (temp / unpack_alignment) * unpack_alignment;
    434     uint32 size_of_all_but_last_row;
    435     if (!SafeMultiplyUint32((height - 1), padded_row_size,
    436                             &size_of_all_but_last_row)) {
    437       return false;
    438     }
    439     if (!SafeAddUint32(size_of_all_but_last_row, row_size, size)) {
    440       return false;
    441     }
    442     if (ret_padded_row_size) {
    443       *ret_padded_row_size = padded_row_size;
    444     }
    445   } else {
    446     if (!SafeMultiplyUint32(height, row_size, size)) {
    447       return false;
    448     }
    449     if (ret_padded_row_size) {
    450       *ret_padded_row_size = row_size;
    451     }
    452   }
    453   if (ret_unpadded_row_size) {
    454     *ret_unpadded_row_size = row_size;
    455   }
    456 
    457   return true;
    458 }
    459 
    460 size_t GLES2Util::RenderbufferBytesPerPixel(int format) {
    461   switch (format) {
    462     case GL_STENCIL_INDEX8:
    463       return 1;
    464     case GL_RGBA4:
    465     case GL_RGB565:
    466     case GL_RGB5_A1:
    467     case GL_DEPTH_COMPONENT16:
    468       return 2;
    469     case GL_RGB:
    470     case GL_RGBA:
    471     case GL_DEPTH24_STENCIL8_OES:
    472     case GL_RGB8_OES:
    473     case GL_RGBA8_OES:
    474     case GL_DEPTH_COMPONENT24_OES:
    475       return 4;
    476     default:
    477       return 0;
    478   }
    479 }
    480 
    481 uint32 GLES2Util::GetGLDataTypeSizeForUniforms(int type) {
    482   switch (type) {
    483     case GL_FLOAT:
    484       return sizeof(GLfloat);              // NOLINT
    485     case GL_FLOAT_VEC2:
    486       return sizeof(GLfloat) * 2;          // NOLINT
    487     case GL_FLOAT_VEC3:
    488       return sizeof(GLfloat) * 3;          // NOLINT
    489     case GL_FLOAT_VEC4:
    490       return sizeof(GLfloat) * 4;          // NOLINT
    491     case GL_INT:
    492       return sizeof(GLint);                // NOLINT
    493     case GL_INT_VEC2:
    494       return sizeof(GLint) * 2;            // NOLINT
    495     case GL_INT_VEC3:
    496       return sizeof(GLint) * 3;            // NOLINT
    497     case GL_INT_VEC4:
    498       return sizeof(GLint) * 4;            // NOLINT
    499     case GL_BOOL:
    500       return sizeof(GLint);                // NOLINT
    501     case GL_BOOL_VEC2:
    502       return sizeof(GLint) * 2;            // NOLINT
    503     case GL_BOOL_VEC3:
    504       return sizeof(GLint) * 3;            // NOLINT
    505     case GL_BOOL_VEC4:
    506       return sizeof(GLint) * 4;            // NOLINT
    507     case GL_FLOAT_MAT2:
    508       return sizeof(GLfloat) * 2 * 2;      // NOLINT
    509     case GL_FLOAT_MAT3:
    510       return sizeof(GLfloat) * 3 * 3;      // NOLINT
    511     case GL_FLOAT_MAT4:
    512       return sizeof(GLfloat) * 4 * 4;      // NOLINT
    513     case GL_SAMPLER_2D:
    514       return sizeof(GLint);                // NOLINT
    515     case GL_SAMPLER_2D_RECT_ARB:
    516       return sizeof(GLint);                // NOLINT
    517     case GL_SAMPLER_CUBE:
    518       return sizeof(GLint);                // NOLINT
    519     case GL_SAMPLER_EXTERNAL_OES:
    520       return sizeof(GLint);                // NOLINT
    521     default:
    522       return 0;
    523   }
    524 }
    525 
    526 size_t GLES2Util::GetGLTypeSizeForTexturesAndBuffers(uint32 type) {
    527   switch (type) {
    528     case GL_BYTE:
    529       return sizeof(GLbyte);  // NOLINT
    530     case GL_UNSIGNED_BYTE:
    531       return sizeof(GLubyte);  // NOLINT
    532     case GL_SHORT:
    533       return sizeof(GLshort);  // NOLINT
    534     case GL_UNSIGNED_SHORT:
    535       return sizeof(GLushort);  // NOLINT
    536     case GL_INT:
    537       return sizeof(GLint);  // NOLINT
    538     case GL_UNSIGNED_INT:
    539       return sizeof(GLuint);  // NOLINT
    540     case GL_FLOAT:
    541       return sizeof(GLfloat);  // NOLINT
    542     case GL_FIXED:
    543       return sizeof(GLfixed);  // NOLINT
    544     default:
    545       return 0;
    546   }
    547 }
    548 
    549 uint32 GLES2Util::GLErrorToErrorBit(uint32 error) {
    550   switch (error) {
    551     case GL_INVALID_ENUM:
    552       return gl_error_bit::kInvalidEnum;
    553     case GL_INVALID_VALUE:
    554       return gl_error_bit::kInvalidValue;
    555     case GL_INVALID_OPERATION:
    556       return gl_error_bit::kInvalidOperation;
    557     case GL_OUT_OF_MEMORY:
    558       return gl_error_bit::kOutOfMemory;
    559     case GL_INVALID_FRAMEBUFFER_OPERATION:
    560       return gl_error_bit::kInvalidFrameBufferOperation;
    561     default:
    562       NOTREACHED();
    563       return gl_error_bit::kNoError;
    564   }
    565 }
    566 
    567 uint32 GLES2Util::GLErrorBitToGLError(uint32 error_bit) {
    568   switch (error_bit) {
    569     case gl_error_bit::kInvalidEnum:
    570       return GL_INVALID_ENUM;
    571     case gl_error_bit::kInvalidValue:
    572       return GL_INVALID_VALUE;
    573     case gl_error_bit::kInvalidOperation:
    574       return GL_INVALID_OPERATION;
    575     case gl_error_bit::kOutOfMemory:
    576       return GL_OUT_OF_MEMORY;
    577     case gl_error_bit::kInvalidFrameBufferOperation:
    578       return GL_INVALID_FRAMEBUFFER_OPERATION;
    579     default:
    580       NOTREACHED();
    581       return GL_NO_ERROR;
    582   }
    583 }
    584 
    585 uint32 GLES2Util::IndexToGLFaceTarget(int index) {
    586   static uint32 faces[] = {
    587     GL_TEXTURE_CUBE_MAP_POSITIVE_X,
    588     GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
    589     GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    590     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    591     GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    592     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
    593   };
    594   return faces[index];
    595 }
    596 
    597 size_t GLES2Util::GLTargetToFaceIndex(uint32 target) {
    598   switch (target) {
    599     case GL_TEXTURE_2D:
    600     case GL_TEXTURE_EXTERNAL_OES:
    601     case GL_TEXTURE_RECTANGLE_ARB:
    602       return 0;
    603     case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
    604       return 0;
    605     case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
    606       return 1;
    607     case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
    608       return 2;
    609     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
    610       return 3;
    611     case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
    612       return 4;
    613     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
    614       return 5;
    615     default:
    616       NOTREACHED();
    617       return 0;
    618   }
    619 }
    620 
    621 uint32 GLES2Util::GetPreferredGLReadPixelsFormat(uint32 internal_format) {
    622   switch (internal_format) {
    623     case GL_RGB16F_EXT:
    624     case GL_RGB32F_EXT:
    625       return GL_RGB;
    626     case GL_RGBA16F_EXT:
    627     case GL_RGBA32F_EXT:
    628       return GL_RGBA;
    629     default:
    630       return GL_RGBA;
    631   }
    632 }
    633 
    634 uint32 GLES2Util::GetPreferredGLReadPixelsType(
    635     uint32 internal_format, uint32 texture_type) {
    636   switch (internal_format) {
    637     case GL_RGBA32F_EXT:
    638     case GL_RGB32F_EXT:
    639       return GL_FLOAT;
    640     case GL_RGBA16F_EXT:
    641     case GL_RGB16F_EXT:
    642       return GL_HALF_FLOAT_OES;
    643     case GL_RGBA:
    644     case GL_RGB:
    645       // Unsized internal format, check the type
    646       switch (texture_type) {
    647         case GL_FLOAT:
    648         case GL_HALF_FLOAT_OES:
    649           return GL_FLOAT;
    650         default:
    651           return GL_UNSIGNED_BYTE;
    652       }
    653     default:
    654       return GL_UNSIGNED_BYTE;
    655   }
    656 }
    657 
    658 uint32 GLES2Util::GetChannelsForFormat(int format) {
    659   switch (format) {
    660     case GL_ALPHA:
    661     case GL_ALPHA16F_EXT:
    662     case GL_ALPHA32F_EXT:
    663       return kAlpha;
    664     case GL_LUMINANCE:
    665       return kRGB;
    666     case GL_LUMINANCE_ALPHA:
    667       return kRGBA;
    668     case GL_RGB:
    669     case GL_RGB8_OES:
    670     case GL_RGB565:
    671     case GL_RGB16F_EXT:
    672     case GL_RGB32F_EXT:
    673       return kRGB;
    674     case GL_BGRA_EXT:
    675     case GL_BGRA8_EXT:
    676     case GL_RGBA16F_EXT:
    677     case GL_RGBA32F_EXT:
    678     case GL_RGBA:
    679     case GL_RGBA8_OES:
    680     case GL_RGBA4:
    681     case GL_RGB5_A1:
    682       return kRGBA;
    683     case GL_DEPTH_COMPONENT32_OES:
    684     case GL_DEPTH_COMPONENT24_OES:
    685     case GL_DEPTH_COMPONENT16:
    686     case GL_DEPTH_COMPONENT:
    687       return kDepth;
    688     case GL_STENCIL_INDEX8:
    689       return kStencil;
    690     case GL_DEPTH_STENCIL_OES:
    691     case GL_DEPTH24_STENCIL8_OES:
    692       return kDepth | kStencil;
    693     default:
    694       return 0x0000;
    695   }
    696 }
    697 
    698 uint32 GLES2Util::GetChannelsNeededForAttachmentType(
    699     int type, uint32 max_color_attachments) {
    700   switch (type) {
    701     case GL_DEPTH_ATTACHMENT:
    702       return kDepth;
    703     case GL_STENCIL_ATTACHMENT:
    704       return kStencil;
    705     default:
    706       if (type >= GL_COLOR_ATTACHMENT0 &&
    707           type < static_cast<int>(
    708               GL_COLOR_ATTACHMENT0 + max_color_attachments)) {
    709         return kRGBA;
    710       }
    711       return 0x0000;
    712   }
    713 }
    714 
    715 std::string GLES2Util::GetStringEnum(uint32 value) {
    716   const EnumToString* entry = enum_to_string_table_;
    717   const EnumToString* end = entry + enum_to_string_table_len_;
    718   for (;entry < end; ++entry) {
    719     if (value == entry->value) {
    720       return entry->name;
    721     }
    722   }
    723   std::stringstream ss;
    724   ss.fill('0');
    725   ss.width(value < 0x10000 ? 4 : 8);
    726   ss << std::hex << value;
    727   return "0x" + ss.str();
    728 }
    729 
    730 std::string GLES2Util::GetStringError(uint32 value) {
    731   static EnumToString string_table[] = {
    732     { GL_NONE, "GL_NONE" },
    733   };
    734   return GLES2Util::GetQualifiedEnumString(
    735       string_table, arraysize(string_table), value);
    736 }
    737 
    738 std::string GLES2Util::GetStringBool(uint32 value) {
    739   return value ? "GL_TRUE" : "GL_FALSE";
    740 }
    741 
    742 std::string GLES2Util::GetQualifiedEnumString(
    743     const EnumToString* table, size_t count, uint32 value) {
    744   for (const EnumToString* end = table + count; table < end; ++table) {
    745     if (table->value == value) {
    746       return table->name;
    747     }
    748   }
    749   return GetStringEnum(value);
    750 }
    751 
    752 bool GLES2Util::ParseUniformName(
    753     const std::string& name,
    754     size_t* array_pos,
    755     int* element_index,
    756     bool* getting_array) {
    757   bool getting_array_location = false;
    758   size_t open_pos = std::string::npos;
    759   int index = 0;
    760   if (name[name.size() - 1] == ']') {
    761     if (name.size() < 3) {
    762       return false;
    763     }
    764     open_pos = name.find_last_of('[');
    765     if (open_pos == std::string::npos ||
    766         open_pos >= name.size() - 2) {
    767       return false;
    768     }
    769     size_t last = name.size() - 1;
    770     for (size_t pos = open_pos + 1; pos < last; ++pos) {
    771       int8 digit = name[pos] - '0';
    772       if (digit < 0 || digit > 9) {
    773         return false;
    774       }
    775       index = index * 10 + digit;
    776     }
    777     getting_array_location = true;
    778   }
    779   *getting_array = getting_array_location;
    780   *element_index = index;
    781   *array_pos = open_pos;
    782   return true;
    783 }
    784 
    785 namespace {
    786 
    787 // WebGraphicsContext3DCommandBufferImpl configuration attributes. Those in
    788 // the 16-bit range are the same as used by EGL. Those outside the 16-bit range
    789 // are unique to Chromium. Attributes are matched using a closest fit algorithm.
    790 
    791 // From <EGL/egl.h>.
    792 const int32 kAlphaSize       = 0x3021;  // EGL_ALPHA_SIZE
    793 const int32 kBlueSize        = 0x3022;  // EGL_BLUE_SIZE
    794 const int32 kGreenSize       = 0x3023;  // EGL_GREEN_SIZE
    795 const int32 kRedSize         = 0x3024;  // EGL_RED_SIZE
    796 const int32 kDepthSize       = 0x3025;  // EGL_DEPTH_SIZE
    797 const int32 kStencilSize     = 0x3026;  // EGL_STENCIL_SIZE
    798 const int32 kSamples         = 0x3031;  // EGL_SAMPLES
    799 const int32 kSampleBuffers   = 0x3032;  // EGL_SAMPLE_BUFFERS
    800 const int32 kNone            = 0x3038;  // EGL_NONE
    801 const int32 kSwapBehavior    = 0x3093;  // EGL_SWAP_BEHAVIOR
    802 const int32 kBufferPreserved = 0x3094;  // EGL_BUFFER_PRESERVED
    803 const int32 kBufferDestroyed = 0x3095;  // EGL_BUFFER_DESTROYED
    804 
    805 // Chromium only.
    806 const int32 kBindGeneratesResource = 0x10000;
    807 const int32 kFailIfMajorPerfCaveat = 0x10001;
    808 const int32 kLoseContextWhenOutOfMemory = 0x10002;
    809 
    810 }  // namespace
    811 
    812 ContextCreationAttribHelper::ContextCreationAttribHelper()
    813     : alpha_size(-1),
    814       blue_size(-1),
    815       green_size(-1),
    816       red_size(-1),
    817       depth_size(-1),
    818       stencil_size(-1),
    819       samples(-1),
    820       sample_buffers(-1),
    821       buffer_preserved(true),
    822       bind_generates_resource(true),
    823       fail_if_major_perf_caveat(false),
    824       lose_context_when_out_of_memory(false) {}
    825 
    826 void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) const {
    827   if (alpha_size != -1) {
    828     attribs->push_back(kAlphaSize);
    829     attribs->push_back(alpha_size);
    830   }
    831   if (blue_size != -1) {
    832     attribs->push_back(kBlueSize);
    833     attribs->push_back(blue_size);
    834   }
    835   if (green_size != -1) {
    836     attribs->push_back(kGreenSize);
    837     attribs->push_back(green_size);
    838   }
    839   if (red_size != -1) {
    840     attribs->push_back(kRedSize);
    841     attribs->push_back(red_size);
    842   }
    843   if (depth_size != -1) {
    844     attribs->push_back(kDepthSize);
    845     attribs->push_back(depth_size);
    846   }
    847   if (stencil_size != -1) {
    848     attribs->push_back(kStencilSize);
    849     attribs->push_back(stencil_size);
    850   }
    851   if (samples != -1) {
    852     attribs->push_back(kSamples);
    853     attribs->push_back(samples);
    854   }
    855   if (sample_buffers != -1) {
    856     attribs->push_back(kSampleBuffers);
    857     attribs->push_back(sample_buffers);
    858   }
    859   attribs->push_back(kSwapBehavior);
    860   attribs->push_back(buffer_preserved ? kBufferPreserved : kBufferDestroyed);
    861   attribs->push_back(kBindGeneratesResource);
    862   attribs->push_back(bind_generates_resource ? 1 : 0);
    863   attribs->push_back(kFailIfMajorPerfCaveat);
    864   attribs->push_back(fail_if_major_perf_caveat ? 1 : 0);
    865   attribs->push_back(kLoseContextWhenOutOfMemory);
    866   attribs->push_back(lose_context_when_out_of_memory ? 1 : 0);
    867   attribs->push_back(kNone);
    868 }
    869 
    870 bool ContextCreationAttribHelper::Parse(const std::vector<int32>& attribs) {
    871   for (size_t i = 0; i < attribs.size(); i += 2) {
    872     const int32 attrib = attribs[i];
    873     if (i + 1 >= attribs.size()) {
    874       if (attrib == kNone) {
    875         return true;
    876       }
    877 
    878       DLOG(ERROR) << "Missing value after context creation attribute: "
    879                   << attrib;
    880       return false;
    881     }
    882 
    883     const int32 value = attribs[i+1];
    884     switch (attrib) {
    885       case kAlphaSize:
    886         alpha_size = value;
    887         break;
    888       case kBlueSize:
    889         blue_size = value;
    890         break;
    891       case kGreenSize:
    892         green_size = value;
    893         break;
    894       case kRedSize:
    895         red_size = value;
    896         break;
    897       case kDepthSize:
    898         depth_size = value;
    899         break;
    900       case kStencilSize:
    901         stencil_size = value;
    902         break;
    903       case kSamples:
    904         samples = value;
    905         break;
    906       case kSampleBuffers:
    907         sample_buffers = value;
    908         break;
    909       case kSwapBehavior:
    910         buffer_preserved = value == kBufferPreserved;
    911         break;
    912       case kBindGeneratesResource:
    913         bind_generates_resource = value != 0;
    914         break;
    915       case kFailIfMajorPerfCaveat:
    916         fail_if_major_perf_caveat = value != 0;
    917         break;
    918       case kLoseContextWhenOutOfMemory:
    919         lose_context_when_out_of_memory = value != 0;
    920         break;
    921       case kNone:
    922         // Terminate list, even if more attributes.
    923         return true;
    924       default:
    925         DLOG(ERROR) << "Invalid context creation attribute: " << attrib;
    926         return false;
    927     }
    928   }
    929 
    930   return true;
    931 }
    932 
    933 #include "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h"
    934 
    935 }  // namespace gles2
    936 }  // namespace gpu
    937 
    938