15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is here so other GLES2 related files can have a common set of
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// includes where appropriate.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gl_error_bit {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GLErrorBit {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNoError = 0,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInvalidEnum = (1 << 0),
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInvalidValue = (1 << 1),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInvalidOperation = (1 << 2),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kOutOfMemory = (1 << 3),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInvalidFrameBufferOperation = (1 << 4)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GLES2Util::GLGetNumValuesReturned(int id) const {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (id) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetBooleanv, glGetFloatv, glGetIntergerv
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ACTIVE_TEXTURE:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALIASED_LINE_WIDTH_RANGE:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALIASED_POINT_SIZE_RANGE:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALPHA_BITS:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ARRAY_BUFFER_BINDING:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_COLOR:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_DST_ALPHA:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_DST_RGB:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_EQUATION_ALPHA:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_EQUATION_RGB:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_SRC_ALPHA:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND_SRC_RGB:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLUE_BITS:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_COLOR_CLEAR_VALUE:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_COLOR_WRITEMASK:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_COMPRESSED_TEXTURE_FORMATS:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return num_compressed_texture_formats_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_CULL_FACE:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_CULL_FACE_MODE:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_CURRENT_PROGRAM:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_BITS:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_CLEAR_VALUE:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_FUNC:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_RANGE:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_TEST:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_WRITEMASK:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DITHER:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ELEMENT_ARRAY_BUFFER_BINDING:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAMEBUFFER_BINDING:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRONT_FACE:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_GENERATE_MIPMAP_HINT:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_GREEN_BITS:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LINE_WIDTH:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_RENDERBUFFER_SIZE:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_TEXTURE_IMAGE_UNITS:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_TEXTURE_SIZE:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_VARYING_VECTORS:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_VERTEX_ATTRIBS:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_VERTEX_UNIFORM_VECTORS:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_VIEWPORT_DIMS:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_NUM_SHADER_BINARY_FORMATS:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_PACK_ALIGNMENT:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_POLYGON_OFFSET_FACTOR:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_POLYGON_OFFSET_UNITS:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RED_BITS:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_BINDING:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLE_BUFFERS:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLE_COVERAGE_INVERT:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLE_COVERAGE_VALUE:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLES:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SCISSOR_BOX:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SCISSOR_TEST:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHADER_BINARY_FORMATS:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return num_shader_binary_formats_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHADER_COMPILER:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_FAIL:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_FUNC:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_PASS_DEPTH_PASS:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_REF:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_VALUE_MASK:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BACK_WRITEMASK:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_BITS:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_CLEAR_VALUE:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_FAIL:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_FUNC:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_PASS_DEPTH_FAIL:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_PASS_DEPTH_PASS:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_REF:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_TEST:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_VALUE_MASK:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_WRITEMASK:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SUBPIXEL_BITS:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_BINDING_2D:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_BINDING_CUBE_MAP:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_BINDING_EXTERNAL_OES:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_BINDING_RECTANGLE_ARB:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return 1;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNPACK_ALIGNMENT:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VIEWPORT:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetBooleanv, glGetFloatv, glGetIntergerv with
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //    GL_CHROMIUM_framebuffer_multisample
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_SAMPLES_EXT:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetBufferParameteriv
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BUFFER_SIZE:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BUFFER_USAGE:
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetFramebufferAttachmentParameteriv
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // -- glGetFramebufferAttachmentParameteriv with
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    //    GL_EXT_multisampled_render_to_texture
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT:
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return 1;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // -- glGetProgramiv
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DELETE_STATUS:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LINK_STATUS:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VALIDATE_STATUS:
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INFO_LOG_LENGTH:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ATTACHED_SHADERS:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ACTIVE_ATTRIBUTES:
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ACTIVE_UNIFORMS:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetRenderbufferAttachmentParameteriv
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_WIDTH:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_HEIGHT:
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_INTERNAL_FORMAT:
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_RED_SIZE:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_GREEN_SIZE:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_BLUE_SIZE:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_ALPHA_SIZE:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_DEPTH_SIZE:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RENDERBUFFER_STENCIL_SIZE:
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // -- glGetRenderbufferAttachmentParameteriv with
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    //    GL_EXT_multisampled_render_to_texture
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case GL_RENDERBUFFER_SAMPLES_EXT:
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return 1;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetShaderiv
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHADER_TYPE:
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Already defined under glGetFramebufferAttachemntParameteriv.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // case GL_DELETE_STATUS:
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   return 1;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_COMPILE_STATUS:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Already defined under glGetFramebufferAttachemntParameteriv.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // case GL_INFO_LOG_LENGTH:
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   return 1;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHADER_SOURCE_LENGTH:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetTexParameterfv, glGetTexParameteriv
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_MAG_FILTER:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_MIN_FILTER:
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_WRAP_S:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_WRAP_T:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glGetVertexAttribfv, glGetVertexAttribiv
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_SIZE:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_TYPE:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_CURRENT_VERTEX_ATTRIB:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -- glHint with GL_OES_standard_derivatives
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // bad enum
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the number of elements per group of a specified format.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ElementsPerGroup(int format, int type) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_5_6_5:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_4_4_4_4:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_5_5_5_1:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_INT_24_8_OES:
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 1;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       break;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (format) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB:
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 3;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LUMINANCE_ALPHA:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 2;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BGRA_EXT:
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 4;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALPHA:
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LUMINANCE:
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT:
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT24_OES:
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT32_OES:
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT16:
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH24_STENCIL8_OES:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_STENCIL_OES:
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 1;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 0;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the number of bytes per element, based on the element type.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BytesPerElement(int type) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_INT_24_8_OES:
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_INT:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_HALF_FLOAT_OES:
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT:
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHORT:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_5_6_5:
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_4_4_4_4:
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT_5_5_5_1:
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 2;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_BYTE:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BYTE:
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 1;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return 0;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::ComputeImageGroupSize(int format, int type) {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BytesPerElement(type) * ElementsPerGroup(format, type);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2Util::ComputeImagePaddedRowSize(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int width, int format, int type, int unpack_alignment,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32* padded_row_size) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 bytes_per_group = ComputeImageGroupSize(format, type);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 unpadded_row_size;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeAddUint32(unpadded_row_size, unpack_alignment - 1, &temp)) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *padded_row_size = (temp / unpack_alignment) * unpack_alignment;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the amount of data glTexImage2D or glTexSubImage2D will access.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2Util::ComputeImageDataSizes(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int width, int height, int format, int type, int unpack_alignment,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32* size, uint32* ret_unpadded_row_size, uint32* ret_padded_row_size) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 bytes_per_group = ComputeImageGroupSize(format, type);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 row_size;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(width, bytes_per_group, &row_size)) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height > 1) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 temp;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SafeAddUint32(row_size, unpack_alignment - 1, &temp)) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 padded_row_size = (temp / unpack_alignment) * unpack_alignment;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 size_of_all_but_last_row;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SafeMultiplyUint32((height - 1), padded_row_size,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &size_of_all_but_last_row)) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SafeAddUint32(size_of_all_but_last_row, row_size, size)) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret_padded_row_size) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *ret_padded_row_size = padded_row_size;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SafeMultiplyUint32(height, row_size, size)) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret_padded_row_size) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *ret_padded_row_size = row_size;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ret_unpadded_row_size) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ret_unpadded_row_size = row_size;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t GLES2Util::RenderbufferBytesPerPixel(int format) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (format) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_INDEX8:
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA4:
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB565:
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB5_A1:
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT16:
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA:
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH24_STENCIL8_OES:
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB8_OES:
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA8_OES:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT24_OES:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 4;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::GetGLDataTypeSizeForUniforms(int type) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT:
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat);              // NOLINT
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC2:
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 2;          // NOLINT
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC3:
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 3;          // NOLINT
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC4:
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 4;          // NOLINT
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT:
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC2:
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 2;            // NOLINT
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC3:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 3;            // NOLINT
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC4:
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 4;            // NOLINT
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL:
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC2:
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 2;            // NOLINT
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC3:
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 3;            // NOLINT
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC4:
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint) * 4;            // NOLINT
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT2:
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 2 * 2;      // NOLINT
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT3:
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 3 * 3;      // NOLINT
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT4:
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat) * 4 * 4;      // NOLINT
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_2D:
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_2D_RECT_ARB:
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_CUBE:
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_EXTERNAL_OES:
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);                // NOLINT
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t GLES2Util::GetGLTypeSizeForTexturesAndBuffers(uint32 type) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BYTE:
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLbyte);  // NOLINT
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_BYTE:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLubyte);  // NOLINT
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SHORT:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLshort);  // NOLINT
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_SHORT:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLushort);  // NOLINT
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT:
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLint);  // NOLINT
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_UNSIGNED_INT:
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLuint);  // NOLINT
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT:
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfloat);  // NOLINT
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FIXED:
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(GLfixed);  // NOLINT
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::GLErrorToErrorBit(uint32 error) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (error) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INVALID_ENUM:
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kInvalidEnum;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INVALID_VALUE:
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kInvalidValue;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INVALID_OPERATION:
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kInvalidOperation;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_OUT_OF_MEMORY:
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kOutOfMemory;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INVALID_FRAMEBUFFER_OPERATION:
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kInvalidFrameBufferOperation;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gl_error_bit::kNoError;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::GLErrorBitToGLError(uint32 error_bit) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (error_bit) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case gl_error_bit::kInvalidEnum:
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_INVALID_ENUM;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case gl_error_bit::kInvalidValue:
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_INVALID_VALUE;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case gl_error_bit::kInvalidOperation:
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_INVALID_OPERATION;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case gl_error_bit::kOutOfMemory:
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_OUT_OF_MEMORY;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case gl_error_bit::kInvalidFrameBufferOperation:
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_INVALID_FRAMEBUFFER_OPERATION;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GL_NO_ERROR;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::IndexToGLFaceTarget(int index) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static uint32 faces[] = {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return faces[index];
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)uint32 GLES2Util::GetPreferredGLReadPixelsFormat(uint32 internal_format) {
594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  switch (internal_format) {
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGB16F_EXT:
596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGB32F_EXT:
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_RGB;
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGBA16F_EXT:
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGBA32F_EXT:
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_RGBA;
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    default:
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_RGBA;
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)uint32 GLES2Util::GetPreferredGLReadPixelsType(
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32 internal_format, uint32 texture_type) {
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  switch (internal_format) {
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGBA32F_EXT:
610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGB32F_EXT:
611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_FLOAT;
612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGBA16F_EXT:
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGB16F_EXT:
614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_HALF_FLOAT_OES;
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGBA:
616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case GL_RGB:
617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // Unsized internal format, check the type
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      switch (texture_type) {
619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        case GL_FLOAT:
620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        case GL_HALF_FLOAT_OES:
621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          return GL_FLOAT;
622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        default:
623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          return GL_UNSIGNED_BYTE;
624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    default:
626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return GL_UNSIGNED_BYTE;
627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GLES2Util::GetChannelsForFormat(int format) {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (format) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALPHA:
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALPHA16F_EXT:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_ALPHA32F_EXT:
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kAlpha;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LUMINANCE:
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kRGB;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_LUMINANCE_ALPHA:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kRGBA;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB:
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB8_OES:
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB565:
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB16F_EXT:
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB32F_EXT:
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kRGB;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BGRA_EXT:
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BGRA8_EXT:
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA16F_EXT:
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA32F_EXT:
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA:
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA8_OES:
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGBA4:
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_RGB5_A1:
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kRGBA;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT32_OES:
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT24_OES:
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT16:
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_COMPONENT:
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kDepth;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_INDEX8:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kStencil;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_STENCIL_OES:
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH24_STENCIL8_OES:
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kDepth | kStencil;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0x0000;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GLES2Util::GetChannelsNeededForAttachmentType(
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type, uint32 max_color_attachments) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_ATTACHMENT:
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kDepth;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_ATTACHMENT:
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kStencil;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (type >= GL_COLOR_ATTACHMENT0 &&
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          type < static_cast<int>(
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GL_COLOR_ATTACHMENT0 + max_color_attachments)) {
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return kRGBA;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0x0000;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GLES2Util::GetStringEnum(uint32 value) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const EnumToString* entry = enum_to_string_table_;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const EnumToString* end = entry + enum_to_string_table_len_;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (;entry < end; ++entry) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == entry->value) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return entry->name;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[20];
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sprintf(buffer, (value < 0x10000) ? "0x%04x" : "0x%08x", value);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GLES2Util::GetStringError(uint32 value) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static EnumToString string_table[] = {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GL_NONE, "GL_NONE" },
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GLES2Util::GetQualifiedEnumString(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_table, arraysize(string_table), value);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GLES2Util::GetStringBool(uint32 value) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value ? "GL_TRUE" : "GL_FALSE";
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GLES2Util::GetQualifiedEnumString(
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const EnumToString* table, size_t count, uint32 value) {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (const EnumToString* end = table + count; table < end; ++table) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (table->value == value) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return table->name;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetStringEnum(value);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2Util::ParseUniformName(
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t* array_pos,
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* element_index,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* getting_array) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool getting_array_location = false;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t open_pos = std::string::npos;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (name[name.size() - 1] == ']') {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name.size() < 3) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    open_pos = name.find_last_of('[');
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (open_pos == std::string::npos ||
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        open_pos >= name.size() - 2) {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t last = name.size() - 1;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t pos = open_pos + 1; pos < last; ++pos) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int8 digit = name[pos] - '0';
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (digit < 0 || digit > 9) {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index = index * 10 + digit;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getting_array_location = true;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *getting_array = getting_array_location;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *element_index = index;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *array_pos = open_pos;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// From <EGL/egl.h>.
7583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kAlphaSize       = 0x3021;  // EGL_ALPHA_SIZE
7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kBlueSize        = 0x3022;  // EGL_BLUE_SIZE
7603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kGreenSize       = 0x3023;  // EGL_GREEN_SIZE
7613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kRedSize         = 0x3024;  // EGL_RED_SIZE
7623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kDepthSize       = 0x3025;  // EGL_DEPTH_SIZE
7633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kStencilSize     = 0x3026;  // EGL_STENCIL_SIZE
7643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kSamples         = 0x3031;  // EGL_SAMPLES
7653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kSampleBuffers   = 0x3032;  // EGL_SAMPLE_BUFFERS
7663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kNone            = 0x3038;  // EGL_NONE
7673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kSwapBehavior    = 0x3093;  // EGL_SWAP_BEHAVIOR
7683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kBufferPreserved = 0x3094;  // EGL_BUFFER_PRESERVED
7693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kBufferDestroyed = 0x3095;  // EGL_BUFFER_DESTROYED
7703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Chromium only.
7723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kShareResources        = 0x10000;
7733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int32 kBindGeneratesResource = 0x10001;
774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const int32 kFailIfMajorPerfCaveat = 0x10002;
7753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
7773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ContextCreationAttribHelper::ContextCreationAttribHelper()
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : alpha_size_(-1),
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blue_size_(-1),
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    green_size_(-1),
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    red_size_(-1),
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    depth_size_(-1),
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stencil_size_(-1),
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    samples_(-1),
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sample_buffers_(-1),
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer_preserved_(true),
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    share_resources_(false),
789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bind_generates_resource_(true),
790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fail_if_major_perf_caveat_(false) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) {
7943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (alpha_size_ != -1) {
7953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kAlphaSize);
7963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(alpha_size_);
7973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
7983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (blue_size_ != -1) {
7993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kBlueSize);
8003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(blue_size_);
8013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (green_size_ != -1) {
8033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kGreenSize);
8043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(green_size_);
8053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (red_size_ != -1) {
8073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kRedSize);
8083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(red_size_);
8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (depth_size_ != -1) {
8113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kDepthSize);
8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(depth_size_);
8133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (stencil_size_ != -1) {
8153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kStencilSize);
8163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(stencil_size_);
8173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (samples_ != -1) {
8193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kSamples);
8203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(samples_);
8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (sample_buffers_ != -1) {
8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(kSampleBuffers);
8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attribs->push_back(sample_buffers_);
8253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(kSwapBehavior);
8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(buffer_preserved_ ? kBufferPreserved : kBufferDestroyed);
8283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(kShareResources);
8293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(share_resources_ ? 1 : 0);
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(kBindGeneratesResource);
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(bind_generates_resource_ ? 1 : 0);
832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  attribs->push_back(kFailIfMajorPerfCaveat);
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  attribs->push_back(fail_if_major_perf_caveat_ ? 1 : 0);
8343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attribs->push_back(kNone);
8353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ContextCreationAttribHelper::Parse(const std::vector<int32>& attribs) {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < attribs.size(); i += 2) {
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int32 attrib = attribs[i];
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i + 1 >= attribs.size()) {
8413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (attrib == kNone) {
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      DLOG(ERROR) << "Missing value after context creation attribute: "
846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  << attrib;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int32 value = attribs[i+1];
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (attrib) {
8523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kAlphaSize:
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        alpha_size_ = value;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kBlueSize:
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        blue_size_ = value;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kGreenSize:
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        green_size_ = value;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kRedSize:
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        red_size_ = value;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kDepthSize:
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        depth_size_ = value;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kStencilSize:
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        stencil_size_ = value;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kSamples:
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        samples_ = value;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kSampleBuffers:
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sample_buffers_ = value;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kSwapBehavior:
8773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        buffer_preserved_ = value == kBufferPreserved;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kShareResources:
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        share_resources_ = value != 0;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kBindGeneratesResource:
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bind_generates_resource_ = value != 0;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case kFailIfMajorPerfCaveat:
886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        fail_if_major_perf_caveat_ = value != 0;
887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        break;
8883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kNone:
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Terminate list, even if more attributes.
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        DLOG(ERROR) << "Invalid context creation attribute: " << attrib;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h"
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905