// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is here so other GLES2 related files can have a common set of // includes where appropriate. #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" namespace gpu { namespace gles2 { int GLES2Util::GLGetNumValuesReturned(int id) const { switch (id) { // -- glGetBooleanv, glGetFloatv, glGetIntergerv case GL_ACTIVE_TEXTURE: return 1; case GL_ALIASED_LINE_WIDTH_RANGE: return 2; case GL_ALIASED_POINT_SIZE_RANGE: return 1; case GL_ALPHA_BITS: return 1; case GL_ARRAY_BUFFER_BINDING: return 1; case GL_BLEND: return 1; case GL_BLEND_COLOR: return 4; case GL_BLEND_DST_ALPHA: return 1; case GL_BLEND_DST_RGB: return 1; case GL_BLEND_EQUATION_ALPHA: return 1; case GL_BLEND_EQUATION_RGB: return 1; case GL_BLEND_SRC_ALPHA: return 1; case GL_BLEND_SRC_RGB: return 1; case GL_BLUE_BITS: return 1; case GL_COLOR_CLEAR_VALUE: return 4; case GL_COLOR_WRITEMASK: return 4; case GL_COMPRESSED_TEXTURE_FORMATS: return num_compressed_texture_formats_; case GL_CULL_FACE: return 1; case GL_CULL_FACE_MODE: return 1; case GL_CURRENT_PROGRAM: return 1; case GL_DEPTH_BITS: return 1; case GL_DEPTH_CLEAR_VALUE: return 1; case GL_DEPTH_FUNC: return 1; case GL_DEPTH_RANGE: return 2; case GL_DEPTH_TEST: return 1; case GL_DEPTH_WRITEMASK: return 1; case GL_DITHER: return 1; case GL_ELEMENT_ARRAY_BUFFER_BINDING: return 1; case GL_FRAMEBUFFER_BINDING: return 1; case GL_FRONT_FACE: return 1; case GL_GENERATE_MIPMAP_HINT: return 1; case GL_GREEN_BITS: return 1; case GL_IMPLEMENTATION_COLOR_READ_FORMAT: return 1; case GL_IMPLEMENTATION_COLOR_READ_TYPE: return 1; case GL_LINE_WIDTH: return 1; case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: return 1; case GL_MAX_CUBE_MAP_TEXTURE_SIZE: return 1; case GL_MAX_FRAGMENT_UNIFORM_VECTORS: return 1; case GL_MAX_RENDERBUFFER_SIZE: return 1; case GL_MAX_TEXTURE_IMAGE_UNITS: return 1; case GL_MAX_TEXTURE_SIZE: return 1; case GL_MAX_VARYING_VECTORS: return 1; case GL_MAX_VERTEX_ATTRIBS: return 1; case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: return 1; case GL_MAX_VERTEX_UNIFORM_VECTORS: return 1; case GL_MAX_VIEWPORT_DIMS: return 2; case GL_NUM_COMPRESSED_TEXTURE_FORMATS: return 1; case GL_PACK_ALIGNMENT: return 1; case GL_POLYGON_OFFSET_FACTOR: return 1; case GL_POLYGON_OFFSET_FILL: return 1; case GL_POLYGON_OFFSET_UNITS: return 1; case GL_RED_BITS: return 1; case GL_RENDERBUFFER_BINDING: return 1; case GL_SAMPLE_BUFFERS: return 1; case GL_SAMPLE_COVERAGE_INVERT: return 1; case GL_SAMPLE_COVERAGE_VALUE: return 1; case GL_SAMPLES: return 1; case GL_SCISSOR_BOX: return 4; case GL_SCISSOR_TEST: return 1; case GL_SHADER_COMPILER: return 1; case GL_STENCIL_BACK_FAIL: return 1; case GL_STENCIL_BACK_FUNC: return 1; case GL_STENCIL_BACK_PASS_DEPTH_FAIL: return 1; case GL_STENCIL_BACK_PASS_DEPTH_PASS: return 1; case GL_STENCIL_BACK_REF: return 1; case GL_STENCIL_BACK_VALUE_MASK: return 1; case GL_STENCIL_BACK_WRITEMASK: return 1; case GL_STENCIL_BITS: return 1; case GL_STENCIL_CLEAR_VALUE: return 1; case GL_STENCIL_FAIL: return 1; case GL_STENCIL_FUNC: return 1; case GL_STENCIL_PASS_DEPTH_FAIL: return 1; case GL_STENCIL_PASS_DEPTH_PASS: return 1; case GL_STENCIL_REF: return 1; case GL_STENCIL_TEST: return 1; case GL_STENCIL_VALUE_MASK: return 1; case GL_STENCIL_WRITEMASK: return 1; case GL_SUBPIXEL_BITS: return 1; case GL_TEXTURE_BINDING_2D: return 1; case GL_TEXTURE_BINDING_CUBE_MAP: return 1; case GL_UNPACK_ALIGNMENT: return 1; case GL_VIEWPORT: return 4; // -- glGetBufferParameteriv case GL_BUFFER_SIZE: return 1; case GL_BUFFER_USAGE: return 1; // -- glGetFramebufferAttachmentParameteriv case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: return 1; case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: return 1; case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: return 1; case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: return 1; // -- glGetFramebufferAttachmentParameteriv case GL_DELETE_STATUS: return 1; case GL_LINK_STATUS: return 1; case GL_VALIDATE_STATUS: return 1; case GL_INFO_LOG_LENGTH: return 1; case GL_ATTACHED_SHADERS: return 1; case GL_ACTIVE_ATTRIBUTES: return 1; case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: return 1; case GL_ACTIVE_UNIFORMS: return 1; case GL_ACTIVE_UNIFORM_MAX_LENGTH: return 1; // -- glGetRenderbufferAttachmentParameteriv case GL_RENDERBUFFER_WIDTH: return 1; case GL_RENDERBUFFER_HEIGHT: return 1; case GL_RENDERBUFFER_INTERNAL_FORMAT: return 1; case GL_RENDERBUFFER_RED_SIZE: return 1; case GL_RENDERBUFFER_GREEN_SIZE: return 1; case GL_RENDERBUFFER_BLUE_SIZE: return 1; case GL_RENDERBUFFER_ALPHA_SIZE: return 1; case GL_RENDERBUFFER_DEPTH_SIZE: return 1; case GL_RENDERBUFFER_STENCIL_SIZE: return 1; // -- glGetShaderiv case GL_SHADER_TYPE: return 1; // Already defined under glGetFramebufferAttachemntParameteriv. // case GL_DELETE_STATUS: // return 1; case GL_COMPILE_STATUS: return 1; // Already defined under glGetFramebufferAttachemntParameteriv. // case GL_INFO_LOG_LENGTH: // return 1; case GL_SHADER_SOURCE_LENGTH: return 1; // -- glGetTexParameterfv, glGetTexParameteriv case GL_TEXTURE_MAG_FILTER: return 1; case GL_TEXTURE_MIN_FILTER: return 1; case GL_TEXTURE_WRAP_S: return 1; case GL_TEXTURE_WRAP_T: return 1; // -- glGetVertexAttribfv, glGetVertexAttribiv case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: return 1; case GL_VERTEX_ATTRIB_ARRAY_ENABLED: return 1; case GL_VERTEX_ATTRIB_ARRAY_SIZE: return 1; case GL_VERTEX_ATTRIB_ARRAY_STRIDE: return 1; case GL_VERTEX_ATTRIB_ARRAY_TYPE: return 1; case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: return 1; case GL_CURRENT_VERTEX_ATTRIB: return 4; // bad enum default: return 0; } } namespace { // Return the number of elements per group of a specified format. int ElementsPerGroup(int format, int type) { switch (type) { case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_5_5_5_1: return 1; default: break; } switch (format) { case GL_RGB: return 3; case GL_LUMINANCE_ALPHA: return 2; case GL_RGBA: return 4; case GL_ALPHA: case GL_LUMINANCE: return 1; default: return 0; } } // Return the number of bytes per element, based on the element type. int BytesPerElement(int type) { switch (type) { case GL_UNSIGNED_SHORT: case GL_SHORT: case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_5_5_5_1: return 2; case GL_UNSIGNED_BYTE: case GL_BYTE: return 1; default: return 0; } } } // anonymous namespace // Returns the amount of data glTexImage2D or glTexSubImage2D will access. uint32 GLES2Util::ComputeImageDataSize( int width, int height, int format, int type, int unpack_alignment) { uint32 bytes_per_group = BytesPerElement(type) * ElementsPerGroup(format, type); uint32 row_size = width * bytes_per_group; if (height > 1) { uint32 padded_row_size = ((row_size + unpack_alignment - 1) / unpack_alignment) * unpack_alignment; return (height - 1) * padded_row_size + row_size; } return height * row_size; } } // namespace gles2 } // namespace gpu