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