blob: a05b8dfa8b638a7c3bb53f6efda4b618d800c3cf [file] [log] [blame]
/*
* Copyright 2015, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
template<typename T> T inline min(T a, T b) { return (a < b) ? a : b; }
template<typename T> T inline max(T a, T b) { return (a > b) ? a : b; }
inline uint32_t minIndex(const uint8_t* indices, uint32_t indices_type, uint32_t offset, uint32_t count) {
uint32_t v = ~(uint32_t)0;
switch (indices_type) {
case gapii::GLenum::GL_UNSIGNED_BYTE: {
const uint8_t* p = reinterpret_cast<const uint8_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = min<uint32_t>(v, p[i]); }
break;
}
case gapii::GLenum::GL_UNSIGNED_SHORT: {
const uint16_t* p = reinterpret_cast<const uint16_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = min<uint32_t>(v, p[i]); }
break;
}
case gapii::GLenum::GL_UNSIGNED_INT: {
const uint32_t* p = reinterpret_cast<const uint32_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = min<uint32_t>(v, p[i]); }
break;
}
}
return v;
}
inline uint32_t maxIndex(const uint8_t* indices, uint32_t indices_type, uint32_t offset, uint32_t count) {
uint32_t v = 0;
switch (indices_type) {
case gapii::GLenum::GL_UNSIGNED_BYTE: {
const uint8_t* p = reinterpret_cast<const uint8_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = max<uint32_t>(v, p[i]); }
break;
}
case gapii::GLenum::GL_UNSIGNED_SHORT: {
const uint16_t* p = reinterpret_cast<const uint16_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = max<uint32_t>(v, p[i]); }
break;
}
case gapii::GLenum::GL_UNSIGNED_INT: {
const uint32_t* p = reinterpret_cast<const uint32_t*>(&indices[offset]);
for (uint32_t i = 0; i < count; i++) { v = max<uint32_t>(v, p[i]); }
break;
}
}
return v;
}
inline int stateVariableSize(uint32_t v) {
switch (v) {
case GLenum::GL_ACTIVE_TEXTURE:
return 1;
case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:
return 2;
case GLenum::GL_ALIASED_POINT_SIZE_RANGE:
return 2;
case GLenum::GL_ALPHA_BITS:
return 1;
case GLenum::GL_ARRAY_BUFFER_BINDING:
return 1;
case GLenum::GL_BLEND:
return 1;
case GLenum::GL_BLEND_COLOR:
return 4;
case GLenum::GL_BLEND_DST_ALPHA:
return 1;
case GLenum::GL_BLEND_DST_RGB:
return 1;
case GLenum::GL_BLEND_EQUATION_ALPHA:
return 1;
case GLenum::GL_BLEND_EQUATION_RGB:
return 1;
case GLenum::GL_BLEND_SRC_ALPHA:
return 1;
case GLenum::GL_BLEND_SRC_RGB:
return 1;
case GLenum::GL_BLUE_BITS:
return 1;
case GLenum::GL_COLOR_CLEAR_VALUE:
return 4;
case GLenum::GL_COLOR_WRITEMASK:
return 4;
case GLenum::GL_CULL_FACE:
return 1;
case GLenum::GL_CULL_FACE_MODE:
return 1;
case GLenum::GL_CURRENT_PROGRAM:
return 1;
case GLenum::GL_DEPTH_BITS:
return 1;
case GLenum::GL_DEPTH_CLEAR_VALUE:
return 1;
case GLenum::GL_DEPTH_FUNC:
return 1;
case GLenum::GL_DEPTH_RANGE:
return 2;
case GLenum::GL_DEPTH_TEST:
return 1;
case GLenum::GL_DEPTH_WRITEMASK:
return 1;
case GLenum::GL_DITHER:
return 1;
case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:
return 1;
case GLenum::GL_FRAMEBUFFER_BINDING:
return 1;
case GLenum::GL_FRONT_FACE:
return 1;
case GLenum::GL_GENERATE_MIPMAP_HINT:
return 1;
case GLenum::GL_GREEN_BITS:
return 1;
case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:
return 1;
case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:
return 1;
case GLenum::GL_LINE_WIDTH:
return 1;
case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
return 1;
case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:
return 1;
case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:
return 1;
case GLenum::GL_MAX_RENDERBUFFER_SIZE:
return 1;
case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:
return 1;
case GLenum::GL_MAX_TEXTURE_SIZE:
return 1;
case GLenum::GL_MAX_VARYING_VECTORS:
return 1;
case GLenum::GL_MAX_VERTEX_ATTRIBS:
return 1;
case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
return 1;
case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:
return 1;
case GLenum::GL_MAX_VIEWPORT_DIMS:
return 2;
case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:
return 1;
case GLenum::GL_NUM_SHADER_BINARY_FORMATS:
return 1;
case GLenum::GL_PACK_ALIGNMENT:
return 1;
case GLenum::GL_POLYGON_OFFSET_FACTOR:
return 1;
case GLenum::GL_POLYGON_OFFSET_FILL:
return 1;
case GLenum::GL_POLYGON_OFFSET_UNITS:
return 1;
case GLenum::GL_RED_BITS:
return 1;
case GLenum::GL_RENDERBUFFER_BINDING:
return 1;
case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:
return 1;
case GLenum::GL_SAMPLE_BUFFERS:
return 1;
case GLenum::GL_SAMPLE_COVERAGE:
return 1;
case GLenum::GL_SAMPLE_COVERAGE_INVERT:
return 1;
case GLenum::GL_SAMPLE_COVERAGE_VALUE:
return 1;
case GLenum::GL_SAMPLES:
return 1;
case GLenum::GL_SCISSOR_BOX:
return 4;
case GLenum::GL_SCISSOR_TEST:
return 1;
case GLenum::GL_SHADER_COMPILER:
return 1;
case GLenum::GL_STENCIL_BACK_FAIL:
return 1;
case GLenum::GL_STENCIL_BACK_FUNC:
return 1;
case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:
return 1;
case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:
return 1;
case GLenum::GL_STENCIL_BACK_REF:
return 1;
case GLenum::GL_STENCIL_BACK_VALUE_MASK:
return 1;
case GLenum::GL_STENCIL_BACK_WRITEMASK:
return 1;
case GLenum::GL_STENCIL_BITS:
return 1;
case GLenum::GL_STENCIL_CLEAR_VALUE:
return 1;
case GLenum::GL_STENCIL_FAIL:
return 1;
case GLenum::GL_STENCIL_FUNC:
return 1;
case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:
return 1;
case GLenum::GL_STENCIL_PASS_DEPTH_PASS:
return 1;
case GLenum::GL_STENCIL_REF:
return 1;
case GLenum::GL_STENCIL_TEST:
return 1;
case GLenum::GL_STENCIL_VALUE_MASK:
return 1;
case GLenum::GL_STENCIL_WRITEMASK:
return 1;
case GLenum::GL_SUBPIXEL_BITS:
return 1;
case GLenum::GL_TEXTURE_BINDING_2D:
return 1;
case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:
return 1;
case GLenum::GL_UNPACK_ALIGNMENT:
return 1;
case GLenum::GL_VIEWPORT:
return 4;
case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
return 1;
case GLenum::GL_GPU_DISJOINT_EXT:
return 1;
default:
return 0; // TODO: Assert?
}
}
int imageSize(int width, int height, uint32_t format, uint32_t type) {
switch (format) {
// GLenum::GLES1
case GLenum::GL_ALPHA:
return width * height;
case GLenum::GL_LUMINANCE:
return width * height;
case GLenum::GL_LUMINANCE_ALPHA:
return 2 * width * height;
case GLenum::GL_RGB:
return 3 * width * height;
case GLenum::GL_RGBA:
return 4 * width * height;
// GLenum::GLES3
case GLenum::GL_RED:
return width * height;
case GLenum::GL_RED_INTEGER:
return width * height;
case GLenum::GL_RG:
return width * height * 2;
case GLenum::GL_RG_INTEGER:
return width * height * 2;
case GLenum::GL_RGB_INTEGER:
return width * height * 3;
case GLenum::GL_RGBA_INTEGER:
return width * height * 3;
case GLenum::GL_DEPTH_COMPONENT:
return width * height;
case GLenum::GL_DEPTH_STENCIL:
return width * height;
default:
return 0; // TODO: Assert?
}
}