michael@0: #include "precompiled.h" michael@0: // michael@0: // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // utilities.cpp: Conversion functions and other utility routines. michael@0: michael@0: #include "libGLESv2/utilities.h" michael@0: #include "libGLESv2/mathutil.h" michael@0: michael@0: namespace gl michael@0: { michael@0: michael@0: int UniformComponentCount(GLenum type) michael@0: { michael@0: switch (type) michael@0: { michael@0: case GL_BOOL: michael@0: case GL_FLOAT: michael@0: case GL_INT: michael@0: case GL_SAMPLER_2D: michael@0: case GL_SAMPLER_CUBE: michael@0: return 1; michael@0: case GL_BOOL_VEC2: michael@0: case GL_FLOAT_VEC2: michael@0: case GL_INT_VEC2: michael@0: return 2; michael@0: case GL_INT_VEC3: michael@0: case GL_FLOAT_VEC3: michael@0: case GL_BOOL_VEC3: michael@0: return 3; michael@0: case GL_BOOL_VEC4: michael@0: case GL_FLOAT_VEC4: michael@0: case GL_INT_VEC4: michael@0: case GL_FLOAT_MAT2: michael@0: return 4; michael@0: case GL_FLOAT_MAT3: michael@0: return 9; michael@0: case GL_FLOAT_MAT4: michael@0: return 16; michael@0: default: michael@0: UNREACHABLE(); michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: GLenum UniformComponentType(GLenum type) michael@0: { michael@0: switch(type) michael@0: { michael@0: case GL_BOOL: michael@0: case GL_BOOL_VEC2: michael@0: case GL_BOOL_VEC3: michael@0: case GL_BOOL_VEC4: michael@0: return GL_BOOL; michael@0: case GL_FLOAT: michael@0: case GL_FLOAT_VEC2: michael@0: case GL_FLOAT_VEC3: michael@0: case GL_FLOAT_VEC4: michael@0: case GL_FLOAT_MAT2: michael@0: case GL_FLOAT_MAT3: michael@0: case GL_FLOAT_MAT4: michael@0: return GL_FLOAT; michael@0: case GL_INT: michael@0: case GL_SAMPLER_2D: michael@0: case GL_SAMPLER_CUBE: michael@0: case GL_INT_VEC2: michael@0: case GL_INT_VEC3: michael@0: case GL_INT_VEC4: michael@0: return GL_INT; michael@0: default: michael@0: UNREACHABLE(); michael@0: } michael@0: michael@0: return GL_NONE; michael@0: } michael@0: michael@0: size_t UniformComponentSize(GLenum type) michael@0: { michael@0: switch(type) michael@0: { michael@0: case GL_BOOL: return sizeof(GLint); michael@0: case GL_FLOAT: return sizeof(GLfloat); michael@0: case GL_INT: return sizeof(GLint); michael@0: default: UNREACHABLE(); michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: size_t UniformInternalSize(GLenum type) michael@0: { michael@0: // Expanded to 4-element vectors michael@0: return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4; michael@0: } michael@0: michael@0: size_t UniformExternalSize(GLenum type) michael@0: { michael@0: return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type); michael@0: } michael@0: michael@0: int VariableRowCount(GLenum type) michael@0: { michael@0: switch (type) michael@0: { michael@0: case GL_NONE: michael@0: return 0; michael@0: case GL_BOOL: michael@0: case GL_FLOAT: michael@0: case GL_INT: michael@0: case GL_BOOL_VEC2: michael@0: case GL_FLOAT_VEC2: michael@0: case GL_INT_VEC2: michael@0: case GL_INT_VEC3: michael@0: case GL_FLOAT_VEC3: michael@0: case GL_BOOL_VEC3: michael@0: case GL_BOOL_VEC4: michael@0: case GL_FLOAT_VEC4: michael@0: case GL_INT_VEC4: michael@0: case GL_SAMPLER_2D: michael@0: case GL_SAMPLER_CUBE: michael@0: return 1; michael@0: case GL_FLOAT_MAT2: michael@0: return 2; michael@0: case GL_FLOAT_MAT3: michael@0: return 3; michael@0: case GL_FLOAT_MAT4: michael@0: return 4; michael@0: default: michael@0: UNREACHABLE(); michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: int VariableColumnCount(GLenum type) michael@0: { michael@0: switch (type) michael@0: { michael@0: case GL_NONE: michael@0: return 0; michael@0: case GL_BOOL: michael@0: case GL_FLOAT: michael@0: case GL_INT: michael@0: case GL_SAMPLER_2D: michael@0: case GL_SAMPLER_CUBE: michael@0: return 1; michael@0: case GL_BOOL_VEC2: michael@0: case GL_FLOAT_VEC2: michael@0: case GL_INT_VEC2: michael@0: case GL_FLOAT_MAT2: michael@0: return 2; michael@0: case GL_INT_VEC3: michael@0: case GL_FLOAT_VEC3: michael@0: case GL_BOOL_VEC3: michael@0: case GL_FLOAT_MAT3: michael@0: return 3; michael@0: case GL_BOOL_VEC4: michael@0: case GL_FLOAT_VEC4: michael@0: case GL_INT_VEC4: michael@0: case GL_FLOAT_MAT4: michael@0: return 4; michael@0: default: michael@0: UNREACHABLE(); michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize) michael@0: { michael@0: ASSERT(allocationSize <= bitsSize); michael@0: michael@0: unsigned int mask = std::numeric_limits::max() >> (std::numeric_limits::digits - allocationSize); michael@0: michael@0: for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++) michael@0: { michael@0: if ((*bits & mask) == 0) michael@0: { michael@0: *bits |= mask; michael@0: return i; michael@0: } michael@0: michael@0: mask <<= 1; michael@0: } michael@0: michael@0: return -1; michael@0: } michael@0: michael@0: GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment) michael@0: { michael@0: ASSERT(alignment > 0 && isPow2(alignment)); michael@0: michael@0: GLsizei rawPitch = ComputePixelSize(internalformat) * width; michael@0: return (rawPitch + alignment - 1) & ~(alignment - 1); michael@0: } michael@0: michael@0: GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat) michael@0: { michael@0: return ComputeCompressedSize(width, 1, internalformat); michael@0: } michael@0: michael@0: GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: michael@0: return 8 * ((width + 3) / 4) * ((height + 3) / 4); michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: michael@0: return 16 * ((width + 3) / 4) * ((height + 3) / 4); michael@0: default: michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: GLsizei ComputeTypeSize(GLenum type) michael@0: { michael@0: switch (type) michael@0: { michael@0: case GL_BYTE: return 1; michael@0: case GL_UNSIGNED_BYTE: return 1; michael@0: case GL_SHORT: return 2; michael@0: case GL_UNSIGNED_SHORT: return 2; michael@0: case GL_INT: return 4; michael@0: case GL_UNSIGNED_INT: return 4; michael@0: case GL_FLOAT: return 4; michael@0: case GL_HALF_FLOAT_OES: return 2; michael@0: case GL_UNSIGNED_SHORT_5_6_5: return 2; michael@0: case GL_UNSIGNED_SHORT_4_4_4_4: return 2; michael@0: case GL_UNSIGNED_SHORT_5_5_5_1: return 2; michael@0: case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return 2; michael@0: case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return 2; michael@0: case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: return 4; michael@0: case GL_UNSIGNED_INT_24_8_OES: return 4; michael@0: default: UNREACHABLE(); return 0; michael@0: } michael@0: } michael@0: michael@0: bool IsCompressed(GLenum format) michael@0: { michael@0: if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || michael@0: format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || michael@0: format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE || michael@0: format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE) michael@0: { michael@0: return true; michael@0: } michael@0: else michael@0: { michael@0: return false; michael@0: } michael@0: } michael@0: michael@0: bool IsDepthTexture(GLenum format) michael@0: { michael@0: if (format == GL_DEPTH_COMPONENT || michael@0: format == GL_DEPTH_STENCIL_OES || michael@0: format == GL_DEPTH_COMPONENT16 || michael@0: format == GL_DEPTH_COMPONENT32_OES || michael@0: format == GL_DEPTH24_STENCIL8_OES) michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: bool IsStencilTexture(GLenum format) michael@0: { michael@0: if (format == GL_DEPTH_STENCIL_OES || michael@0: format == GL_DEPTH24_STENCIL8_OES) michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset) michael@0: { michael@0: int upsampleCount = 0; michael@0: michael@0: if (isCompressed) michael@0: { michael@0: // Don't expand the size of full textures that are at least 4x4 michael@0: // already. michael@0: if (isImage || *requestWidth < 4 || *requestHeight < 4) michael@0: { michael@0: while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0) michael@0: { michael@0: *requestWidth <<= 1; michael@0: *requestHeight <<= 1; michael@0: upsampleCount++; michael@0: } michael@0: } michael@0: } michael@0: *levelOffset = upsampleCount; michael@0: } michael@0: michael@0: // Returns the size, in bytes, of a single texel in an Image michael@0: int ComputePixelSize(GLint internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_ALPHA8_EXT: return sizeof(unsigned char); michael@0: case GL_LUMINANCE8_EXT: return sizeof(unsigned char); michael@0: case GL_ALPHA32F_EXT: return sizeof(float); michael@0: case GL_LUMINANCE32F_EXT: return sizeof(float); michael@0: case GL_ALPHA16F_EXT: return sizeof(unsigned short); michael@0: case GL_LUMINANCE16F_EXT: return sizeof(unsigned short); michael@0: case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2; michael@0: case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2; michael@0: case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2; michael@0: case GL_RGB8_OES: return sizeof(unsigned char) * 3; michael@0: case GL_RGB565: return sizeof(unsigned short); michael@0: case GL_RGB32F_EXT: return sizeof(float) * 3; michael@0: case GL_RGB16F_EXT: return sizeof(unsigned short) * 3; michael@0: case GL_RGBA8_OES: return sizeof(unsigned char) * 4; michael@0: case GL_RGBA4: return sizeof(unsigned short); michael@0: case GL_RGB5_A1: return sizeof(unsigned short); michael@0: case GL_RGBA32F_EXT: return sizeof(float) * 4; michael@0: case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4; michael@0: case GL_BGRA8_EXT: return sizeof(unsigned char) * 4; michael@0: case GL_BGRA4_ANGLEX: return sizeof(unsigned short); michael@0: case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short); michael@0: default: UNREACHABLE(); michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: bool IsCubemapTextureTarget(GLenum target) michael@0: { michael@0: return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); michael@0: } michael@0: michael@0: bool IsInternalTextureTarget(GLenum target) michael@0: { michael@0: return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); michael@0: } michael@0: michael@0: GLint ConvertSizedInternalFormat(GLenum format, GLenum type) michael@0: { michael@0: switch (format) michael@0: { michael@0: case GL_ALPHA: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT; michael@0: case GL_FLOAT: return GL_ALPHA32F_EXT; michael@0: case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_LUMINANCE: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT; michael@0: case GL_FLOAT: return GL_LUMINANCE32F_EXT; michael@0: case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_LUMINANCE_ALPHA: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT; michael@0: case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT; michael@0: case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_RGB: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_RGB8_OES; michael@0: case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565; michael@0: case GL_FLOAT: return GL_RGB32F_EXT; michael@0: case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_RGBA: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_RGBA8_OES; michael@0: case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4; michael@0: case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1; michael@0: case GL_FLOAT: return GL_RGBA32F_EXT; michael@0: case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT; michael@0: break; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_BGRA_EXT: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT; michael@0: case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX; michael@0: case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: michael@0: return format; michael@0: case GL_DEPTH_COMPONENT: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16; michael@0: case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: case GL_DEPTH_STENCIL_OES: michael@0: switch (type) michael@0: { michael@0: case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES; michael@0: default: UNIMPLEMENTED(); michael@0: } michael@0: break; michael@0: default: michael@0: UNIMPLEMENTED(); michael@0: } michael@0: michael@0: return GL_NONE; michael@0: } michael@0: michael@0: GLenum ExtractFormat(GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_RGB565: return GL_RGB; michael@0: case GL_RGBA4: return GL_RGBA; michael@0: case GL_RGB5_A1: return GL_RGBA; michael@0: case GL_RGB8_OES: return GL_RGB; michael@0: case GL_RGBA8_OES: return GL_RGBA; michael@0: case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA; michael@0: case GL_LUMINANCE8_EXT: return GL_LUMINANCE; michael@0: case GL_ALPHA8_EXT: return GL_ALPHA; michael@0: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; michael@0: case GL_RGBA32F_EXT: return GL_RGBA; michael@0: case GL_RGB32F_EXT: return GL_RGB; michael@0: case GL_ALPHA32F_EXT: return GL_ALPHA; michael@0: case GL_LUMINANCE32F_EXT: return GL_LUMINANCE; michael@0: case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA; michael@0: case GL_RGBA16F_EXT: return GL_RGBA; michael@0: case GL_RGB16F_EXT: return GL_RGB; michael@0: case GL_ALPHA16F_EXT: return GL_ALPHA; michael@0: case GL_LUMINANCE16F_EXT: return GL_LUMINANCE; michael@0: case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA; michael@0: case GL_BGRA8_EXT: return GL_BGRA_EXT; michael@0: case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT; michael@0: case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT; michael@0: case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES; michael@0: default: return GL_NONE; // Unsupported michael@0: } michael@0: } michael@0: michael@0: GLenum ExtractType(GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5; michael@0: case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4; michael@0: case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1; michael@0: case GL_RGB8_OES: return GL_UNSIGNED_BYTE; michael@0: case GL_RGBA8_OES: return GL_UNSIGNED_BYTE; michael@0: case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE; michael@0: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE; michael@0: case GL_RGBA32F_EXT: return GL_FLOAT; michael@0: case GL_RGB32F_EXT: return GL_FLOAT; michael@0: case GL_ALPHA32F_EXT: return GL_FLOAT; michael@0: case GL_LUMINANCE32F_EXT: return GL_FLOAT; michael@0: case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT; michael@0: case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES; michael@0: case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES; michael@0: case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES; michael@0: case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES; michael@0: case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES; michael@0: case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE; michael@0: case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT; michael@0: case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT; michael@0: case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES; michael@0: default: return GL_NONE; // Unsupported michael@0: } michael@0: } michael@0: michael@0: bool IsColorRenderable(GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_RGBA4: michael@0: case GL_RGB5_A1: michael@0: case GL_RGB565: michael@0: case GL_RGB8_OES: michael@0: case GL_RGBA8_OES: michael@0: return true; michael@0: case GL_DEPTH_COMPONENT16: michael@0: case GL_STENCIL_INDEX8: michael@0: case GL_DEPTH24_STENCIL8_OES: michael@0: return false; michael@0: case GL_BGRA8_EXT: michael@0: return true; michael@0: default: michael@0: UNIMPLEMENTED(); michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: bool IsDepthRenderable(GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_DEPTH_COMPONENT16: michael@0: case GL_DEPTH24_STENCIL8_OES: michael@0: return true; michael@0: case GL_STENCIL_INDEX8: michael@0: case GL_RGBA4: michael@0: case GL_RGB5_A1: michael@0: case GL_RGB565: michael@0: case GL_RGB8_OES: michael@0: case GL_RGBA8_OES: michael@0: return false; michael@0: default: michael@0: UNIMPLEMENTED(); michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: bool IsStencilRenderable(GLenum internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_STENCIL_INDEX8: michael@0: case GL_DEPTH24_STENCIL8_OES: michael@0: return true; michael@0: case GL_RGBA4: michael@0: case GL_RGB5_A1: michael@0: case GL_RGB565: michael@0: case GL_RGB8_OES: michael@0: case GL_RGBA8_OES: michael@0: case GL_DEPTH_COMPONENT16: michael@0: return false; michael@0: default: michael@0: UNIMPLEMENTED(); michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: bool IsFloat32Format(GLint internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_RGBA32F_EXT: michael@0: case GL_RGB32F_EXT: michael@0: case GL_ALPHA32F_EXT: michael@0: case GL_LUMINANCE32F_EXT: michael@0: case GL_LUMINANCE_ALPHA32F_EXT: michael@0: return true; michael@0: default: michael@0: return false; michael@0: } michael@0: } michael@0: michael@0: bool IsFloat16Format(GLint internalformat) michael@0: { michael@0: switch (internalformat) michael@0: { michael@0: case GL_RGBA16F_EXT: michael@0: case GL_RGB16F_EXT: michael@0: case GL_ALPHA16F_EXT: michael@0: case GL_LUMINANCE16F_EXT: michael@0: case GL_LUMINANCE_ALPHA16F_EXT: michael@0: return true; michael@0: default: michael@0: return false; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetAlphaSize(GLenum colorFormat) michael@0: { michael@0: switch (colorFormat) michael@0: { michael@0: case GL_RGBA16F_EXT: michael@0: return 16; michael@0: case GL_RGBA32F_EXT: michael@0: return 32; michael@0: case GL_RGBA4: michael@0: return 4; michael@0: case GL_RGBA8_OES: michael@0: case GL_BGRA8_EXT: michael@0: return 8; michael@0: case GL_RGB5_A1: michael@0: return 1; michael@0: case GL_RGB8_OES: michael@0: case GL_RGB565: michael@0: case GL_RGB32F_EXT: michael@0: case GL_RGB16F_EXT: michael@0: return 0; michael@0: default: michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetRedSize(GLenum colorFormat) michael@0: { michael@0: switch (colorFormat) michael@0: { michael@0: case GL_RGBA16F_EXT: michael@0: case GL_RGB16F_EXT: michael@0: return 16; michael@0: case GL_RGBA32F_EXT: michael@0: case GL_RGB32F_EXT: michael@0: return 32; michael@0: case GL_RGBA4: michael@0: return 4; michael@0: case GL_RGBA8_OES: michael@0: case GL_BGRA8_EXT: michael@0: case GL_RGB8_OES: michael@0: return 8; michael@0: case GL_RGB5_A1: michael@0: case GL_RGB565: michael@0: return 5; michael@0: default: michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetGreenSize(GLenum colorFormat) michael@0: { michael@0: switch (colorFormat) michael@0: { michael@0: case GL_RGBA16F_EXT: michael@0: case GL_RGB16F_EXT: michael@0: return 16; michael@0: case GL_RGBA32F_EXT: michael@0: case GL_RGB32F_EXT: michael@0: return 32; michael@0: case GL_RGBA4: michael@0: return 4; michael@0: case GL_RGBA8_OES: michael@0: case GL_BGRA8_EXT: michael@0: case GL_RGB8_OES: michael@0: return 8; michael@0: case GL_RGB5_A1: michael@0: return 5; michael@0: case GL_RGB565: michael@0: return 6; michael@0: default: michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetBlueSize(GLenum colorFormat) michael@0: { michael@0: switch (colorFormat) michael@0: { michael@0: case GL_RGBA16F_EXT: michael@0: case GL_RGB16F_EXT: michael@0: return 16; michael@0: case GL_RGBA32F_EXT: michael@0: case GL_RGB32F_EXT: michael@0: return 32; michael@0: case GL_RGBA4: michael@0: return 4; michael@0: case GL_RGBA8_OES: michael@0: case GL_BGRA8_EXT: michael@0: case GL_RGB8_OES: michael@0: return 8; michael@0: case GL_RGB5_A1: michael@0: case GL_RGB565: michael@0: return 5; michael@0: default: michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetDepthSize(GLenum depthFormat) michael@0: { michael@0: switch (depthFormat) michael@0: { michael@0: case GL_DEPTH_COMPONENT16: return 16; michael@0: case GL_DEPTH_COMPONENT32_OES: return 32; michael@0: case GL_DEPTH24_STENCIL8_OES: return 24; michael@0: default: return 0; michael@0: } michael@0: } michael@0: michael@0: unsigned int GetStencilSize(GLenum stencilFormat) michael@0: { michael@0: switch (stencilFormat) michael@0: { michael@0: case GL_DEPTH24_STENCIL8_OES: return 8; michael@0: default: return 0; michael@0: } michael@0: } michael@0: michael@0: bool IsTriangleMode(GLenum drawMode) michael@0: { michael@0: switch (drawMode) michael@0: { michael@0: case GL_TRIANGLES: michael@0: case GL_TRIANGLE_FAN: michael@0: case GL_TRIANGLE_STRIP: michael@0: return true; michael@0: case GL_POINTS: michael@0: case GL_LINES: michael@0: case GL_LINE_LOOP: michael@0: case GL_LINE_STRIP: michael@0: return false; michael@0: default: UNREACHABLE(); michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: } michael@0: michael@0: std::string getTempPath() michael@0: { michael@0: char path[MAX_PATH]; michael@0: DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path); michael@0: if (pathLen == 0) michael@0: { michael@0: UNREACHABLE(); michael@0: return std::string(); michael@0: } michael@0: michael@0: UINT unique = GetTempFileNameA(path, "sh", 0, path); michael@0: if (unique == 0) michael@0: { michael@0: UNREACHABLE(); michael@0: return std::string(); michael@0: } michael@0: michael@0: return path; michael@0: } michael@0: michael@0: void writeFile(const char* path, const void* content, size_t size) michael@0: { michael@0: FILE* file = fopen(path, "w"); michael@0: if (!file) michael@0: { michael@0: UNREACHABLE(); michael@0: return; michael@0: } michael@0: michael@0: fwrite(content, sizeof(char), size, file); michael@0: fclose(file); michael@0: }