Home | History | Annotate | Download | only in libGLESv2
      1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 // utilities.cpp: Conversion functions and other utility routines.
     16 
     17 #include "utilities.h"
     18 
     19 #include "Framebuffer.h"
     20 #include "main.h"
     21 #include "mathutil.h"
     22 #include "Context.h"
     23 #include "common/debug.h"
     24 
     25 #include <limits>
     26 #include <stdio.h>
     27 #include <stdlib.h>
     28 
     29 namespace es2
     30 {
     31 	// ES2 requires that format is equal to internal format at all glTex*Image2D entry points and the implementation
     32 	// can decide the true, sized, internal format. The ES2FormatMap determines the internal format for all valid
     33 	// format and type combinations.
     34 
     35 	typedef std::pair<GLenum, GLenum> FormatTypePair;
     36 	typedef std::pair<FormatTypePair, GLenum> FormatPair;
     37 	typedef std::map<FormatTypePair, GLenum> FormatMap;
     38 
     39 	// A helper function to insert data into the format map with fewer characters.
     40 	static inline void InsertFormatMapping(FormatMap *map, GLenum format, GLenum type, GLenum internalFormat)
     41 	{
     42 		map->insert(FormatPair(FormatTypePair(format, type), internalFormat));
     43 	}
     44 
     45 	FormatMap BuildFormatMap()
     46 	{
     47 		static const GLenum GL_BGRA4_ANGLEX = 0x6ABC;
     48 		static const GLenum GL_BGR5_A1_ANGLEX = 0x6ABD;
     49 
     50 		FormatMap map;
     51 
     52 		//                       | Format | Type | Internal format |
     53 		InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8);
     54 		InsertFormatMapping(&map, GL_RGBA, GL_BYTE, GL_RGBA8_SNORM);
     55 		InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_RGBA4);
     56 		InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGB5_A1);
     57 		InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_RGB10_A2);
     58 		InsertFormatMapping(&map, GL_RGBA, GL_FLOAT, GL_RGBA32F);
     59 		InsertFormatMapping(&map, GL_RGBA, GL_HALF_FLOAT, GL_RGBA16F);
     60 		InsertFormatMapping(&map, GL_RGBA, GL_HALF_FLOAT_OES, GL_RGBA16F);
     61 
     62 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_RGBA8UI);
     63 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_BYTE, GL_RGBA8I);
     64 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_RGBA16UI);
     65 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_SHORT, GL_RGBA16I);
     66 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_RGBA32UI);
     67 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_INT, GL_RGBA32I);
     68 		InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_RGB10_A2UI);
     69 
     70 		InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8);
     71 		InsertFormatMapping(&map, GL_RGB, GL_BYTE, GL_RGB8_SNORM);
     72 		InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB565);
     73 		InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_R11F_G11F_B10F);
     74 		InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_RGB9_E5);
     75 		InsertFormatMapping(&map, GL_RGB, GL_FLOAT, GL_RGB32F);
     76 		InsertFormatMapping(&map, GL_RGB, GL_HALF_FLOAT, GL_RGB16F);
     77 		InsertFormatMapping(&map, GL_RGB, GL_HALF_FLOAT_OES, GL_RGB16F);
     78 
     79 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_RGB8UI);
     80 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_BYTE, GL_RGB8I);
     81 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_RGB16UI);
     82 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_SHORT, GL_RGB16I);
     83 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_RGB32UI);
     84 		InsertFormatMapping(&map, GL_RGB_INTEGER, GL_INT, GL_RGB32I);
     85 
     86 		InsertFormatMapping(&map, GL_RG, GL_UNSIGNED_BYTE, GL_RG8);
     87 		InsertFormatMapping(&map, GL_RG, GL_BYTE, GL_RG8_SNORM);
     88 		InsertFormatMapping(&map, GL_RG, GL_FLOAT, GL_RG32F);
     89 		InsertFormatMapping(&map, GL_RG, GL_HALF_FLOAT, GL_RG16F);
     90 		InsertFormatMapping(&map, GL_RG, GL_HALF_FLOAT_OES, GL_RG16F);
     91 
     92 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_RG8UI);
     93 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_BYTE, GL_RG8I);
     94 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_RG16UI);
     95 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_SHORT, GL_RG16I);
     96 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_RG32UI);
     97 		InsertFormatMapping(&map, GL_RG_INTEGER, GL_INT, GL_RG32I);
     98 
     99 		InsertFormatMapping(&map, GL_RED, GL_UNSIGNED_BYTE, GL_R8);
    100 		InsertFormatMapping(&map, GL_RED, GL_BYTE, GL_R8_SNORM);
    101 		InsertFormatMapping(&map, GL_RED, GL_FLOAT, GL_R32F);
    102 		InsertFormatMapping(&map, GL_RED, GL_HALF_FLOAT, GL_R16F);
    103 		InsertFormatMapping(&map, GL_RED, GL_HALF_FLOAT_OES, GL_R16F);
    104 
    105 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_R8UI);
    106 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_BYTE, GL_R8I);
    107 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_R16UI);
    108 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_SHORT, GL_R16I);
    109 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_R32UI);
    110 		InsertFormatMapping(&map, GL_RED_INTEGER, GL_INT, GL_R32I);
    111 
    112 		InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE8_ALPHA8_EXT);
    113 		InsertFormatMapping(&map, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE8_EXT);
    114 		InsertFormatMapping(&map, GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA8_EXT);
    115 		InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_LUMINANCE_ALPHA32F_EXT);
    116 		InsertFormatMapping(&map, GL_LUMINANCE, GL_FLOAT, GL_LUMINANCE32F_EXT);
    117 		InsertFormatMapping(&map, GL_ALPHA, GL_FLOAT, GL_ALPHA32F_EXT);
    118 		InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, GL_LUMINANCE_ALPHA16F_EXT);
    119 		InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_LUMINANCE_ALPHA16F_EXT);
    120 		InsertFormatMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT, GL_LUMINANCE16F_EXT);
    121 		InsertFormatMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_LUMINANCE16F_EXT);
    122 		InsertFormatMapping(&map, GL_ALPHA, GL_HALF_FLOAT, GL_ALPHA16F_EXT);
    123 		InsertFormatMapping(&map, GL_ALPHA, GL_HALF_FLOAT_OES, GL_ALPHA16F_EXT);
    124 
    125 		InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_BGRA8_EXT);
    126 		InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_BGRA4_ANGLEX);
    127 		InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_BGR5_A1_ANGLEX);
    128 
    129 		InsertFormatMapping(&map, GL_SRGB_EXT, GL_UNSIGNED_BYTE, GL_SRGB8);
    130 		InsertFormatMapping(&map, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, GL_SRGB8_ALPHA8);
    131 
    132 		InsertFormatMapping(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
    133 		InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
    134 		InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
    135 		InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
    136 
    137 		InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_DEPTH_COMPONENT16);
    138 		InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT32_OES);
    139 		InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_FLOAT, GL_DEPTH_COMPONENT32F);
    140 
    141 		InsertFormatMapping(&map, GL_STENCIL, GL_UNSIGNED_BYTE, GL_STENCIL_INDEX8);
    142 
    143 		InsertFormatMapping(&map, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8);
    144 		InsertFormatMapping(&map, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_DEPTH32F_STENCIL8);
    145 
    146 		return map;
    147 	}
    148 
    149 	GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type)
    150 	{
    151 		switch(internalFormat)
    152 		{
    153 		case GL_ALPHA:
    154 		case GL_LUMINANCE:
    155 		case GL_LUMINANCE_ALPHA:
    156 		case GL_RED:
    157 		case GL_RG:
    158 		case GL_RGB:
    159 		case GL_RGBA:
    160 		case GL_RED_INTEGER:
    161 		case GL_RG_INTEGER:
    162 		case GL_RGB_INTEGER:
    163 		case GL_RGBA_INTEGER:
    164 		case GL_BGRA_EXT:
    165 		case GL_DEPTH_COMPONENT:
    166 		case GL_DEPTH_STENCIL:
    167 		case GL_SRGB_EXT:
    168 		case GL_SRGB_ALPHA_EXT:
    169 			{
    170 				static const FormatMap formatMap = BuildFormatMap();
    171 				FormatMap::const_iterator iter = formatMap.find(FormatTypePair(internalFormat, type));
    172 				return (iter != formatMap.end()) ? iter->second : GL_NONE;
    173 			}
    174 		default:
    175 			return internalFormat;
    176 		}
    177 	}
    178 
    179 	unsigned int UniformComponentCount(GLenum type)
    180 	{
    181 		switch(type)
    182 		{
    183 		case GL_BOOL:
    184 		case GL_FLOAT:
    185 		case GL_INT:
    186 		case GL_UNSIGNED_INT:
    187 		case GL_SAMPLER_2D:
    188 		case GL_SAMPLER_CUBE:
    189 		case GL_SAMPLER_EXTERNAL_OES:
    190 		case GL_SAMPLER_3D_OES:
    191 		case GL_SAMPLER_2D_ARRAY:
    192 		case GL_SAMPLER_2D_SHADOW:
    193 		case GL_SAMPLER_CUBE_SHADOW:
    194 		case GL_SAMPLER_2D_ARRAY_SHADOW:
    195 		case GL_INT_SAMPLER_2D:
    196 		case GL_UNSIGNED_INT_SAMPLER_2D:
    197 		case GL_INT_SAMPLER_CUBE:
    198 		case GL_UNSIGNED_INT_SAMPLER_CUBE:
    199 		case GL_INT_SAMPLER_3D:
    200 		case GL_UNSIGNED_INT_SAMPLER_3D:
    201 		case GL_INT_SAMPLER_2D_ARRAY:
    202 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
    203 			return 1;
    204 		case GL_BOOL_VEC2:
    205 		case GL_FLOAT_VEC2:
    206 		case GL_INT_VEC2:
    207 		case GL_UNSIGNED_INT_VEC2:
    208 			return 2;
    209 		case GL_INT_VEC3:
    210 		case GL_UNSIGNED_INT_VEC3:
    211 		case GL_FLOAT_VEC3:
    212 		case GL_BOOL_VEC3:
    213 			return 3;
    214 		case GL_BOOL_VEC4:
    215 		case GL_FLOAT_VEC4:
    216 		case GL_INT_VEC4:
    217 		case GL_UNSIGNED_INT_VEC4:
    218 		case GL_FLOAT_MAT2:
    219 			return 4;
    220 		case GL_FLOAT_MAT2x3:
    221 		case GL_FLOAT_MAT3x2:
    222 			return 6;
    223 		case GL_FLOAT_MAT2x4:
    224 		case GL_FLOAT_MAT4x2:
    225 			return 8;
    226 		case GL_FLOAT_MAT3:
    227 			return 9;
    228 		case GL_FLOAT_MAT3x4:
    229 		case GL_FLOAT_MAT4x3:
    230 			return 12;
    231 		case GL_FLOAT_MAT4:
    232 			return 16;
    233 		default:
    234 			UNREACHABLE(type);
    235 		}
    236 
    237 		return 0;
    238 	}
    239 
    240 	GLenum UniformComponentType(GLenum type)
    241 	{
    242 		switch(type)
    243 		{
    244 		case GL_BOOL:
    245 		case GL_BOOL_VEC2:
    246 		case GL_BOOL_VEC3:
    247 		case GL_BOOL_VEC4:
    248 			return GL_BOOL;
    249 		case GL_FLOAT:
    250 		case GL_FLOAT_VEC2:
    251 		case GL_FLOAT_VEC3:
    252 		case GL_FLOAT_VEC4:
    253 		case GL_FLOAT_MAT2:
    254 		case GL_FLOAT_MAT2x3:
    255 		case GL_FLOAT_MAT2x4:
    256 		case GL_FLOAT_MAT3:
    257 		case GL_FLOAT_MAT3x2:
    258 		case GL_FLOAT_MAT3x4:
    259 		case GL_FLOAT_MAT4:
    260 		case GL_FLOAT_MAT4x2:
    261 		case GL_FLOAT_MAT4x3:
    262 			return GL_FLOAT;
    263 		case GL_INT:
    264 		case GL_SAMPLER_2D:
    265 		case GL_SAMPLER_CUBE:
    266 		case GL_SAMPLER_EXTERNAL_OES:
    267 		case GL_SAMPLER_3D_OES:
    268 		case GL_SAMPLER_2D_ARRAY:
    269 		case GL_SAMPLER_2D_SHADOW:
    270 		case GL_SAMPLER_CUBE_SHADOW:
    271 		case GL_SAMPLER_2D_ARRAY_SHADOW:
    272 		case GL_INT_SAMPLER_2D:
    273 		case GL_UNSIGNED_INT_SAMPLER_2D:
    274 		case GL_INT_SAMPLER_CUBE:
    275 		case GL_UNSIGNED_INT_SAMPLER_CUBE:
    276 		case GL_INT_SAMPLER_3D:
    277 		case GL_UNSIGNED_INT_SAMPLER_3D:
    278 		case GL_INT_SAMPLER_2D_ARRAY:
    279 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
    280 		case GL_INT_VEC2:
    281 		case GL_INT_VEC3:
    282 		case GL_INT_VEC4:
    283 			return GL_INT;
    284 		case GL_UNSIGNED_INT:
    285 		case GL_UNSIGNED_INT_VEC2:
    286 		case GL_UNSIGNED_INT_VEC3:
    287 		case GL_UNSIGNED_INT_VEC4:
    288 			return GL_UNSIGNED_INT;
    289 		default:
    290 			UNREACHABLE(type);
    291 		}
    292 
    293 		return GL_NONE;
    294 	}
    295 
    296 	size_t UniformTypeSize(GLenum type)
    297 	{
    298 		switch(type)
    299 		{
    300 		case GL_BOOL:  return sizeof(GLboolean);
    301 		case GL_FLOAT: return sizeof(GLfloat);
    302 		case GL_INT:   return sizeof(GLint);
    303 		case GL_UNSIGNED_INT: return sizeof(GLuint);
    304 		}
    305 
    306 		return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type);
    307 	}
    308 
    309 	bool IsSamplerUniform(GLenum type)
    310 	{
    311 		switch(type)
    312 		{
    313 		case GL_SAMPLER_2D:
    314 		case GL_SAMPLER_CUBE:
    315 		case GL_SAMPLER_EXTERNAL_OES:
    316 		case GL_SAMPLER_3D_OES:
    317 		case GL_SAMPLER_2D_ARRAY:
    318 		case GL_SAMPLER_2D_SHADOW:
    319 		case GL_SAMPLER_CUBE_SHADOW:
    320 		case GL_SAMPLER_2D_ARRAY_SHADOW:
    321 		case GL_INT_SAMPLER_2D:
    322 		case GL_UNSIGNED_INT_SAMPLER_2D:
    323 		case GL_INT_SAMPLER_CUBE:
    324 		case GL_UNSIGNED_INT_SAMPLER_CUBE:
    325 		case GL_INT_SAMPLER_3D:
    326 		case GL_UNSIGNED_INT_SAMPLER_3D:
    327 		case GL_INT_SAMPLER_2D_ARRAY:
    328 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
    329 			return true;
    330 		default:
    331 			return false;
    332 		}
    333 	}
    334 
    335 	int VariableRowCount(GLenum type)
    336 	{
    337 		switch(type)
    338 		{
    339 		case GL_NONE:
    340 			return 0;
    341 		case GL_BOOL:
    342 		case GL_FLOAT:
    343 		case GL_INT:
    344 		case GL_UNSIGNED_INT:
    345 		case GL_BOOL_VEC2:
    346 		case GL_FLOAT_VEC2:
    347 		case GL_INT_VEC2:
    348 		case GL_UNSIGNED_INT_VEC2:
    349 		case GL_INT_VEC3:
    350 		case GL_UNSIGNED_INT_VEC3:
    351 		case GL_FLOAT_VEC3:
    352 		case GL_BOOL_VEC3:
    353 		case GL_BOOL_VEC4:
    354 		case GL_FLOAT_VEC4:
    355 		case GL_INT_VEC4:
    356 		case GL_UNSIGNED_INT_VEC4:
    357 		case GL_SAMPLER_2D:
    358 		case GL_SAMPLER_CUBE:
    359 		case GL_SAMPLER_EXTERNAL_OES:
    360 		case GL_SAMPLER_3D_OES:
    361 		case GL_SAMPLER_2D_ARRAY:
    362 		case GL_SAMPLER_2D_SHADOW:
    363 		case GL_SAMPLER_CUBE_SHADOW:
    364 		case GL_SAMPLER_2D_ARRAY_SHADOW:
    365 		case GL_INT_SAMPLER_2D:
    366 		case GL_UNSIGNED_INT_SAMPLER_2D:
    367 		case GL_INT_SAMPLER_CUBE:
    368 		case GL_UNSIGNED_INT_SAMPLER_CUBE:
    369 		case GL_INT_SAMPLER_3D:
    370 		case GL_UNSIGNED_INT_SAMPLER_3D:
    371 		case GL_INT_SAMPLER_2D_ARRAY:
    372 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
    373 			return 1;
    374 		case GL_FLOAT_MAT2:
    375 		case GL_FLOAT_MAT3x2:
    376 		case GL_FLOAT_MAT4x2:
    377 			return 2;
    378 		case GL_FLOAT_MAT3:
    379 		case GL_FLOAT_MAT2x3:
    380 		case GL_FLOAT_MAT4x3:
    381 			return 3;
    382 		case GL_FLOAT_MAT4:
    383 		case GL_FLOAT_MAT2x4:
    384 		case GL_FLOAT_MAT3x4:
    385 			return 4;
    386 		default:
    387 			UNREACHABLE(type);
    388 		}
    389 
    390 		return 0;
    391 	}
    392 
    393 	int VariableColumnCount(GLenum type)
    394 	{
    395 		switch(type)
    396 		{
    397 		case GL_NONE:
    398 			return 0;
    399 		case GL_BOOL:
    400 		case GL_FLOAT:
    401 		case GL_INT:
    402 		case GL_UNSIGNED_INT:
    403 			return 1;
    404 		case GL_BOOL_VEC2:
    405 		case GL_FLOAT_VEC2:
    406 		case GL_INT_VEC2:
    407 		case GL_UNSIGNED_INT_VEC2:
    408 		case GL_FLOAT_MAT2:
    409 		case GL_FLOAT_MAT2x3:
    410 		case GL_FLOAT_MAT2x4:
    411 			return 2;
    412 		case GL_INT_VEC3:
    413 		case GL_UNSIGNED_INT_VEC3:
    414 		case GL_FLOAT_VEC3:
    415 		case GL_BOOL_VEC3:
    416 		case GL_FLOAT_MAT3:
    417 		case GL_FLOAT_MAT3x2:
    418 		case GL_FLOAT_MAT3x4:
    419 			return 3;
    420 		case GL_BOOL_VEC4:
    421 		case GL_FLOAT_VEC4:
    422 		case GL_INT_VEC4:
    423 		case GL_UNSIGNED_INT_VEC4:
    424 		case GL_FLOAT_MAT4:
    425 		case GL_FLOAT_MAT4x2:
    426 		case GL_FLOAT_MAT4x3:
    427 			return 4;
    428 		default:
    429 			UNREACHABLE(type);
    430 		}
    431 
    432 		return 0;
    433 	}
    434 
    435 	int VariableRegisterCount(GLenum type)
    436 	{
    437 		// Number of registers used is the number of columns for matrices or 1 for scalars and vectors
    438 		return (VariableRowCount(type) > 1) ? VariableColumnCount(type) : 1;
    439 	}
    440 
    441 	int VariableRegisterSize(GLenum type)
    442 	{
    443 		// Number of components per register is the number of rows for matrices or columns for scalars and vectors
    444 		int nbRows = VariableRowCount(type);
    445 		return (nbRows > 1) ? nbRows : VariableColumnCount(type);
    446 	}
    447 
    448 	int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
    449 	{
    450 		ASSERT(allocationSize <= bitsSize);
    451 
    452 		unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
    453 
    454 		for(unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
    455 		{
    456 			if((*bits & mask) == 0)
    457 			{
    458 				*bits |= mask;
    459 				return i;
    460 			}
    461 
    462 			mask <<= 1;
    463 		}
    464 
    465 		return -1;
    466 	}
    467 
    468 	bool IsCompressed(GLenum format, GLint clientVersion)
    469 	{
    470 		return ValidateCompressedFormat(format, clientVersion, true) == GL_NONE;
    471 	}
    472 
    473 	GLenum ValidateCompressedFormat(GLenum format, GLint clientVersion, bool expectCompressedFormats)
    474 	{
    475 		switch(format)
    476 		{
    477 		case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    478 		case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
    479 		case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
    480 		case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
    481 			return S3TC_SUPPORT ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;
    482 		case GL_ETC1_RGB8_OES:
    483 			return expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION;
    484 		case GL_COMPRESSED_R11_EAC:
    485 		case GL_COMPRESSED_SIGNED_R11_EAC:
    486 		case GL_COMPRESSED_RG11_EAC:
    487 		case GL_COMPRESSED_SIGNED_RG11_EAC:
    488 		case GL_COMPRESSED_RGB8_ETC2:
    489 		case GL_COMPRESSED_SRGB8_ETC2:
    490 		case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
    491 		case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
    492 		case GL_COMPRESSED_RGBA8_ETC2_EAC:
    493 		case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
    494 		case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
    495 		case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
    496 		case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
    497 		case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
    498 		case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
    499 		case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
    500 		case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
    501 		case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
    502 		case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
    503 		case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
    504 		case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
    505 		case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
    506 		case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
    507 		case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
    508 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
    509 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
    510 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
    511 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
    512 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
    513 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
    514 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
    515 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
    516 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
    517 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
    518 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
    519 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
    520 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
    521 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
    522 			return (clientVersion >= 3) ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;
    523 		default:
    524 			return expectCompressedFormats ? GL_INVALID_ENUM : GL_NONE; // Not compressed format
    525 		}
    526 	}
    527 
    528 	GLenum ValidateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum sizedInternalFormat, Texture *texture)
    529 	{
    530 		if(!texture)
    531 		{
    532 			return GL_INVALID_OPERATION;
    533 		}
    534 
    535 		if(compressed != texture->isCompressed(target, level))
    536 		{
    537 			return GL_INVALID_OPERATION;
    538 		}
    539 
    540 		if(sizedInternalFormat != GL_NONE && sizedInternalFormat != texture->getFormat(target, level))
    541 		{
    542 			return GL_INVALID_OPERATION;
    543 		}
    544 
    545 		if(compressed)
    546 		{
    547 			if((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
    548 			   (height % 4 != 0 && height != texture->getHeight(target, 0)))
    549 			{
    550 				return GL_INVALID_OPERATION;
    551 			}
    552 		}
    553 
    554 		if(xoffset + width > texture->getWidth(target, level) ||
    555 		   yoffset + height > texture->getHeight(target, level))
    556 		{
    557 			return GL_INVALID_VALUE;
    558 		}
    559 
    560 		return GL_NONE;
    561 	}
    562 
    563 	GLenum ValidateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLsizei depth, GLint xoffset, GLint yoffset, GLint zoffset, GLenum target, GLint level, GLenum sizedInternalFormat, Texture *texture)
    564 	{
    565 		if(!texture)
    566 		{
    567 			return GL_INVALID_OPERATION;
    568 		}
    569 
    570 		if(compressed != texture->isCompressed(target, level))
    571 		{
    572 			return GL_INVALID_OPERATION;
    573 		}
    574 
    575 		if(sizedInternalFormat != GL_NONE && sizedInternalFormat != GetSizedInternalFormat(texture->getFormat(target, level), texture->getType(target, level)))
    576 		{
    577 			return GL_INVALID_OPERATION;
    578 		}
    579 
    580 		if(compressed)
    581 		{
    582 			if((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
    583 			   (height % 4 != 0 && height != texture->getHeight(target, 0)) ||
    584 			   (depth % 4 != 0 && depth != texture->getDepth(target, 0)))
    585 			{
    586 				return GL_INVALID_OPERATION;
    587 			}
    588 		}
    589 
    590 		if(xoffset + width > texture->getWidth(target, level) ||
    591 		   yoffset + height > texture->getHeight(target, level) ||
    592 		   zoffset + depth > texture->getDepth(target, level))
    593 		{
    594 			return GL_INVALID_VALUE;
    595 		}
    596 
    597 		return GL_NONE;
    598 	}
    599 
    600 	bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion)
    601 	{
    602 		// GL_NV_read_depth
    603 		if(format == GL_DEPTH_COMPONENT)
    604 		{
    605 			Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
    606 
    607 			if(!depthbuffer)
    608 			{
    609 				return false;
    610 			}
    611 
    612 			switch(type)
    613 			{
    614 			case GL_UNSIGNED_SHORT:
    615 			case GL_FLOAT:
    616 				return true;
    617 			default:
    618 				UNIMPLEMENTED();
    619 				return false;
    620 			}
    621 		}
    622 
    623 		Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
    624 
    625 		if(!colorbuffer)
    626 		{
    627 			return false;
    628 		}
    629 
    630 		sw::Format internalformat = colorbuffer->getInternalFormat();
    631 
    632 		if(sw::Surface::isNormalizedInteger(internalformat))
    633 		{
    634 			// Combination always supported by normalized fixed-point rendering surfaces.
    635 			if(format == GL_RGBA && type == GL_UNSIGNED_BYTE)
    636 			{
    637 				return true;
    638 			}
    639 
    640 			// GL_EXT_read_format_bgra combinations.
    641 			if(format == GL_BGRA_EXT)
    642 			{
    643 				if(type == GL_UNSIGNED_BYTE ||
    644 				   type == GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT ||
    645 				   type == GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT)
    646 				{
    647 					return true;
    648 				}
    649 			}
    650 		}
    651 		else if(sw::Surface::isFloatFormat(internalformat))
    652 		{
    653 			// Combination always supported by floating-point rendering surfaces.
    654 			// Supported in OpenGL ES 2.0 due to GL_EXT_color_buffer_half_float.
    655 			if(format == GL_RGBA && type == GL_FLOAT)
    656 			{
    657 				return true;
    658 			}
    659 		}
    660 		else if(sw::Surface::isSignedNonNormalizedInteger(internalformat))
    661 		{
    662 			ASSERT(clientVersion >= 3);
    663 
    664 			if(format == GL_RGBA_INTEGER && type == GL_INT)
    665 			{
    666 				return true;
    667 			}
    668 		}
    669 		else if(sw::Surface::isUnsignedNonNormalizedInteger(internalformat))
    670 		{
    671 			ASSERT(clientVersion >= 3);
    672 
    673 			if(format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT)
    674 			{
    675 				return true;
    676 			}
    677 		}
    678 		else UNREACHABLE(internalformat);
    679 
    680 		// GL_IMPLEMENTATION_COLOR_READ_FORMAT / GL_IMPLEMENTATION_COLOR_READ_TYPE
    681 		GLenum implementationReadFormat = GL_NONE;
    682 		GLenum implementationReadType = GL_NONE;
    683 		switch(format)
    684 		{
    685 		default:
    686 			implementationReadFormat = framebuffer->getImplementationColorReadFormat();
    687 			implementationReadType = framebuffer->getImplementationColorReadType();
    688 			break;
    689 		case GL_DEPTH_COMPONENT:
    690 			implementationReadFormat = framebuffer->getDepthReadFormat();
    691 			implementationReadType = framebuffer->getDepthReadType();
    692 			break;
    693 		}
    694 
    695 		if(format == implementationReadFormat && type == implementationReadType)
    696 		{
    697 			return true;
    698 		}
    699 
    700 		// Additional third combination accepted by OpenGL ES 3.0.
    701 		if(internalformat == sw::FORMAT_A2B10G10R10)
    702 		{
    703 			ASSERT(clientVersion >= 3);
    704 
    705 			if(format == GL_RGBA && type == GL_UNSIGNED_INT_2_10_10_10_REV)
    706 			{
    707 				return true;
    708 			}
    709 		}
    710 
    711 		return false;
    712 	}
    713 
    714 	bool IsDepthTexture(GLenum format)
    715 	{
    716 		return format == GL_DEPTH_COMPONENT ||
    717 		       format == GL_DEPTH_STENCIL_OES ||
    718 		       format == GL_DEPTH_COMPONENT16 ||
    719 		       format == GL_DEPTH_COMPONENT24 ||
    720 		       format == GL_DEPTH_COMPONENT32_OES ||
    721 		       format == GL_DEPTH_COMPONENT32F ||
    722 		       format == GL_DEPTH24_STENCIL8 ||
    723 		       format == GL_DEPTH32F_STENCIL8;
    724 	}
    725 
    726 	bool IsStencilTexture(GLenum format)
    727 	{
    728 		return format == GL_STENCIL_INDEX_OES ||
    729 		       format == GL_DEPTH_STENCIL_OES ||
    730 		       format == GL_DEPTH24_STENCIL8 ||
    731 		       format == GL_DEPTH32F_STENCIL8;
    732 	}
    733 
    734 	bool IsCubemapTextureTarget(GLenum target)
    735 	{
    736 		return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
    737 	}
    738 
    739 	int CubeFaceIndex(GLenum cubeFace)
    740 	{
    741 		switch(cubeFace)
    742 		{
    743 		case GL_TEXTURE_CUBE_MAP:
    744 		case GL_TEXTURE_CUBE_MAP_POSITIVE_X: return 0;
    745 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: return 1;
    746 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: return 2;
    747 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: return 3;
    748 		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: return 4;
    749 		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return 5;
    750 		default: UNREACHABLE(cubeFace); return 0;
    751 		}
    752 	}
    753 
    754 	bool IsTextureTarget(GLenum target)
    755 	{
    756 		return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
    757 	}
    758 
    759 	bool ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLint clientVersion)
    760 	{
    761 		switch(type)
    762 		{
    763 		case GL_UNSIGNED_BYTE:
    764 		case GL_UNSIGNED_SHORT_4_4_4_4:
    765 		case GL_UNSIGNED_SHORT_5_5_5_1:
    766 		case GL_UNSIGNED_SHORT_5_6_5:
    767 		case GL_FLOAT:               // GL_OES_texture_float
    768 		case GL_HALF_FLOAT_OES:      // GL_OES_texture_half_float
    769 		case GL_UNSIGNED_INT_24_8:   // GL_OES_packed_depth_stencil (GL_UNSIGNED_INT_24_8_EXT)
    770 		case GL_UNSIGNED_SHORT:      // GL_OES_depth_texture
    771 		case GL_UNSIGNED_INT:        // GL_OES_depth_texture
    772 			break;
    773 		case GL_BYTE:
    774 		case GL_SHORT:
    775 		case GL_INT:
    776 		case GL_HALF_FLOAT:
    777 		case GL_UNSIGNED_INT_2_10_10_10_REV:
    778 		case GL_UNSIGNED_INT_10F_11F_11F_REV:
    779 		case GL_UNSIGNED_INT_5_9_9_9_REV:
    780 		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
    781 			if(clientVersion < 3)
    782 			{
    783 				return error(GL_INVALID_ENUM, false);
    784 			}
    785 			break;
    786 		default:
    787 			return error(GL_INVALID_ENUM, false);
    788 		}
    789 
    790 		switch(format)
    791 		{
    792 		case GL_ALPHA:
    793 		case GL_RGB:
    794 		case GL_RGBA:
    795 		case GL_LUMINANCE:
    796 		case GL_LUMINANCE_ALPHA:
    797 		case GL_BGRA_EXT:          // GL_EXT_texture_format_BGRA8888
    798 		case GL_DEPTH_STENCIL:     // GL_OES_packed_depth_stencil (GL_DEPTH_STENCIL_OES)
    799 		case GL_DEPTH_COMPONENT:   // GL_OES_depth_texture
    800 		case GL_RED_EXT:           // GL_EXT_texture_rg
    801 		case GL_RG_EXT:            // GL_EXT_texture_rg
    802 			break;
    803 		case GL_RED_INTEGER:
    804 		case GL_RG_INTEGER:
    805 		case GL_RGB_INTEGER:
    806 		case GL_RGBA_INTEGER:
    807 			if(clientVersion < 3)
    808 			{
    809 				return error(GL_INVALID_ENUM, false);
    810 			}
    811 			break;
    812 		default:
    813 			return error(GL_INVALID_ENUM, false);
    814 		}
    815 
    816 		if((GLenum)internalformat != format)
    817 		{
    818 			if(clientVersion < 3)
    819 			{
    820 				return error(GL_INVALID_OPERATION, false);
    821 			}
    822 
    823 			switch(internalformat)
    824 			{
    825 			case GL_R8:
    826 			case GL_R8UI:
    827 			case GL_R8I:
    828 			case GL_R16UI:
    829 			case GL_R16I:
    830 			case GL_R32UI:
    831 			case GL_R32I:
    832 			case GL_RG8:
    833 			case GL_RG8UI:
    834 			case GL_RG8I:
    835 			case GL_RG16UI:
    836 			case GL_RG16I:
    837 			case GL_RG32UI:
    838 			case GL_RG32I:
    839 			case GL_SRGB8_ALPHA8:
    840 			case GL_RGB8UI:
    841 			case GL_RGB8I:
    842 			case GL_RGB16UI:
    843 			case GL_RGB16I:
    844 			case GL_RGB32UI:
    845 			case GL_RGB32I:
    846 			case GL_RG8_SNORM:
    847 			case GL_R8_SNORM:
    848 			case GL_RGB10_A2:
    849 			case GL_RGBA8UI:
    850 			case GL_RGBA8I:
    851 			case GL_RGB10_A2UI:
    852 			case GL_RGBA16UI:
    853 			case GL_RGBA16I:
    854 			case GL_RGBA32I:
    855 			case GL_RGBA32UI:
    856 			case GL_RGBA4:
    857 			case GL_RGB5_A1:
    858 			case GL_RGB565:
    859 			case GL_RGB8_OES:
    860 			case GL_RGBA8_OES:
    861 			case GL_R16F:
    862 			case GL_RG16F:
    863 			case GL_R11F_G11F_B10F:
    864 			case GL_RGB16F:
    865 			case GL_RGBA16F:
    866 			case GL_R32F:
    867 			case GL_RG32F:
    868 			case GL_RGB32F:
    869 			case GL_RGBA32F:
    870 			case GL_DEPTH_COMPONENT24:
    871 			case GL_DEPTH_COMPONENT32_OES:
    872 			case GL_DEPTH_COMPONENT32F:
    873 			case GL_DEPTH32F_STENCIL8:
    874 			case GL_DEPTH_COMPONENT16:
    875 			case GL_STENCIL_INDEX8:
    876 			case GL_DEPTH24_STENCIL8_OES:
    877 			case GL_RGBA8_SNORM:
    878 			case GL_SRGB8:
    879 			case GL_RGB8_SNORM:
    880 			case GL_RGB9_E5:
    881 				break;
    882 			default:
    883 				return error(GL_INVALID_ENUM, false);
    884 			}
    885 		}
    886 
    887 		// Validate format, type, and sized internalformat combinations [OpenGL ES 3.0 Table 3.2]
    888 		bool validSizedInternalformat = false;
    889 		#define VALIDATE_INTERNALFORMAT(...) { GLint validInternalformats[] = {__VA_ARGS__}; for(GLint v : validInternalformats) {if(internalformat == v) validSizedInternalformat = true;} } break;
    890 
    891 		switch(format)
    892 		{
    893 		case GL_RGBA:
    894 			switch(type)
    895 			{
    896 			case GL_UNSIGNED_BYTE:               VALIDATE_INTERNALFORMAT(GL_RGBA8, GL_RGB5_A1, GL_RGBA4, GL_SRGB8_ALPHA8)
    897 			case GL_BYTE:                        VALIDATE_INTERNALFORMAT(GL_RGBA8_SNORM)
    898 			case GL_HALF_FLOAT_OES:              break;
    899 			case GL_UNSIGNED_SHORT_4_4_4_4:      VALIDATE_INTERNALFORMAT(GL_RGBA4)
    900 			case GL_UNSIGNED_SHORT_5_5_5_1:      VALIDATE_INTERNALFORMAT(GL_RGB5_A1)
    901 			case GL_UNSIGNED_INT_2_10_10_10_REV: VALIDATE_INTERNALFORMAT(GL_RGB10_A2, GL_RGB5_A1)
    902 			case GL_HALF_FLOAT:                  VALIDATE_INTERNALFORMAT(GL_RGBA16F)
    903 			case GL_FLOAT:                       VALIDATE_INTERNALFORMAT(GL_RGBA32F, GL_RGBA16F)
    904 			default:                             return error(GL_INVALID_OPERATION, false);
    905 			}
    906 			break;
    907 		case GL_RGBA_INTEGER:
    908 			switch(type)
    909 			{
    910 			case GL_UNSIGNED_BYTE:               VALIDATE_INTERNALFORMAT(GL_RGBA8UI)
    911 			case GL_BYTE:                        VALIDATE_INTERNALFORMAT(GL_RGBA8I)
    912 			case GL_UNSIGNED_SHORT:              VALIDATE_INTERNALFORMAT(GL_RGBA16UI)
    913 			case GL_SHORT:                       VALIDATE_INTERNALFORMAT(GL_RGBA16I)
    914 			case GL_UNSIGNED_INT:                VALIDATE_INTERNALFORMAT(GL_RGBA32UI)
    915 			case GL_INT:                         VALIDATE_INTERNALFORMAT(GL_RGBA32I)
    916 			case GL_UNSIGNED_INT_2_10_10_10_REV: VALIDATE_INTERNALFORMAT(GL_RGB10_A2UI)
    917 			default:                             return error(GL_INVALID_OPERATION, false);
    918 			}
    919 			break;
    920 		case GL_RGB:
    921 			switch(type)
    922 			{
    923 			case GL_UNSIGNED_BYTE:                VALIDATE_INTERNALFORMAT(GL_RGB8, GL_RGB565, GL_SRGB8)
    924 			case GL_BYTE:                         VALIDATE_INTERNALFORMAT(GL_RGB8_SNORM)
    925 			case GL_HALF_FLOAT_OES:               break;
    926 			case GL_UNSIGNED_SHORT_5_6_5:         VALIDATE_INTERNALFORMAT(GL_RGB565)
    927 			case GL_UNSIGNED_INT_10F_11F_11F_REV: VALIDATE_INTERNALFORMAT(GL_R11F_G11F_B10F)
    928 			case GL_UNSIGNED_INT_5_9_9_9_REV:     VALIDATE_INTERNALFORMAT(GL_RGB9_E5)
    929 			case GL_HALF_FLOAT:                   VALIDATE_INTERNALFORMAT(GL_RGB16F, GL_R11F_G11F_B10F, GL_RGB9_E5)
    930 			case GL_FLOAT:                        VALIDATE_INTERNALFORMAT(GL_RGB32F, GL_RGB16F, GL_R11F_G11F_B10F, GL_RGB9_E5)
    931 			default:                              return error(GL_INVALID_OPERATION, false);
    932 			}
    933 			break;
    934 		case GL_RGB_INTEGER:
    935 			switch(type)
    936 			{
    937 			case GL_UNSIGNED_BYTE:               VALIDATE_INTERNALFORMAT(GL_RGB8UI)
    938 			case GL_BYTE:                        VALIDATE_INTERNALFORMAT(GL_RGB8I)
    939 			case GL_UNSIGNED_SHORT:              VALIDATE_INTERNALFORMAT(GL_RGB16UI)
    940 			case GL_SHORT:                       VALIDATE_INTERNALFORMAT(GL_RGB16I)
    941 			case GL_UNSIGNED_INT:                VALIDATE_INTERNALFORMAT(GL_RGB32UI)
    942 			case GL_INT:                         VALIDATE_INTERNALFORMAT(GL_RGB32I)
    943 			default:                             return error(GL_INVALID_OPERATION, false);
    944 			}
    945 			break;
    946 		case GL_RG:
    947 			switch(type)
    948 			{
    949 			case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_RG8)
    950 			case GL_BYTE:          VALIDATE_INTERNALFORMAT(GL_RG8_SNORM)
    951 			case GL_HALF_FLOAT_OES: break;
    952 			case GL_HALF_FLOAT:    VALIDATE_INTERNALFORMAT(GL_RG16F)
    953 			case GL_FLOAT:         VALIDATE_INTERNALFORMAT(GL_RG32F, GL_RG16F)
    954 			default:               return error(GL_INVALID_OPERATION, false);
    955 			}
    956 			break;
    957 		case GL_RG_INTEGER:
    958 			switch(type)
    959 			{
    960 			case GL_UNSIGNED_BYTE:  VALIDATE_INTERNALFORMAT(GL_RG8UI)
    961 			case GL_BYTE:           VALIDATE_INTERNALFORMAT(GL_RG8I)
    962 			case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_RG16UI)
    963 			case GL_SHORT:          VALIDATE_INTERNALFORMAT(GL_RG16I)
    964 			case GL_UNSIGNED_INT:   VALIDATE_INTERNALFORMAT(GL_RG32UI)
    965 			case GL_INT:            VALIDATE_INTERNALFORMAT(GL_RG32I)
    966 			default:                return error(GL_INVALID_OPERATION, false);
    967 			}
    968 			break;
    969 		case GL_RED:
    970 			switch(type)
    971 			{
    972 			case GL_UNSIGNED_BYTE: VALIDATE_INTERNALFORMAT(GL_R8)
    973 			case GL_BYTE:          VALIDATE_INTERNALFORMAT(GL_R8_SNORM)
    974 			case GL_HALF_FLOAT_OES: break;
    975 			case GL_HALF_FLOAT:    VALIDATE_INTERNALFORMAT(GL_R16F)
    976 			case GL_FLOAT:         VALIDATE_INTERNALFORMAT(GL_R32F, GL_R16F)
    977 			default:               return error(GL_INVALID_OPERATION, false);
    978 			}
    979 			break;
    980 		case GL_RED_INTEGER:
    981 			switch(type)
    982 			{
    983 			case GL_UNSIGNED_BYTE:  VALIDATE_INTERNALFORMAT(GL_R8UI)
    984 			case GL_BYTE:           VALIDATE_INTERNALFORMAT(GL_R8I)
    985 			case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_R16UI)
    986 			case GL_SHORT:          VALIDATE_INTERNALFORMAT(GL_R16I)
    987 			case GL_UNSIGNED_INT:   VALIDATE_INTERNALFORMAT(GL_R32UI)
    988 			case GL_INT:            VALIDATE_INTERNALFORMAT(GL_R32I)
    989 			default:                return error(GL_INVALID_OPERATION, false);
    990 			}
    991 			break;
    992 		case GL_DEPTH_COMPONENT:
    993 			switch(type)
    994 			{
    995 			case GL_UNSIGNED_SHORT: VALIDATE_INTERNALFORMAT(GL_DEPTH_COMPONENT16)
    996 			case GL_UNSIGNED_INT:   VALIDATE_INTERNALFORMAT(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16)
    997 			case GL_FLOAT:          VALIDATE_INTERNALFORMAT(GL_DEPTH_COMPONENT32F)
    998 			default:                return error(GL_INVALID_OPERATION, false);
    999 			}
   1000 			break;
   1001 		case GL_DEPTH_STENCIL:
   1002 			switch(type)
   1003 			{
   1004 			case GL_UNSIGNED_INT_24_8:              VALIDATE_INTERNALFORMAT(GL_DEPTH24_STENCIL8)
   1005 			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: VALIDATE_INTERNALFORMAT(GL_DEPTH32F_STENCIL8)
   1006 			default:                                return error(GL_INVALID_OPERATION, false);
   1007 			}
   1008 			break;
   1009 		case GL_LUMINANCE_ALPHA:
   1010 		case GL_LUMINANCE:
   1011 		case GL_ALPHA:
   1012 			switch(type)
   1013 			{
   1014 			case GL_UNSIGNED_BYTE:
   1015 			case GL_HALF_FLOAT_OES:
   1016 			case GL_FLOAT:
   1017 				break;
   1018 			default:
   1019 				return error(GL_INVALID_OPERATION, false);
   1020 			}
   1021 			break;
   1022 		case GL_BGRA_EXT:
   1023 			if(type != GL_UNSIGNED_BYTE)
   1024 			{
   1025 				return error(GL_INVALID_OPERATION, false);
   1026 			}
   1027 			break;
   1028 		default:
   1029 			UNREACHABLE(format);
   1030 			return error(GL_INVALID_ENUM, false);
   1031 		}
   1032 
   1033 		#undef VALIDATE_INTERNALFORMAT
   1034 
   1035 		if((GLenum)internalformat != format && !validSizedInternalformat)
   1036 		{
   1037 			return error(GL_INVALID_OPERATION, false);
   1038 		}
   1039 
   1040 		return true;
   1041 	}
   1042 
   1043 	bool IsColorRenderable(GLenum internalformat, GLint clientVersion, bool isTexture)
   1044 	{
   1045 		switch(internalformat)
   1046 		{
   1047 		case GL_RED_EXT:
   1048 		case GL_RG_EXT:
   1049 		case GL_RGB:
   1050 		case GL_RGBA:
   1051 			return isTexture;
   1052 		case GL_RGBA4:
   1053 		case GL_RGB5_A1:
   1054 		case GL_RGB565:
   1055 		case GL_R8_EXT:
   1056 		case GL_RG8_EXT:
   1057 		case GL_RGB8_OES:
   1058 		case GL_RGBA8_OES:
   1059 		case GL_R16F:
   1060 		case GL_RG16F:
   1061 		case GL_RGB16F:
   1062 		case GL_RGBA16F:
   1063 		case GL_R32F:
   1064 		case GL_RG32F:
   1065 		case GL_RGB32F:
   1066 		case GL_RGBA32F:
   1067 		case GL_BGRA8_EXT:
   1068 			return true;
   1069 		case GL_R8UI:
   1070 		case GL_R8I:
   1071 		case GL_R16UI:
   1072 		case GL_R16I:
   1073 		case GL_R32UI:
   1074 		case GL_R32I:
   1075 		case GL_RG8UI:
   1076 		case GL_RG8I:
   1077 		case GL_RG16UI:
   1078 		case GL_RG16I:
   1079 		case GL_RG32UI:
   1080 		case GL_RG32I:
   1081 		case GL_SRGB8_ALPHA8:
   1082 		case GL_RGB10_A2:
   1083 		case GL_RGBA8UI:
   1084 		case GL_RGBA8I:
   1085 		case GL_RGB10_A2UI:
   1086 		case GL_RGBA16UI:
   1087 		case GL_RGBA16I:
   1088 		case GL_RGBA32I:
   1089 		case GL_RGBA32UI:
   1090 		case GL_R11F_G11F_B10F:
   1091 			return clientVersion >= 3;
   1092 		case GL_DEPTH_COMPONENT24:
   1093 		case GL_DEPTH_COMPONENT32_OES:
   1094 		case GL_DEPTH_COMPONENT32F:
   1095 		case GL_DEPTH32F_STENCIL8:
   1096 		case GL_DEPTH_COMPONENT16:
   1097 		case GL_STENCIL_INDEX8:
   1098 		case GL_DEPTH24_STENCIL8_OES:
   1099 			return false;
   1100 		default:
   1101 			UNIMPLEMENTED();
   1102 		}
   1103 
   1104 		return false;
   1105 	}
   1106 
   1107 	bool IsDepthRenderable(GLenum internalformat, GLint clientVersion)
   1108 	{
   1109 		switch(internalformat)
   1110 		{
   1111 		case GL_DEPTH_COMPONENT24:
   1112 		case GL_DEPTH_COMPONENT16:
   1113 		case GL_DEPTH24_STENCIL8_OES:    // GL_OES_packed_depth_stencil
   1114 		case GL_DEPTH_COMPONENT32_OES:   // GL_OES_depth32
   1115 			return true;
   1116 		case GL_DEPTH32F_STENCIL8:
   1117 		case GL_DEPTH_COMPONENT32F:
   1118 			return clientVersion >= 3;
   1119 		case GL_STENCIL_INDEX8:
   1120 		case GL_R8:
   1121 		case GL_R8UI:
   1122 		case GL_R8I:
   1123 		case GL_R16UI:
   1124 		case GL_R16I:
   1125 		case GL_R32UI:
   1126 		case GL_R32I:
   1127 		case GL_RG8:
   1128 		case GL_RG8UI:
   1129 		case GL_RG8I:
   1130 		case GL_RG16UI:
   1131 		case GL_RG16I:
   1132 		case GL_RG32UI:
   1133 		case GL_RG32I:
   1134 		case GL_SRGB8_ALPHA8:
   1135 		case GL_RGB10_A2:
   1136 		case GL_RGBA8UI:
   1137 		case GL_RGBA8I:
   1138 		case GL_RGB10_A2UI:
   1139 		case GL_RGBA16UI:
   1140 		case GL_RGBA16I:
   1141 		case GL_RGBA32I:
   1142 		case GL_RGBA32UI:
   1143 		case GL_RGBA4:
   1144 		case GL_RGB5_A1:
   1145 		case GL_RGB565:
   1146 		case GL_RGB8_OES:
   1147 		case GL_RGBA8_OES:
   1148 		case GL_RED:
   1149 		case GL_RG:
   1150 		case GL_RGB:
   1151 		case GL_RGBA:
   1152 		case GL_R16F:
   1153 		case GL_RG16F:
   1154 		case GL_R11F_G11F_B10F:
   1155 		case GL_RGB16F:
   1156 		case GL_RGBA16F:
   1157 		case GL_R32F:
   1158 		case GL_RG32F:
   1159 		case GL_RGB32F:
   1160 		case GL_RGBA32F:
   1161 			return false;
   1162 		default:
   1163 			UNIMPLEMENTED();
   1164 		}
   1165 
   1166 		return false;
   1167 	}
   1168 
   1169 	bool IsStencilRenderable(GLenum internalformat, GLint clientVersion)
   1170 	{
   1171 		switch(internalformat)
   1172 		{
   1173 		case GL_STENCIL_INDEX8:
   1174 		case GL_DEPTH24_STENCIL8_OES:
   1175 			return true;
   1176 		case GL_DEPTH32F_STENCIL8:
   1177 			return clientVersion >= 3;
   1178 		case GL_R8:
   1179 		case GL_R8UI:
   1180 		case GL_R8I:
   1181 		case GL_R16UI:
   1182 		case GL_R16I:
   1183 		case GL_R32UI:
   1184 		case GL_R32I:
   1185 		case GL_RG8:
   1186 		case GL_RG8UI:
   1187 		case GL_RG8I:
   1188 		case GL_RG16UI:
   1189 		case GL_RG16I:
   1190 		case GL_RG32UI:
   1191 		case GL_RG32I:
   1192 		case GL_SRGB8_ALPHA8:
   1193 		case GL_RGB10_A2:
   1194 		case GL_RGBA8UI:
   1195 		case GL_RGBA8I:
   1196 		case GL_RGB10_A2UI:
   1197 		case GL_RGBA16UI:
   1198 		case GL_RGBA16I:
   1199 		case GL_RGBA32I:
   1200 		case GL_RGBA32UI:
   1201 		case GL_RGBA4:
   1202 		case GL_RGB5_A1:
   1203 		case GL_RGB565:
   1204 		case GL_RGB8_OES:
   1205 		case GL_RGBA8_OES:
   1206 		case GL_RED:
   1207 		case GL_RG:
   1208 		case GL_RGB:
   1209 		case GL_RGBA:
   1210 		case GL_R16F:
   1211 		case GL_RG16F:
   1212 		case GL_R11F_G11F_B10F:
   1213 		case GL_RGB16F:
   1214 		case GL_RGBA16F:
   1215 		case GL_R32F:
   1216 		case GL_RG32F:
   1217 		case GL_RGB32F:
   1218 		case GL_RGBA32F:
   1219 		case GL_DEPTH_COMPONENT16:
   1220 		case GL_DEPTH_COMPONENT24:
   1221 		case GL_DEPTH_COMPONENT32_OES:
   1222 		case GL_DEPTH_COMPONENT32F:
   1223 			return false;
   1224 		default:
   1225 			UNIMPLEMENTED();
   1226 		}
   1227 
   1228 		return false;
   1229 	}
   1230 
   1231 	std::string ParseUniformName(const std::string &name, unsigned int *outSubscript)
   1232 	{
   1233 		// Strip any trailing array operator and retrieve the subscript
   1234 		size_t open = name.find_last_of('[');
   1235 		size_t close = name.find_last_of(']');
   1236 		bool hasIndex = (open != std::string::npos) && (close == name.length() - 1);
   1237 		if(!hasIndex)
   1238 		{
   1239 			if(outSubscript)
   1240 			{
   1241 				*outSubscript = GL_INVALID_INDEX;
   1242 			}
   1243 			return name;
   1244 		}
   1245 
   1246 		if(outSubscript)
   1247 		{
   1248 			int index = atoi(name.substr(open + 1).c_str());
   1249 			if(index >= 0)
   1250 			{
   1251 				*outSubscript = index;
   1252 			}
   1253 			else
   1254 			{
   1255 				*outSubscript = GL_INVALID_INDEX;
   1256 			}
   1257 		}
   1258 
   1259 		return name.substr(0, open);
   1260 	}
   1261 }
   1262 
   1263 namespace es2sw
   1264 {
   1265 	sw::DepthCompareMode ConvertDepthComparison(GLenum comparison)
   1266 	{
   1267 		switch(comparison)
   1268 		{
   1269 		case GL_NEVER:    return sw::DEPTH_NEVER;
   1270 		case GL_ALWAYS:   return sw::DEPTH_ALWAYS;
   1271 		case GL_LESS:     return sw::DEPTH_LESS;
   1272 		case GL_LEQUAL:   return sw::DEPTH_LESSEQUAL;
   1273 		case GL_EQUAL:    return sw::DEPTH_EQUAL;
   1274 		case GL_GREATER:  return sw::DEPTH_GREATER;
   1275 		case GL_GEQUAL:   return sw::DEPTH_GREATEREQUAL;
   1276 		case GL_NOTEQUAL: return sw::DEPTH_NOTEQUAL;
   1277 		default: UNREACHABLE(comparison);
   1278 		}
   1279 
   1280 		return sw::DEPTH_ALWAYS;
   1281 	}
   1282 
   1283 	sw::StencilCompareMode ConvertStencilComparison(GLenum comparison)
   1284 	{
   1285 		switch(comparison)
   1286 		{
   1287 		case GL_NEVER:    return sw::STENCIL_NEVER;
   1288 		case GL_ALWAYS:   return sw::STENCIL_ALWAYS;
   1289 		case GL_LESS:     return sw::STENCIL_LESS;
   1290 		case GL_LEQUAL:   return sw::STENCIL_LESSEQUAL;
   1291 		case GL_EQUAL:    return sw::STENCIL_EQUAL;
   1292 		case GL_GREATER:  return sw::STENCIL_GREATER;
   1293 		case GL_GEQUAL:   return sw::STENCIL_GREATEREQUAL;
   1294 		case GL_NOTEQUAL: return sw::STENCIL_NOTEQUAL;
   1295 		default: UNREACHABLE(comparison);
   1296 		}
   1297 
   1298 		return sw::STENCIL_ALWAYS;
   1299 	}
   1300 
   1301 	sw::Color<float> ConvertColor(es2::Color color)
   1302 	{
   1303 		return sw::Color<float>(color.red, color.green, color.blue, color.alpha);
   1304 	}
   1305 
   1306 	sw::BlendFactor ConvertBlendFunc(GLenum blend)
   1307 	{
   1308 		switch(blend)
   1309 		{
   1310 		case GL_ZERO:                     return sw::BLEND_ZERO;
   1311 		case GL_ONE:                      return sw::BLEND_ONE;
   1312 		case GL_SRC_COLOR:                return sw::BLEND_SOURCE;
   1313 		case GL_ONE_MINUS_SRC_COLOR:      return sw::BLEND_INVSOURCE;
   1314 		case GL_DST_COLOR:                return sw::BLEND_DEST;
   1315 		case GL_ONE_MINUS_DST_COLOR:      return sw::BLEND_INVDEST;
   1316 		case GL_SRC_ALPHA:                return sw::BLEND_SOURCEALPHA;
   1317 		case GL_ONE_MINUS_SRC_ALPHA:      return sw::BLEND_INVSOURCEALPHA;
   1318 		case GL_DST_ALPHA:                return sw::BLEND_DESTALPHA;
   1319 		case GL_ONE_MINUS_DST_ALPHA:      return sw::BLEND_INVDESTALPHA;
   1320 		case GL_CONSTANT_COLOR:           return sw::BLEND_CONSTANT;
   1321 		case GL_ONE_MINUS_CONSTANT_COLOR: return sw::BLEND_INVCONSTANT;
   1322 		case GL_CONSTANT_ALPHA:           return sw::BLEND_CONSTANTALPHA;
   1323 		case GL_ONE_MINUS_CONSTANT_ALPHA: return sw::BLEND_INVCONSTANTALPHA;
   1324 		case GL_SRC_ALPHA_SATURATE:       return sw::BLEND_SRCALPHASAT;
   1325 		default: UNREACHABLE(blend);
   1326 		}
   1327 
   1328 		return sw::BLEND_ZERO;
   1329 	}
   1330 
   1331 	sw::BlendOperation ConvertBlendOp(GLenum blendOp)
   1332 	{
   1333 		switch(blendOp)
   1334 		{
   1335 		case GL_FUNC_ADD:              return sw::BLENDOP_ADD;
   1336 		case GL_FUNC_SUBTRACT:         return sw::BLENDOP_SUB;
   1337 		case GL_FUNC_REVERSE_SUBTRACT: return sw::BLENDOP_INVSUB;
   1338 		case GL_MIN_EXT:               return sw::BLENDOP_MIN;
   1339 		case GL_MAX_EXT:               return sw::BLENDOP_MAX;
   1340 		default: UNREACHABLE(blendOp);
   1341 		}
   1342 
   1343 		return sw::BLENDOP_ADD;
   1344 	}
   1345 
   1346 	sw::StencilOperation ConvertStencilOp(GLenum stencilOp)
   1347 	{
   1348 		switch(stencilOp)
   1349 		{
   1350 		case GL_ZERO:      return sw::OPERATION_ZERO;
   1351 		case GL_KEEP:      return sw::OPERATION_KEEP;
   1352 		case GL_REPLACE:   return sw::OPERATION_REPLACE;
   1353 		case GL_INCR:      return sw::OPERATION_INCRSAT;
   1354 		case GL_DECR:      return sw::OPERATION_DECRSAT;
   1355 		case GL_INVERT:    return sw::OPERATION_INVERT;
   1356 		case GL_INCR_WRAP: return sw::OPERATION_INCR;
   1357 		case GL_DECR_WRAP: return sw::OPERATION_DECR;
   1358 		default: UNREACHABLE(stencilOp);
   1359 		}
   1360 
   1361 		return sw::OPERATION_KEEP;
   1362 	}
   1363 
   1364 	sw::AddressingMode ConvertTextureWrap(GLenum wrap)
   1365 	{
   1366 		switch(wrap)
   1367 		{
   1368 		case GL_REPEAT:            return sw::ADDRESSING_WRAP;
   1369 		case GL_CLAMP_TO_EDGE:     return sw::ADDRESSING_CLAMP;
   1370 		case GL_MIRRORED_REPEAT:   return sw::ADDRESSING_MIRROR;
   1371 		default: UNREACHABLE(wrap);
   1372 		}
   1373 
   1374 		return sw::ADDRESSING_WRAP;
   1375 	}
   1376 
   1377 	sw::SwizzleType ConvertSwizzleType(GLenum swizzleType)
   1378 	{
   1379 		switch(swizzleType)
   1380 		{
   1381 		case GL_RED:   return sw::SWIZZLE_RED;
   1382 		case GL_GREEN: return sw::SWIZZLE_GREEN;
   1383 		case GL_BLUE:  return sw::SWIZZLE_BLUE;
   1384 		case GL_ALPHA: return sw::SWIZZLE_ALPHA;
   1385 		case GL_ZERO:  return sw::SWIZZLE_ZERO;
   1386 		case GL_ONE:   return sw::SWIZZLE_ONE;
   1387 		default: UNREACHABLE(swizzleType);
   1388 		}
   1389 
   1390 		return sw::SWIZZLE_RED;
   1391 	};
   1392 
   1393 	sw::CullMode ConvertCullMode(GLenum cullFace, GLenum frontFace)
   1394 	{
   1395 		switch(cullFace)
   1396 		{
   1397 		case GL_FRONT:
   1398 			return (frontFace == GL_CCW ? sw::CULL_CLOCKWISE : sw::CULL_COUNTERCLOCKWISE);
   1399 		case GL_BACK:
   1400 			return (frontFace == GL_CCW ? sw::CULL_COUNTERCLOCKWISE : sw::CULL_CLOCKWISE);
   1401 		case GL_FRONT_AND_BACK:
   1402 			return sw::CULL_NONE;   // culling will be handled during draw
   1403 		default: UNREACHABLE(cullFace);
   1404 		}
   1405 
   1406 		return sw::CULL_COUNTERCLOCKWISE;
   1407 	}
   1408 
   1409 	unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha)
   1410 	{
   1411 		return (red   ? 0x00000001 : 0) |
   1412 			   (green ? 0x00000002 : 0) |
   1413 			   (blue  ? 0x00000004 : 0) |
   1414 			   (alpha ? 0x00000008 : 0);
   1415 	}
   1416 
   1417 	sw::MipmapType ConvertMipMapFilter(GLenum minFilter)
   1418 	{
   1419 		switch(minFilter)
   1420 		{
   1421 		case GL_NEAREST:
   1422 		case GL_LINEAR:
   1423 			return sw::MIPMAP_NONE;
   1424 			break;
   1425 		case GL_NEAREST_MIPMAP_NEAREST:
   1426 		case GL_LINEAR_MIPMAP_NEAREST:
   1427 			return sw::MIPMAP_POINT;
   1428 			break;
   1429 		case GL_NEAREST_MIPMAP_LINEAR:
   1430 		case GL_LINEAR_MIPMAP_LINEAR:
   1431 			return sw::MIPMAP_LINEAR;
   1432 			break;
   1433 		default:
   1434 			UNREACHABLE(minFilter);
   1435 			return sw::MIPMAP_NONE;
   1436 		}
   1437 	}
   1438 
   1439 	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)
   1440 	{
   1441 		if(maxAnisotropy > 1.0f)
   1442 		{
   1443 			return sw::FILTER_ANISOTROPIC;
   1444 		}
   1445 
   1446 		sw::FilterType magFilterType = sw::FILTER_POINT;
   1447 		switch(magFilter)
   1448 		{
   1449 		case GL_NEAREST: magFilterType = sw::FILTER_POINT;  break;
   1450 		case GL_LINEAR:  magFilterType = sw::FILTER_LINEAR; break;
   1451 		default: UNREACHABLE(magFilter);
   1452 		}
   1453 
   1454 		switch(minFilter)
   1455 		{
   1456 		case GL_NEAREST:
   1457 		case GL_NEAREST_MIPMAP_NEAREST:
   1458 		case GL_NEAREST_MIPMAP_LINEAR:
   1459 			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;
   1460 		case GL_LINEAR:
   1461 		case GL_LINEAR_MIPMAP_NEAREST:
   1462 		case GL_LINEAR_MIPMAP_LINEAR:
   1463 			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR;
   1464 		default:
   1465 			UNREACHABLE(minFilter);
   1466 			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;
   1467 		}
   1468 	}
   1469 
   1470 	bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &drawType, int &primitiveCount, int &verticesPerPrimitive)
   1471 	{
   1472 		switch(primitiveType)
   1473 		{
   1474 		case GL_POINTS:
   1475 			drawType = sw::DRAW_POINTLIST;
   1476 			primitiveCount = elementCount;
   1477 			verticesPerPrimitive = 1;
   1478 			break;
   1479 		case GL_LINES:
   1480 			drawType = sw::DRAW_LINELIST;
   1481 			primitiveCount = elementCount / 2;
   1482 			verticesPerPrimitive = 2;
   1483 			break;
   1484 		case GL_LINE_LOOP:
   1485 			drawType = sw::DRAW_LINELOOP;
   1486 			primitiveCount = elementCount;
   1487 			verticesPerPrimitive = 2;
   1488 			break;
   1489 		case GL_LINE_STRIP:
   1490 			drawType = sw::DRAW_LINESTRIP;
   1491 			primitiveCount = elementCount - 1;
   1492 			verticesPerPrimitive = 2;
   1493 			break;
   1494 		case GL_TRIANGLES:
   1495 			drawType = sw::DRAW_TRIANGLELIST;
   1496 			primitiveCount = elementCount / 3;
   1497 			verticesPerPrimitive = 3;
   1498 			break;
   1499 		case GL_TRIANGLE_STRIP:
   1500 			drawType = sw::DRAW_TRIANGLESTRIP;
   1501 			primitiveCount = elementCount - 2;
   1502 			verticesPerPrimitive = 3;
   1503 			break;
   1504 		case GL_TRIANGLE_FAN:
   1505 			drawType = sw::DRAW_TRIANGLEFAN;
   1506 			primitiveCount = elementCount - 2;
   1507 			verticesPerPrimitive = 3;
   1508 			break;
   1509 		default:
   1510 			return false;
   1511 		}
   1512 
   1513 		sw::DrawType elementSize;
   1514 		switch(elementType)
   1515 		{
   1516 		case GL_NONE:           elementSize = sw::DRAW_NONINDEXED; break;
   1517 		case GL_UNSIGNED_BYTE:  elementSize = sw::DRAW_INDEXED8;   break;
   1518 		case GL_UNSIGNED_SHORT: elementSize = sw::DRAW_INDEXED16;  break;
   1519 		case GL_UNSIGNED_INT:   elementSize = sw::DRAW_INDEXED32;  break;
   1520 		default: return false;
   1521 		}
   1522 
   1523 		drawType = sw::DrawType(drawType | elementSize);
   1524 
   1525 		return true;
   1526 	}
   1527 
   1528 	sw::Format ConvertRenderbufferFormat(GLenum format)
   1529 	{
   1530 		switch(format)
   1531 		{
   1532 		case GL_RGBA4:
   1533 		case GL_RGB5_A1:
   1534 		case GL_RGBA8_OES:            return sw::FORMAT_A8B8G8R8;
   1535 		case GL_RGB565:               return sw::FORMAT_R5G6B5;
   1536 		case GL_RGB8_OES:             return sw::FORMAT_X8B8G8R8;
   1537 		case GL_DEPTH_COMPONENT16:
   1538 		case GL_STENCIL_INDEX8:
   1539 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;
   1540 		case GL_DEPTH_COMPONENT32_OES:return sw::FORMAT_D32;
   1541 		case GL_R8:                   return sw::FORMAT_R8;
   1542 		case GL_RG8:                  return sw::FORMAT_G8R8;
   1543 		case GL_R8I:                  return sw::FORMAT_R8I;
   1544 		case GL_RG8I:                 return sw::FORMAT_G8R8I;
   1545 		case GL_RGB8I:                return sw::FORMAT_X8B8G8R8I;
   1546 		case GL_RGBA8I:               return sw::FORMAT_A8B8G8R8I;
   1547 		case GL_R8UI:                 return sw::FORMAT_R8UI;
   1548 		case GL_RG8UI:                return sw::FORMAT_G8R8UI;
   1549 		case GL_RGB8UI:               return sw::FORMAT_X8B8G8R8UI;
   1550 		case GL_RGBA8UI:              return sw::FORMAT_A8B8G8R8UI;
   1551 		case GL_R16I:                 return sw::FORMAT_R16I;
   1552 		case GL_RG16I:                return sw::FORMAT_G16R16I;
   1553 		case GL_RGB16I:               return sw::FORMAT_X16B16G16R16I;
   1554 		case GL_RGBA16I:              return sw::FORMAT_A16B16G16R16I;
   1555 		case GL_R16UI:                return sw::FORMAT_R16UI;
   1556 		case GL_RG16UI:               return sw::FORMAT_G16R16UI;
   1557 		case GL_RGB16UI:              return sw::FORMAT_X16B16G16R16UI;
   1558 		case GL_RGB10_A2UI:
   1559 		case GL_RGBA16UI:             return sw::FORMAT_A16B16G16R16UI;
   1560 		case GL_R32I:                 return sw::FORMAT_R32I;
   1561 		case GL_RG32I:                return sw::FORMAT_G32R32I;
   1562 		case GL_RGB32I:               return sw::FORMAT_X32B32G32R32I;
   1563 		case GL_RGBA32I:              return sw::FORMAT_A32B32G32R32I;
   1564 		case GL_R32UI:                return sw::FORMAT_R32UI;
   1565 		case GL_RG32UI:               return sw::FORMAT_G32R32UI;
   1566 		case GL_RGB32UI:              return sw::FORMAT_X32B32G32R32UI;
   1567 		case GL_RGBA32UI:             return sw::FORMAT_A32B32G32R32UI;
   1568 		case GL_R16F:                 return sw::FORMAT_R16F;
   1569 		case GL_RG16F:                return sw::FORMAT_G16R16F;
   1570 		case GL_R11F_G11F_B10F:
   1571 		case GL_RGB16F:               return sw::FORMAT_B16G16R16F;
   1572 		case GL_RGBA16F:              return sw::FORMAT_A16B16G16R16F;
   1573 		case GL_R32F:                 return sw::FORMAT_R32F;
   1574 		case GL_RG32F:                return sw::FORMAT_G32R32F;
   1575 		case GL_RGB32F:               return sw::FORMAT_B32G32R32F;
   1576 		case GL_RGBA32F:              return sw::FORMAT_A32B32G32R32F;
   1577 		case GL_RGB10_A2:             return sw::FORMAT_A2B10G10R10;
   1578 		case GL_SRGB8:                return sw::FORMAT_SRGB8_X8;
   1579 		case GL_SRGB8_ALPHA8:         return sw::FORMAT_SRGB8_A8;
   1580 		default: UNREACHABLE(format); return sw::FORMAT_NULL;
   1581 		}
   1582 	}
   1583 }
   1584 
   1585 namespace sw2es
   1586 {
   1587 	unsigned int GetStencilSize(sw::Format stencilFormat)
   1588 	{
   1589 		switch(stencilFormat)
   1590 		{
   1591 		case sw::FORMAT_D24FS8:
   1592 		case sw::FORMAT_D24S8:
   1593 		case sw::FORMAT_D32FS8_TEXTURE:
   1594 		case sw::FORMAT_D32FS8_SHADOW:
   1595 		case sw::FORMAT_S8:
   1596 			return 8;
   1597 	//	case sw::FORMAT_D24X4S4:
   1598 	//		return 4;
   1599 	//	case sw::FORMAT_D15S1:
   1600 	//		return 1;
   1601 	//	case sw::FORMAT_D16_LOCKABLE:
   1602 		case sw::FORMAT_D32:
   1603 		case sw::FORMAT_D24X8:
   1604 		case sw::FORMAT_D32F_LOCKABLE:
   1605 		case sw::FORMAT_D16:
   1606 			return 0;
   1607 	//	case sw::FORMAT_D32_LOCKABLE:  return 0;
   1608 	//	case sw::FORMAT_S8_LOCKABLE:   return 8;
   1609 		default:
   1610 			return 0;
   1611 		}
   1612 	}
   1613 
   1614 	unsigned int GetAlphaSize(sw::Format colorFormat)
   1615 	{
   1616 		switch(colorFormat)
   1617 		{
   1618 		case sw::FORMAT_A16B16G16R16F:
   1619 		case sw::FORMAT_A16B16G16R16I:
   1620 		case sw::FORMAT_A16B16G16R16UI:
   1621 			return 16;
   1622 		case sw::FORMAT_A32B32G32R32F:
   1623 		case sw::FORMAT_A32B32G32R32I:
   1624 		case sw::FORMAT_A32B32G32R32UI:
   1625 			return 32;
   1626 		case sw::FORMAT_A2R10G10B10:
   1627 			return 2;
   1628 		case sw::FORMAT_A8R8G8B8:
   1629 		case sw::FORMAT_A8B8G8R8:
   1630 		case sw::FORMAT_SRGB8_A8:
   1631 		case sw::FORMAT_A8B8G8R8I:
   1632 		case sw::FORMAT_A8B8G8R8UI:
   1633 		case sw::FORMAT_A8B8G8R8I_SNORM:
   1634 			return 8;
   1635 		case sw::FORMAT_A2B10G10R10:
   1636 			return 2;
   1637 		case sw::FORMAT_A1R5G5B5:
   1638 			return 1;
   1639 		case sw::FORMAT_X8R8G8B8:
   1640 		case sw::FORMAT_X8B8G8R8:
   1641 		case sw::FORMAT_SRGB8_X8:
   1642 		case sw::FORMAT_R5G6B5:
   1643 			return 0;
   1644 		default:
   1645 			return 0;
   1646 		}
   1647 	}
   1648 
   1649 	unsigned int GetRedSize(sw::Format colorFormat)
   1650 	{
   1651 		switch(colorFormat)
   1652 		{
   1653 		case sw::FORMAT_R16F:
   1654 		case sw::FORMAT_G16R16F:
   1655 		case sw::FORMAT_B16G16R16F:
   1656 		case sw::FORMAT_A16B16G16R16F:
   1657 		case sw::FORMAT_R16I:
   1658 		case sw::FORMAT_G16R16I:
   1659 		case sw::FORMAT_X16B16G16R16I:
   1660 		case sw::FORMAT_A16B16G16R16I:
   1661 		case sw::FORMAT_R16UI:
   1662 		case sw::FORMAT_G16R16UI:
   1663 		case sw::FORMAT_X16B16G16R16UI:
   1664 		case sw::FORMAT_A16B16G16R16UI:
   1665 			return 16;
   1666 		case sw::FORMAT_R32F:
   1667 		case sw::FORMAT_G32R32F:
   1668 		case sw::FORMAT_B32G32R32F:
   1669 		case sw::FORMAT_X32B32G32R32F:
   1670 		case sw::FORMAT_A32B32G32R32F:
   1671 		case sw::FORMAT_R32I:
   1672 		case sw::FORMAT_G32R32I:
   1673 		case sw::FORMAT_X32B32G32R32I:
   1674 		case sw::FORMAT_A32B32G32R32I:
   1675 		case sw::FORMAT_R32UI:
   1676 		case sw::FORMAT_G32R32UI:
   1677 		case sw::FORMAT_X32B32G32R32UI:
   1678 		case sw::FORMAT_A32B32G32R32UI:
   1679 			return 32;
   1680 		case sw::FORMAT_A2B10G10R10:
   1681 		case sw::FORMAT_A2R10G10B10:
   1682 			return 10;
   1683 		case sw::FORMAT_A8R8G8B8:
   1684 		case sw::FORMAT_A8B8G8R8:
   1685 		case sw::FORMAT_X8R8G8B8:
   1686 		case sw::FORMAT_X8B8G8R8:
   1687 		case sw::FORMAT_SRGB8_A8:
   1688 		case sw::FORMAT_SRGB8_X8:
   1689 		case sw::FORMAT_R8:
   1690 		case sw::FORMAT_G8R8:
   1691 		case sw::FORMAT_R8I:
   1692 		case sw::FORMAT_G8R8I:
   1693 		case sw::FORMAT_X8B8G8R8I:
   1694 		case sw::FORMAT_A8B8G8R8I:
   1695 		case sw::FORMAT_R8UI:
   1696 		case sw::FORMAT_G8R8UI:
   1697 		case sw::FORMAT_X8B8G8R8UI:
   1698 		case sw::FORMAT_A8B8G8R8UI:
   1699 		case sw::FORMAT_R8I_SNORM:
   1700 		case sw::FORMAT_G8R8I_SNORM:
   1701 		case sw::FORMAT_X8B8G8R8I_SNORM:
   1702 		case sw::FORMAT_A8B8G8R8I_SNORM:
   1703 			return 8;
   1704 		case sw::FORMAT_A1R5G5B5:
   1705 		case sw::FORMAT_R5G6B5:
   1706 			return 5;
   1707 		default:
   1708 			return 0;
   1709 		}
   1710 	}
   1711 
   1712 	unsigned int GetGreenSize(sw::Format colorFormat)
   1713 	{
   1714 		switch(colorFormat)
   1715 		{
   1716 		case sw::FORMAT_G16R16F:
   1717 		case sw::FORMAT_B16G16R16F:
   1718 		case sw::FORMAT_A16B16G16R16F:
   1719 		case sw::FORMAT_G16R16I:
   1720 		case sw::FORMAT_X16B16G16R16I:
   1721 		case sw::FORMAT_A16B16G16R16I:
   1722 		case sw::FORMAT_G16R16UI:
   1723 		case sw::FORMAT_X16B16G16R16UI:
   1724 		case sw::FORMAT_A16B16G16R16UI:
   1725 			return 16;
   1726 		case sw::FORMAT_G32R32F:
   1727 		case sw::FORMAT_B32G32R32F:
   1728 		case sw::FORMAT_X32B32G32R32F:
   1729 		case sw::FORMAT_A32B32G32R32F:
   1730 		case sw::FORMAT_G32R32I:
   1731 		case sw::FORMAT_X32B32G32R32I:
   1732 		case sw::FORMAT_A32B32G32R32I:
   1733 		case sw::FORMAT_G32R32UI:
   1734 		case sw::FORMAT_X32B32G32R32UI:
   1735 		case sw::FORMAT_A32B32G32R32UI:
   1736 			return 32;
   1737 		case sw::FORMAT_A2B10G10R10:
   1738 		case sw::FORMAT_A2R10G10B10:
   1739 			return 10;
   1740 		case sw::FORMAT_A8R8G8B8:
   1741 		case sw::FORMAT_A8B8G8R8:
   1742 		case sw::FORMAT_X8R8G8B8:
   1743 		case sw::FORMAT_X8B8G8R8:
   1744 		case sw::FORMAT_SRGB8_A8:
   1745 		case sw::FORMAT_SRGB8_X8:
   1746 		case sw::FORMAT_G8R8:
   1747 		case sw::FORMAT_G8R8I:
   1748 		case sw::FORMAT_X8B8G8R8I:
   1749 		case sw::FORMAT_A8B8G8R8I:
   1750 		case sw::FORMAT_G8R8UI:
   1751 		case sw::FORMAT_X8B8G8R8UI:
   1752 		case sw::FORMAT_A8B8G8R8UI:
   1753 		case sw::FORMAT_G8R8I_SNORM:
   1754 		case sw::FORMAT_X8B8G8R8I_SNORM:
   1755 		case sw::FORMAT_A8B8G8R8I_SNORM:
   1756 			return 8;
   1757 		case sw::FORMAT_A1R5G5B5:
   1758 			return 5;
   1759 		case sw::FORMAT_R5G6B5:
   1760 			return 6;
   1761 		default:
   1762 			return 0;
   1763 		}
   1764 	}
   1765 
   1766 	unsigned int GetBlueSize(sw::Format colorFormat)
   1767 	{
   1768 		switch(colorFormat)
   1769 		{
   1770 		case sw::FORMAT_B16G16R16F:
   1771 		case sw::FORMAT_A16B16G16R16F:
   1772 		case sw::FORMAT_X16B16G16R16I:
   1773 		case sw::FORMAT_A16B16G16R16I:
   1774 		case sw::FORMAT_X16B16G16R16UI:
   1775 		case sw::FORMAT_A16B16G16R16UI:
   1776 			return 16;
   1777 		case sw::FORMAT_B32G32R32F:
   1778 		case sw::FORMAT_X32B32G32R32F:
   1779 		case sw::FORMAT_A32B32G32R32F:
   1780 		case sw::FORMAT_X32B32G32R32I:
   1781 		case sw::FORMAT_A32B32G32R32I:
   1782 		case sw::FORMAT_X32B32G32R32UI:
   1783 		case sw::FORMAT_A32B32G32R32UI:
   1784 			return 32;
   1785 		case sw::FORMAT_A2B10G10R10:
   1786 		case sw::FORMAT_A2R10G10B10:
   1787 			return 10;
   1788 		case sw::FORMAT_A8R8G8B8:
   1789 		case sw::FORMAT_A8B8G8R8:
   1790 		case sw::FORMAT_X8R8G8B8:
   1791 		case sw::FORMAT_X8B8G8R8:
   1792 		case sw::FORMAT_SRGB8_A8:
   1793 		case sw::FORMAT_SRGB8_X8:
   1794 		case sw::FORMAT_X8B8G8R8I:
   1795 		case sw::FORMAT_A8B8G8R8I:
   1796 		case sw::FORMAT_X8B8G8R8UI:
   1797 		case sw::FORMAT_A8B8G8R8UI:
   1798 		case sw::FORMAT_X8B8G8R8I_SNORM:
   1799 		case sw::FORMAT_A8B8G8R8I_SNORM:
   1800 			return 8;
   1801 		case sw::FORMAT_A1R5G5B5:
   1802 		case sw::FORMAT_R5G6B5:
   1803 			return 5;
   1804 		default:
   1805 			return 0;
   1806 		}
   1807 	}
   1808 
   1809 	unsigned int GetDepthSize(sw::Format depthFormat)
   1810 	{
   1811 		switch(depthFormat)
   1812 		{
   1813 	//	case sw::FORMAT_D16_LOCKABLE:   return 16;
   1814 		case sw::FORMAT_D32:            return 32;
   1815 	//	case sw::FORMAT_D15S1:          return 15;
   1816 		case sw::FORMAT_D24S8:          return 24;
   1817 		case sw::FORMAT_D24X8:          return 24;
   1818 	//	case sw::FORMAT_D24X4S4:        return 24;
   1819 		case sw::FORMAT_DF16S8:
   1820 		case sw::FORMAT_D16:            return 16;
   1821 		case sw::FORMAT_D32F:
   1822 		case sw::FORMAT_D32F_COMPLEMENTARY:
   1823 		case sw::FORMAT_D32F_LOCKABLE:  return 32;
   1824 		case sw::FORMAT_DF24S8:
   1825 		case sw::FORMAT_D24FS8:         return 24;
   1826 	//	case sw::FORMAT_D32_LOCKABLE:   return 32;
   1827 	//	case sw::FORMAT_S8_LOCKABLE:    return 0;
   1828 		case sw::FORMAT_D32FS8_SHADOW:
   1829 		case sw::FORMAT_D32FS8_TEXTURE: return 32;
   1830 		default:                        return 0;
   1831 		}
   1832 	}
   1833 
   1834 	GLenum GetComponentType(sw::Format format, GLenum attachment)
   1835 	{
   1836 		// Can be one of GL_FLOAT, GL_INT, GL_UNSIGNED_INT, GL_SIGNED_NORMALIZED, or GL_UNSIGNED_NORMALIZED
   1837 		switch(attachment)
   1838 		{
   1839 		case GL_COLOR_ATTACHMENT0:
   1840 		case GL_COLOR_ATTACHMENT1:
   1841 		case GL_COLOR_ATTACHMENT2:
   1842 		case GL_COLOR_ATTACHMENT3:
   1843 		case GL_COLOR_ATTACHMENT4:
   1844 		case GL_COLOR_ATTACHMENT5:
   1845 		case GL_COLOR_ATTACHMENT6:
   1846 		case GL_COLOR_ATTACHMENT7:
   1847 		case GL_COLOR_ATTACHMENT8:
   1848 		case GL_COLOR_ATTACHMENT9:
   1849 		case GL_COLOR_ATTACHMENT10:
   1850 		case GL_COLOR_ATTACHMENT11:
   1851 		case GL_COLOR_ATTACHMENT12:
   1852 		case GL_COLOR_ATTACHMENT13:
   1853 		case GL_COLOR_ATTACHMENT14:
   1854 		case GL_COLOR_ATTACHMENT15:
   1855 		case GL_COLOR_ATTACHMENT16:
   1856 		case GL_COLOR_ATTACHMENT17:
   1857 		case GL_COLOR_ATTACHMENT18:
   1858 		case GL_COLOR_ATTACHMENT19:
   1859 		case GL_COLOR_ATTACHMENT20:
   1860 		case GL_COLOR_ATTACHMENT21:
   1861 		case GL_COLOR_ATTACHMENT22:
   1862 		case GL_COLOR_ATTACHMENT23:
   1863 		case GL_COLOR_ATTACHMENT24:
   1864 		case GL_COLOR_ATTACHMENT25:
   1865 		case GL_COLOR_ATTACHMENT26:
   1866 		case GL_COLOR_ATTACHMENT27:
   1867 		case GL_COLOR_ATTACHMENT28:
   1868 		case GL_COLOR_ATTACHMENT29:
   1869 		case GL_COLOR_ATTACHMENT30:
   1870 		case GL_COLOR_ATTACHMENT31:
   1871 			switch(format)
   1872 			{
   1873 			case sw::FORMAT_R8I:
   1874 			case sw::FORMAT_G8R8I:
   1875 			case sw::FORMAT_X8B8G8R8I:
   1876 			case sw::FORMAT_A8B8G8R8I:
   1877 			case sw::FORMAT_R16I:
   1878 			case sw::FORMAT_G16R16I:
   1879 			case sw::FORMAT_X16B16G16R16I:
   1880 			case sw::FORMAT_A16B16G16R16I:
   1881 			case sw::FORMAT_R32I:
   1882 			case sw::FORMAT_G32R32I:
   1883 			case sw::FORMAT_X32B32G32R32I:
   1884 			case sw::FORMAT_A32B32G32R32I:
   1885 				return GL_INT;
   1886 			case sw::FORMAT_R8UI:
   1887 			case sw::FORMAT_G8R8UI:
   1888 			case sw::FORMAT_X8B8G8R8UI:
   1889 			case sw::FORMAT_A8B8G8R8UI:
   1890 			case sw::FORMAT_R16UI:
   1891 			case sw::FORMAT_G16R16UI:
   1892 			case sw::FORMAT_X16B16G16R16UI:
   1893 			case sw::FORMAT_A16B16G16R16UI:
   1894 			case sw::FORMAT_R32UI:
   1895 			case sw::FORMAT_G32R32UI:
   1896 			case sw::FORMAT_X32B32G32R32UI:
   1897 			case sw::FORMAT_A32B32G32R32UI:
   1898 				return GL_UNSIGNED_INT;
   1899 			case sw::FORMAT_R16F:
   1900 			case sw::FORMAT_G16R16F:
   1901 			case sw::FORMAT_B16G16R16F:
   1902 			case sw::FORMAT_A16B16G16R16F:
   1903 			case sw::FORMAT_R32F:
   1904 			case sw::FORMAT_G32R32F:
   1905 			case sw::FORMAT_B32G32R32F:
   1906 			case sw::FORMAT_X32B32G32R32F:
   1907 			case sw::FORMAT_A32B32G32R32F:
   1908 				return GL_FLOAT;
   1909 			case sw::FORMAT_R8:
   1910 			case sw::FORMAT_G8R8:
   1911 			case sw::FORMAT_A2B10G10R10:
   1912 			case sw::FORMAT_A2R10G10B10:
   1913 			case sw::FORMAT_A8R8G8B8:
   1914 			case sw::FORMAT_A8B8G8R8:
   1915 			case sw::FORMAT_X8R8G8B8:
   1916 			case sw::FORMAT_X8B8G8R8:
   1917 			case sw::FORMAT_SRGB8_A8:
   1918 			case sw::FORMAT_SRGB8_X8:
   1919 			case sw::FORMAT_A1R5G5B5:
   1920 			case sw::FORMAT_R5G6B5:
   1921 				return GL_UNSIGNED_NORMALIZED;
   1922 			case sw::FORMAT_R8I_SNORM:
   1923 			case sw::FORMAT_X8B8G8R8I_SNORM:
   1924 			case sw::FORMAT_A8B8G8R8I_SNORM:
   1925 			case sw::FORMAT_G8R8I_SNORM:
   1926 				return GL_SIGNED_NORMALIZED;
   1927 			default:
   1928 				UNREACHABLE(format);
   1929 				return GL_NONE;
   1930 			}
   1931 		case GL_DEPTH_ATTACHMENT:
   1932 		case GL_STENCIL_ATTACHMENT:
   1933 			// Only color buffers may have integer components.
   1934 			return GL_FLOAT;
   1935 		default:
   1936 			UNREACHABLE(attachment);
   1937 			return GL_NONE;
   1938 		}
   1939 	}
   1940 
   1941 	GLenum ConvertBackBufferFormat(sw::Format format)
   1942 	{
   1943 		switch(format)
   1944 		{
   1945 		case sw::FORMAT_A4R4G4B4: return GL_RGBA4;
   1946 		case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES;
   1947 		case sw::FORMAT_A8B8G8R8: return GL_RGBA8_OES;
   1948 		case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1;
   1949 		case sw::FORMAT_R5G6B5:   return GL_RGB565;
   1950 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;
   1951 		case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;
   1952 		case sw::FORMAT_SRGB8_A8: return GL_RGBA8_OES;
   1953 		case sw::FORMAT_SRGB8_X8: return GL_RGB8_OES;
   1954 		default:
   1955 			UNREACHABLE(format);
   1956 		}
   1957 
   1958 		return GL_RGBA4;
   1959 	}
   1960 
   1961 	GLenum ConvertDepthStencilFormat(sw::Format format)
   1962 	{
   1963 		switch(format)
   1964 		{
   1965 		case sw::FORMAT_D16:
   1966 		case sw::FORMAT_D24X8:
   1967 		case sw::FORMAT_D32:
   1968 			return GL_DEPTH_COMPONENT16;
   1969 		case sw::FORMAT_D24S8:
   1970 			return GL_DEPTH24_STENCIL8_OES;
   1971 		case sw::FORMAT_D32F:
   1972 		case sw::FORMAT_D32F_COMPLEMENTARY:
   1973 		case sw::FORMAT_D32F_LOCKABLE:
   1974 			return GL_DEPTH_COMPONENT32F;
   1975 		case sw::FORMAT_D32FS8_TEXTURE:
   1976 		case sw::FORMAT_D32FS8_SHADOW:
   1977 			return GL_DEPTH32F_STENCIL8;
   1978 		case sw::FORMAT_S8:
   1979 			return GL_STENCIL_INDEX8;
   1980 		default:
   1981 			UNREACHABLE(format);
   1982 		}
   1983 
   1984 		return GL_DEPTH24_STENCIL8_OES;
   1985 	}
   1986 }
   1987