1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/utilities.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,769 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// utilities.cpp: Conversion functions and other utility routines. 1.12 + 1.13 +#include "libGLESv2/utilities.h" 1.14 +#include "libGLESv2/mathutil.h" 1.15 + 1.16 +namespace gl 1.17 +{ 1.18 + 1.19 +int UniformComponentCount(GLenum type) 1.20 +{ 1.21 + switch (type) 1.22 + { 1.23 + case GL_BOOL: 1.24 + case GL_FLOAT: 1.25 + case GL_INT: 1.26 + case GL_SAMPLER_2D: 1.27 + case GL_SAMPLER_CUBE: 1.28 + return 1; 1.29 + case GL_BOOL_VEC2: 1.30 + case GL_FLOAT_VEC2: 1.31 + case GL_INT_VEC2: 1.32 + return 2; 1.33 + case GL_INT_VEC3: 1.34 + case GL_FLOAT_VEC3: 1.35 + case GL_BOOL_VEC3: 1.36 + return 3; 1.37 + case GL_BOOL_VEC4: 1.38 + case GL_FLOAT_VEC4: 1.39 + case GL_INT_VEC4: 1.40 + case GL_FLOAT_MAT2: 1.41 + return 4; 1.42 + case GL_FLOAT_MAT3: 1.43 + return 9; 1.44 + case GL_FLOAT_MAT4: 1.45 + return 16; 1.46 + default: 1.47 + UNREACHABLE(); 1.48 + } 1.49 + 1.50 + return 0; 1.51 +} 1.52 + 1.53 +GLenum UniformComponentType(GLenum type) 1.54 +{ 1.55 + switch(type) 1.56 + { 1.57 + case GL_BOOL: 1.58 + case GL_BOOL_VEC2: 1.59 + case GL_BOOL_VEC3: 1.60 + case GL_BOOL_VEC4: 1.61 + return GL_BOOL; 1.62 + case GL_FLOAT: 1.63 + case GL_FLOAT_VEC2: 1.64 + case GL_FLOAT_VEC3: 1.65 + case GL_FLOAT_VEC4: 1.66 + case GL_FLOAT_MAT2: 1.67 + case GL_FLOAT_MAT3: 1.68 + case GL_FLOAT_MAT4: 1.69 + return GL_FLOAT; 1.70 + case GL_INT: 1.71 + case GL_SAMPLER_2D: 1.72 + case GL_SAMPLER_CUBE: 1.73 + case GL_INT_VEC2: 1.74 + case GL_INT_VEC3: 1.75 + case GL_INT_VEC4: 1.76 + return GL_INT; 1.77 + default: 1.78 + UNREACHABLE(); 1.79 + } 1.80 + 1.81 + return GL_NONE; 1.82 +} 1.83 + 1.84 +size_t UniformComponentSize(GLenum type) 1.85 +{ 1.86 + switch(type) 1.87 + { 1.88 + case GL_BOOL: return sizeof(GLint); 1.89 + case GL_FLOAT: return sizeof(GLfloat); 1.90 + case GL_INT: return sizeof(GLint); 1.91 + default: UNREACHABLE(); 1.92 + } 1.93 + 1.94 + return 0; 1.95 +} 1.96 + 1.97 +size_t UniformInternalSize(GLenum type) 1.98 +{ 1.99 + // Expanded to 4-element vectors 1.100 + return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4; 1.101 +} 1.102 + 1.103 +size_t UniformExternalSize(GLenum type) 1.104 +{ 1.105 + return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type); 1.106 +} 1.107 + 1.108 +int VariableRowCount(GLenum type) 1.109 +{ 1.110 + switch (type) 1.111 + { 1.112 + case GL_NONE: 1.113 + return 0; 1.114 + case GL_BOOL: 1.115 + case GL_FLOAT: 1.116 + case GL_INT: 1.117 + case GL_BOOL_VEC2: 1.118 + case GL_FLOAT_VEC2: 1.119 + case GL_INT_VEC2: 1.120 + case GL_INT_VEC3: 1.121 + case GL_FLOAT_VEC3: 1.122 + case GL_BOOL_VEC3: 1.123 + case GL_BOOL_VEC4: 1.124 + case GL_FLOAT_VEC4: 1.125 + case GL_INT_VEC4: 1.126 + case GL_SAMPLER_2D: 1.127 + case GL_SAMPLER_CUBE: 1.128 + return 1; 1.129 + case GL_FLOAT_MAT2: 1.130 + return 2; 1.131 + case GL_FLOAT_MAT3: 1.132 + return 3; 1.133 + case GL_FLOAT_MAT4: 1.134 + return 4; 1.135 + default: 1.136 + UNREACHABLE(); 1.137 + } 1.138 + 1.139 + return 0; 1.140 +} 1.141 + 1.142 +int VariableColumnCount(GLenum type) 1.143 +{ 1.144 + switch (type) 1.145 + { 1.146 + case GL_NONE: 1.147 + return 0; 1.148 + case GL_BOOL: 1.149 + case GL_FLOAT: 1.150 + case GL_INT: 1.151 + case GL_SAMPLER_2D: 1.152 + case GL_SAMPLER_CUBE: 1.153 + return 1; 1.154 + case GL_BOOL_VEC2: 1.155 + case GL_FLOAT_VEC2: 1.156 + case GL_INT_VEC2: 1.157 + case GL_FLOAT_MAT2: 1.158 + return 2; 1.159 + case GL_INT_VEC3: 1.160 + case GL_FLOAT_VEC3: 1.161 + case GL_BOOL_VEC3: 1.162 + case GL_FLOAT_MAT3: 1.163 + return 3; 1.164 + case GL_BOOL_VEC4: 1.165 + case GL_FLOAT_VEC4: 1.166 + case GL_INT_VEC4: 1.167 + case GL_FLOAT_MAT4: 1.168 + return 4; 1.169 + default: 1.170 + UNREACHABLE(); 1.171 + } 1.172 + 1.173 + return 0; 1.174 +} 1.175 + 1.176 +int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize) 1.177 +{ 1.178 + ASSERT(allocationSize <= bitsSize); 1.179 + 1.180 + unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize); 1.181 + 1.182 + for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++) 1.183 + { 1.184 + if ((*bits & mask) == 0) 1.185 + { 1.186 + *bits |= mask; 1.187 + return i; 1.188 + } 1.189 + 1.190 + mask <<= 1; 1.191 + } 1.192 + 1.193 + return -1; 1.194 +} 1.195 + 1.196 +GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment) 1.197 +{ 1.198 + ASSERT(alignment > 0 && isPow2(alignment)); 1.199 + 1.200 + GLsizei rawPitch = ComputePixelSize(internalformat) * width; 1.201 + return (rawPitch + alignment - 1) & ~(alignment - 1); 1.202 +} 1.203 + 1.204 +GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat) 1.205 +{ 1.206 + return ComputeCompressedSize(width, 1, internalformat); 1.207 +} 1.208 + 1.209 +GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat) 1.210 +{ 1.211 + switch (internalformat) 1.212 + { 1.213 + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1.214 + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1.215 + return 8 * ((width + 3) / 4) * ((height + 3) / 4); 1.216 + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: 1.217 + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: 1.218 + return 16 * ((width + 3) / 4) * ((height + 3) / 4); 1.219 + default: 1.220 + return 0; 1.221 + } 1.222 +} 1.223 + 1.224 +GLsizei ComputeTypeSize(GLenum type) 1.225 +{ 1.226 + switch (type) 1.227 + { 1.228 + case GL_BYTE: return 1; 1.229 + case GL_UNSIGNED_BYTE: return 1; 1.230 + case GL_SHORT: return 2; 1.231 + case GL_UNSIGNED_SHORT: return 2; 1.232 + case GL_INT: return 4; 1.233 + case GL_UNSIGNED_INT: return 4; 1.234 + case GL_FLOAT: return 4; 1.235 + case GL_HALF_FLOAT_OES: return 2; 1.236 + case GL_UNSIGNED_SHORT_5_6_5: return 2; 1.237 + case GL_UNSIGNED_SHORT_4_4_4_4: return 2; 1.238 + case GL_UNSIGNED_SHORT_5_5_5_1: return 2; 1.239 + case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return 2; 1.240 + case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return 2; 1.241 + case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: return 4; 1.242 + case GL_UNSIGNED_INT_24_8_OES: return 4; 1.243 + default: UNREACHABLE(); return 0; 1.244 + } 1.245 +} 1.246 + 1.247 +bool IsCompressed(GLenum format) 1.248 +{ 1.249 + if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || 1.250 + format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || 1.251 + format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE || 1.252 + format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE) 1.253 + { 1.254 + return true; 1.255 + } 1.256 + else 1.257 + { 1.258 + return false; 1.259 + } 1.260 +} 1.261 + 1.262 +bool IsDepthTexture(GLenum format) 1.263 +{ 1.264 + if (format == GL_DEPTH_COMPONENT || 1.265 + format == GL_DEPTH_STENCIL_OES || 1.266 + format == GL_DEPTH_COMPONENT16 || 1.267 + format == GL_DEPTH_COMPONENT32_OES || 1.268 + format == GL_DEPTH24_STENCIL8_OES) 1.269 + { 1.270 + return true; 1.271 + } 1.272 + 1.273 + return false; 1.274 +} 1.275 + 1.276 +bool IsStencilTexture(GLenum format) 1.277 +{ 1.278 + if (format == GL_DEPTH_STENCIL_OES || 1.279 + format == GL_DEPTH24_STENCIL8_OES) 1.280 + { 1.281 + return true; 1.282 + } 1.283 + 1.284 + return false; 1.285 +} 1.286 + 1.287 +void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset) 1.288 +{ 1.289 + int upsampleCount = 0; 1.290 + 1.291 + if (isCompressed) 1.292 + { 1.293 + // Don't expand the size of full textures that are at least 4x4 1.294 + // already. 1.295 + if (isImage || *requestWidth < 4 || *requestHeight < 4) 1.296 + { 1.297 + while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0) 1.298 + { 1.299 + *requestWidth <<= 1; 1.300 + *requestHeight <<= 1; 1.301 + upsampleCount++; 1.302 + } 1.303 + } 1.304 + } 1.305 + *levelOffset = upsampleCount; 1.306 +} 1.307 + 1.308 +// Returns the size, in bytes, of a single texel in an Image 1.309 +int ComputePixelSize(GLint internalformat) 1.310 +{ 1.311 + switch (internalformat) 1.312 + { 1.313 + case GL_ALPHA8_EXT: return sizeof(unsigned char); 1.314 + case GL_LUMINANCE8_EXT: return sizeof(unsigned char); 1.315 + case GL_ALPHA32F_EXT: return sizeof(float); 1.316 + case GL_LUMINANCE32F_EXT: return sizeof(float); 1.317 + case GL_ALPHA16F_EXT: return sizeof(unsigned short); 1.318 + case GL_LUMINANCE16F_EXT: return sizeof(unsigned short); 1.319 + case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2; 1.320 + case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2; 1.321 + case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2; 1.322 + case GL_RGB8_OES: return sizeof(unsigned char) * 3; 1.323 + case GL_RGB565: return sizeof(unsigned short); 1.324 + case GL_RGB32F_EXT: return sizeof(float) * 3; 1.325 + case GL_RGB16F_EXT: return sizeof(unsigned short) * 3; 1.326 + case GL_RGBA8_OES: return sizeof(unsigned char) * 4; 1.327 + case GL_RGBA4: return sizeof(unsigned short); 1.328 + case GL_RGB5_A1: return sizeof(unsigned short); 1.329 + case GL_RGBA32F_EXT: return sizeof(float) * 4; 1.330 + case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4; 1.331 + case GL_BGRA8_EXT: return sizeof(unsigned char) * 4; 1.332 + case GL_BGRA4_ANGLEX: return sizeof(unsigned short); 1.333 + case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short); 1.334 + default: UNREACHABLE(); 1.335 + } 1.336 + 1.337 + return 0; 1.338 +} 1.339 + 1.340 +bool IsCubemapTextureTarget(GLenum target) 1.341 +{ 1.342 + return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); 1.343 +} 1.344 + 1.345 +bool IsInternalTextureTarget(GLenum target) 1.346 +{ 1.347 + return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); 1.348 +} 1.349 + 1.350 +GLint ConvertSizedInternalFormat(GLenum format, GLenum type) 1.351 +{ 1.352 + switch (format) 1.353 + { 1.354 + case GL_ALPHA: 1.355 + switch (type) 1.356 + { 1.357 + case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT; 1.358 + case GL_FLOAT: return GL_ALPHA32F_EXT; 1.359 + case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT; 1.360 + default: UNIMPLEMENTED(); 1.361 + } 1.362 + break; 1.363 + case GL_LUMINANCE: 1.364 + switch (type) 1.365 + { 1.366 + case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT; 1.367 + case GL_FLOAT: return GL_LUMINANCE32F_EXT; 1.368 + case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT; 1.369 + default: UNIMPLEMENTED(); 1.370 + } 1.371 + break; 1.372 + case GL_LUMINANCE_ALPHA: 1.373 + switch (type) 1.374 + { 1.375 + case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT; 1.376 + case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT; 1.377 + case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT; 1.378 + default: UNIMPLEMENTED(); 1.379 + } 1.380 + break; 1.381 + case GL_RGB: 1.382 + switch (type) 1.383 + { 1.384 + case GL_UNSIGNED_BYTE: return GL_RGB8_OES; 1.385 + case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565; 1.386 + case GL_FLOAT: return GL_RGB32F_EXT; 1.387 + case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT; 1.388 + default: UNIMPLEMENTED(); 1.389 + } 1.390 + break; 1.391 + case GL_RGBA: 1.392 + switch (type) 1.393 + { 1.394 + case GL_UNSIGNED_BYTE: return GL_RGBA8_OES; 1.395 + case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4; 1.396 + case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1; 1.397 + case GL_FLOAT: return GL_RGBA32F_EXT; 1.398 + case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT; 1.399 + break; 1.400 + default: UNIMPLEMENTED(); 1.401 + } 1.402 + break; 1.403 + case GL_BGRA_EXT: 1.404 + switch (type) 1.405 + { 1.406 + case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT; 1.407 + case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX; 1.408 + case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX; 1.409 + default: UNIMPLEMENTED(); 1.410 + } 1.411 + break; 1.412 + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1.413 + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1.414 + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: 1.415 + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: 1.416 + return format; 1.417 + case GL_DEPTH_COMPONENT: 1.418 + switch (type) 1.419 + { 1.420 + case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16; 1.421 + case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES; 1.422 + default: UNIMPLEMENTED(); 1.423 + } 1.424 + break; 1.425 + case GL_DEPTH_STENCIL_OES: 1.426 + switch (type) 1.427 + { 1.428 + case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES; 1.429 + default: UNIMPLEMENTED(); 1.430 + } 1.431 + break; 1.432 + default: 1.433 + UNIMPLEMENTED(); 1.434 + } 1.435 + 1.436 + return GL_NONE; 1.437 +} 1.438 + 1.439 +GLenum ExtractFormat(GLenum internalformat) 1.440 +{ 1.441 + switch (internalformat) 1.442 + { 1.443 + case GL_RGB565: return GL_RGB; 1.444 + case GL_RGBA4: return GL_RGBA; 1.445 + case GL_RGB5_A1: return GL_RGBA; 1.446 + case GL_RGB8_OES: return GL_RGB; 1.447 + case GL_RGBA8_OES: return GL_RGBA; 1.448 + case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA; 1.449 + case GL_LUMINANCE8_EXT: return GL_LUMINANCE; 1.450 + case GL_ALPHA8_EXT: return GL_ALPHA; 1.451 + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; 1.452 + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 1.453 + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; 1.454 + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; 1.455 + case GL_RGBA32F_EXT: return GL_RGBA; 1.456 + case GL_RGB32F_EXT: return GL_RGB; 1.457 + case GL_ALPHA32F_EXT: return GL_ALPHA; 1.458 + case GL_LUMINANCE32F_EXT: return GL_LUMINANCE; 1.459 + case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA; 1.460 + case GL_RGBA16F_EXT: return GL_RGBA; 1.461 + case GL_RGB16F_EXT: return GL_RGB; 1.462 + case GL_ALPHA16F_EXT: return GL_ALPHA; 1.463 + case GL_LUMINANCE16F_EXT: return GL_LUMINANCE; 1.464 + case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA; 1.465 + case GL_BGRA8_EXT: return GL_BGRA_EXT; 1.466 + case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT; 1.467 + case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT; 1.468 + case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES; 1.469 + default: return GL_NONE; // Unsupported 1.470 + } 1.471 +} 1.472 + 1.473 +GLenum ExtractType(GLenum internalformat) 1.474 +{ 1.475 + switch (internalformat) 1.476 + { 1.477 + case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5; 1.478 + case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4; 1.479 + case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1; 1.480 + case GL_RGB8_OES: return GL_UNSIGNED_BYTE; 1.481 + case GL_RGBA8_OES: return GL_UNSIGNED_BYTE; 1.482 + case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE; 1.483 + case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE; 1.484 + case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE; 1.485 + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; 1.486 + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; 1.487 + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE; 1.488 + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE; 1.489 + case GL_RGBA32F_EXT: return GL_FLOAT; 1.490 + case GL_RGB32F_EXT: return GL_FLOAT; 1.491 + case GL_ALPHA32F_EXT: return GL_FLOAT; 1.492 + case GL_LUMINANCE32F_EXT: return GL_FLOAT; 1.493 + case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT; 1.494 + case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES; 1.495 + case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES; 1.496 + case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES; 1.497 + case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES; 1.498 + case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES; 1.499 + case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE; 1.500 + case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT; 1.501 + case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT; 1.502 + case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES; 1.503 + default: return GL_NONE; // Unsupported 1.504 + } 1.505 +} 1.506 + 1.507 +bool IsColorRenderable(GLenum internalformat) 1.508 +{ 1.509 + switch (internalformat) 1.510 + { 1.511 + case GL_RGBA4: 1.512 + case GL_RGB5_A1: 1.513 + case GL_RGB565: 1.514 + case GL_RGB8_OES: 1.515 + case GL_RGBA8_OES: 1.516 + return true; 1.517 + case GL_DEPTH_COMPONENT16: 1.518 + case GL_STENCIL_INDEX8: 1.519 + case GL_DEPTH24_STENCIL8_OES: 1.520 + return false; 1.521 + case GL_BGRA8_EXT: 1.522 + return true; 1.523 + default: 1.524 + UNIMPLEMENTED(); 1.525 + } 1.526 + 1.527 + return false; 1.528 +} 1.529 + 1.530 +bool IsDepthRenderable(GLenum internalformat) 1.531 +{ 1.532 + switch (internalformat) 1.533 + { 1.534 + case GL_DEPTH_COMPONENT16: 1.535 + case GL_DEPTH24_STENCIL8_OES: 1.536 + return true; 1.537 + case GL_STENCIL_INDEX8: 1.538 + case GL_RGBA4: 1.539 + case GL_RGB5_A1: 1.540 + case GL_RGB565: 1.541 + case GL_RGB8_OES: 1.542 + case GL_RGBA8_OES: 1.543 + return false; 1.544 + default: 1.545 + UNIMPLEMENTED(); 1.546 + } 1.547 + 1.548 + return false; 1.549 +} 1.550 + 1.551 +bool IsStencilRenderable(GLenum internalformat) 1.552 +{ 1.553 + switch (internalformat) 1.554 + { 1.555 + case GL_STENCIL_INDEX8: 1.556 + case GL_DEPTH24_STENCIL8_OES: 1.557 + return true; 1.558 + case GL_RGBA4: 1.559 + case GL_RGB5_A1: 1.560 + case GL_RGB565: 1.561 + case GL_RGB8_OES: 1.562 + case GL_RGBA8_OES: 1.563 + case GL_DEPTH_COMPONENT16: 1.564 + return false; 1.565 + default: 1.566 + UNIMPLEMENTED(); 1.567 + } 1.568 + 1.569 + return false; 1.570 +} 1.571 + 1.572 +bool IsFloat32Format(GLint internalformat) 1.573 +{ 1.574 + switch (internalformat) 1.575 + { 1.576 + case GL_RGBA32F_EXT: 1.577 + case GL_RGB32F_EXT: 1.578 + case GL_ALPHA32F_EXT: 1.579 + case GL_LUMINANCE32F_EXT: 1.580 + case GL_LUMINANCE_ALPHA32F_EXT: 1.581 + return true; 1.582 + default: 1.583 + return false; 1.584 + } 1.585 +} 1.586 + 1.587 +bool IsFloat16Format(GLint internalformat) 1.588 +{ 1.589 + switch (internalformat) 1.590 + { 1.591 + case GL_RGBA16F_EXT: 1.592 + case GL_RGB16F_EXT: 1.593 + case GL_ALPHA16F_EXT: 1.594 + case GL_LUMINANCE16F_EXT: 1.595 + case GL_LUMINANCE_ALPHA16F_EXT: 1.596 + return true; 1.597 + default: 1.598 + return false; 1.599 + } 1.600 +} 1.601 + 1.602 +unsigned int GetAlphaSize(GLenum colorFormat) 1.603 +{ 1.604 + switch (colorFormat) 1.605 + { 1.606 + case GL_RGBA16F_EXT: 1.607 + return 16; 1.608 + case GL_RGBA32F_EXT: 1.609 + return 32; 1.610 + case GL_RGBA4: 1.611 + return 4; 1.612 + case GL_RGBA8_OES: 1.613 + case GL_BGRA8_EXT: 1.614 + return 8; 1.615 + case GL_RGB5_A1: 1.616 + return 1; 1.617 + case GL_RGB8_OES: 1.618 + case GL_RGB565: 1.619 + case GL_RGB32F_EXT: 1.620 + case GL_RGB16F_EXT: 1.621 + return 0; 1.622 + default: 1.623 + return 0; 1.624 + } 1.625 +} 1.626 + 1.627 +unsigned int GetRedSize(GLenum colorFormat) 1.628 +{ 1.629 + switch (colorFormat) 1.630 + { 1.631 + case GL_RGBA16F_EXT: 1.632 + case GL_RGB16F_EXT: 1.633 + return 16; 1.634 + case GL_RGBA32F_EXT: 1.635 + case GL_RGB32F_EXT: 1.636 + return 32; 1.637 + case GL_RGBA4: 1.638 + return 4; 1.639 + case GL_RGBA8_OES: 1.640 + case GL_BGRA8_EXT: 1.641 + case GL_RGB8_OES: 1.642 + return 8; 1.643 + case GL_RGB5_A1: 1.644 + case GL_RGB565: 1.645 + return 5; 1.646 + default: 1.647 + return 0; 1.648 + } 1.649 +} 1.650 + 1.651 +unsigned int GetGreenSize(GLenum colorFormat) 1.652 +{ 1.653 + switch (colorFormat) 1.654 + { 1.655 + case GL_RGBA16F_EXT: 1.656 + case GL_RGB16F_EXT: 1.657 + return 16; 1.658 + case GL_RGBA32F_EXT: 1.659 + case GL_RGB32F_EXT: 1.660 + return 32; 1.661 + case GL_RGBA4: 1.662 + return 4; 1.663 + case GL_RGBA8_OES: 1.664 + case GL_BGRA8_EXT: 1.665 + case GL_RGB8_OES: 1.666 + return 8; 1.667 + case GL_RGB5_A1: 1.668 + return 5; 1.669 + case GL_RGB565: 1.670 + return 6; 1.671 + default: 1.672 + return 0; 1.673 + } 1.674 +} 1.675 + 1.676 +unsigned int GetBlueSize(GLenum colorFormat) 1.677 +{ 1.678 + switch (colorFormat) 1.679 + { 1.680 + case GL_RGBA16F_EXT: 1.681 + case GL_RGB16F_EXT: 1.682 + return 16; 1.683 + case GL_RGBA32F_EXT: 1.684 + case GL_RGB32F_EXT: 1.685 + return 32; 1.686 + case GL_RGBA4: 1.687 + return 4; 1.688 + case GL_RGBA8_OES: 1.689 + case GL_BGRA8_EXT: 1.690 + case GL_RGB8_OES: 1.691 + return 8; 1.692 + case GL_RGB5_A1: 1.693 + case GL_RGB565: 1.694 + return 5; 1.695 + default: 1.696 + return 0; 1.697 + } 1.698 +} 1.699 + 1.700 +unsigned int GetDepthSize(GLenum depthFormat) 1.701 +{ 1.702 + switch (depthFormat) 1.703 + { 1.704 + case GL_DEPTH_COMPONENT16: return 16; 1.705 + case GL_DEPTH_COMPONENT32_OES: return 32; 1.706 + case GL_DEPTH24_STENCIL8_OES: return 24; 1.707 + default: return 0; 1.708 + } 1.709 +} 1.710 + 1.711 +unsigned int GetStencilSize(GLenum stencilFormat) 1.712 +{ 1.713 + switch (stencilFormat) 1.714 + { 1.715 + case GL_DEPTH24_STENCIL8_OES: return 8; 1.716 + default: return 0; 1.717 + } 1.718 +} 1.719 + 1.720 +bool IsTriangleMode(GLenum drawMode) 1.721 +{ 1.722 + switch (drawMode) 1.723 + { 1.724 + case GL_TRIANGLES: 1.725 + case GL_TRIANGLE_FAN: 1.726 + case GL_TRIANGLE_STRIP: 1.727 + return true; 1.728 + case GL_POINTS: 1.729 + case GL_LINES: 1.730 + case GL_LINE_LOOP: 1.731 + case GL_LINE_STRIP: 1.732 + return false; 1.733 + default: UNREACHABLE(); 1.734 + } 1.735 + 1.736 + return false; 1.737 +} 1.738 + 1.739 +} 1.740 + 1.741 +std::string getTempPath() 1.742 +{ 1.743 + char path[MAX_PATH]; 1.744 + DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path); 1.745 + if (pathLen == 0) 1.746 + { 1.747 + UNREACHABLE(); 1.748 + return std::string(); 1.749 + } 1.750 + 1.751 + UINT unique = GetTempFileNameA(path, "sh", 0, path); 1.752 + if (unique == 0) 1.753 + { 1.754 + UNREACHABLE(); 1.755 + return std::string(); 1.756 + } 1.757 + 1.758 + return path; 1.759 +} 1.760 + 1.761 +void writeFile(const char* path, const void* content, size_t size) 1.762 +{ 1.763 + FILE* file = fopen(path, "w"); 1.764 + if (!file) 1.765 + { 1.766 + UNREACHABLE(); 1.767 + return; 1.768 + } 1.769 + 1.770 + fwrite(content, sizeof(char), size, file); 1.771 + fclose(file); 1.772 +}