1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // This file is here so other GLES2 related files can have a common set of 6 // includes where appropriate. 7 8 #include <stdio.h> 9 #include <GLES2/gl2.h> 10 #include <GLES2/gl2ext.h> 11 #include <GLES2/gl2extchromium.h> 12 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" 14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 15 16 namespace gpu { 17 namespace gles2 { 18 19 namespace gl_error_bit { 20 enum GLErrorBit { 21 kNoError = 0, 22 kInvalidEnum = (1 << 0), 23 kInvalidValue = (1 << 1), 24 kInvalidOperation = (1 << 2), 25 kOutOfMemory = (1 << 3), 26 kInvalidFrameBufferOperation = (1 << 4) 27 }; 28 } 29 30 int GLES2Util::GLGetNumValuesReturned(int id) const { 31 switch (id) { 32 // -- glGetBooleanv, glGetFloatv, glGetIntergerv 33 case GL_ACTIVE_TEXTURE: 34 return 1; 35 case GL_ALIASED_LINE_WIDTH_RANGE: 36 return 2; 37 case GL_ALIASED_POINT_SIZE_RANGE: 38 return 2; 39 case GL_ALPHA_BITS: 40 return 1; 41 case GL_ARRAY_BUFFER_BINDING: 42 return 1; 43 case GL_BLEND: 44 return 1; 45 case GL_BLEND_COLOR: 46 return 4; 47 case GL_BLEND_DST_ALPHA: 48 return 1; 49 case GL_BLEND_DST_RGB: 50 return 1; 51 case GL_BLEND_EQUATION_ALPHA: 52 return 1; 53 case GL_BLEND_EQUATION_RGB: 54 return 1; 55 case GL_BLEND_SRC_ALPHA: 56 return 1; 57 case GL_BLEND_SRC_RGB: 58 return 1; 59 case GL_BLUE_BITS: 60 return 1; 61 case GL_COLOR_CLEAR_VALUE: 62 return 4; 63 case GL_COLOR_WRITEMASK: 64 return 4; 65 case GL_COMPRESSED_TEXTURE_FORMATS: 66 return num_compressed_texture_formats_; 67 case GL_CULL_FACE: 68 return 1; 69 case GL_CULL_FACE_MODE: 70 return 1; 71 case GL_CURRENT_PROGRAM: 72 return 1; 73 case GL_DEPTH_BITS: 74 return 1; 75 case GL_DEPTH_CLEAR_VALUE: 76 return 1; 77 case GL_DEPTH_FUNC: 78 return 1; 79 case GL_DEPTH_RANGE: 80 return 2; 81 case GL_DEPTH_TEST: 82 return 1; 83 case GL_DEPTH_WRITEMASK: 84 return 1; 85 case GL_DITHER: 86 return 1; 87 case GL_ELEMENT_ARRAY_BUFFER_BINDING: 88 return 1; 89 case GL_FRAMEBUFFER_BINDING: 90 return 1; 91 case GL_FRONT_FACE: 92 return 1; 93 case GL_GENERATE_MIPMAP_HINT: 94 return 1; 95 case GL_GREEN_BITS: 96 return 1; 97 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 98 return 1; 99 case GL_IMPLEMENTATION_COLOR_READ_TYPE: 100 return 1; 101 case GL_LINE_WIDTH: 102 return 1; 103 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 104 return 1; 105 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 106 return 1; 107 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 108 return 1; 109 case GL_MAX_RENDERBUFFER_SIZE: 110 return 1; 111 case GL_MAX_TEXTURE_IMAGE_UNITS: 112 return 1; 113 case GL_MAX_TEXTURE_SIZE: 114 return 1; 115 case GL_MAX_VARYING_VECTORS: 116 return 1; 117 case GL_MAX_VERTEX_ATTRIBS: 118 return 1; 119 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 120 return 1; 121 case GL_MAX_VERTEX_UNIFORM_VECTORS: 122 return 1; 123 case GL_MAX_VIEWPORT_DIMS: 124 return 2; 125 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 126 return 1; 127 case GL_NUM_SHADER_BINARY_FORMATS: 128 return 1; 129 case GL_PACK_ALIGNMENT: 130 return 1; 131 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: 132 return 1; 133 case GL_POLYGON_OFFSET_FACTOR: 134 return 1; 135 case GL_POLYGON_OFFSET_FILL: 136 return 1; 137 case GL_POLYGON_OFFSET_UNITS: 138 return 1; 139 case GL_RED_BITS: 140 return 1; 141 case GL_RENDERBUFFER_BINDING: 142 return 1; 143 case GL_SAMPLE_BUFFERS: 144 return 1; 145 case GL_SAMPLE_COVERAGE_INVERT: 146 return 1; 147 case GL_SAMPLE_COVERAGE_VALUE: 148 return 1; 149 case GL_SAMPLES: 150 return 1; 151 case GL_SCISSOR_BOX: 152 return 4; 153 case GL_SCISSOR_TEST: 154 return 1; 155 case GL_SHADER_BINARY_FORMATS: 156 return num_shader_binary_formats_; 157 case GL_SHADER_COMPILER: 158 return 1; 159 case GL_STENCIL_BACK_FAIL: 160 return 1; 161 case GL_STENCIL_BACK_FUNC: 162 return 1; 163 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: 164 return 1; 165 case GL_STENCIL_BACK_PASS_DEPTH_PASS: 166 return 1; 167 case GL_STENCIL_BACK_REF: 168 return 1; 169 case GL_STENCIL_BACK_VALUE_MASK: 170 return 1; 171 case GL_STENCIL_BACK_WRITEMASK: 172 return 1; 173 case GL_STENCIL_BITS: 174 return 1; 175 case GL_STENCIL_CLEAR_VALUE: 176 return 1; 177 case GL_STENCIL_FAIL: 178 return 1; 179 case GL_STENCIL_FUNC: 180 return 1; 181 case GL_STENCIL_PASS_DEPTH_FAIL: 182 return 1; 183 case GL_STENCIL_PASS_DEPTH_PASS: 184 return 1; 185 case GL_STENCIL_REF: 186 return 1; 187 case GL_STENCIL_TEST: 188 return 1; 189 case GL_STENCIL_VALUE_MASK: 190 return 1; 191 case GL_STENCIL_WRITEMASK: 192 return 1; 193 case GL_SUBPIXEL_BITS: 194 return 1; 195 case GL_TEXTURE_BINDING_2D: 196 return 1; 197 case GL_TEXTURE_BINDING_CUBE_MAP: 198 return 1; 199 case GL_TEXTURE_BINDING_EXTERNAL_OES: 200 return 1; 201 case GL_TEXTURE_BINDING_RECTANGLE_ARB: 202 return 1; 203 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT: 204 return 1; 205 case GL_UNPACK_ALIGNMENT: 206 return 1; 207 case GL_VIEWPORT: 208 return 4; 209 // -- glGetBooleanv, glGetFloatv, glGetIntergerv with 210 // GL_CHROMIUM_framebuffer_multisample 211 case GL_MAX_SAMPLES_EXT: 212 return 1; 213 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 214 return 1; 215 216 // -- glGetBufferParameteriv 217 case GL_BUFFER_SIZE: 218 return 1; 219 case GL_BUFFER_USAGE: 220 return 1; 221 222 // -- glGetFramebufferAttachmentParameteriv 223 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 224 return 1; 225 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 226 return 1; 227 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 228 return 1; 229 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 230 return 1; 231 // -- glGetFramebufferAttachmentParameteriv with 232 // GL_EXT_multisampled_render_to_texture 233 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT: 234 return 1; 235 236 // -- glGetProgramiv 237 case GL_DELETE_STATUS: 238 return 1; 239 case GL_LINK_STATUS: 240 return 1; 241 case GL_VALIDATE_STATUS: 242 return 1; 243 case GL_INFO_LOG_LENGTH: 244 return 1; 245 case GL_ATTACHED_SHADERS: 246 return 1; 247 case GL_ACTIVE_ATTRIBUTES: 248 return 1; 249 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: 250 return 1; 251 case GL_ACTIVE_UNIFORMS: 252 return 1; 253 case GL_ACTIVE_UNIFORM_MAX_LENGTH: 254 return 1; 255 256 257 // -- glGetRenderbufferAttachmentParameteriv 258 case GL_RENDERBUFFER_WIDTH: 259 return 1; 260 case GL_RENDERBUFFER_HEIGHT: 261 return 1; 262 case GL_RENDERBUFFER_INTERNAL_FORMAT: 263 return 1; 264 case GL_RENDERBUFFER_RED_SIZE: 265 return 1; 266 case GL_RENDERBUFFER_GREEN_SIZE: 267 return 1; 268 case GL_RENDERBUFFER_BLUE_SIZE: 269 return 1; 270 case GL_RENDERBUFFER_ALPHA_SIZE: 271 return 1; 272 case GL_RENDERBUFFER_DEPTH_SIZE: 273 return 1; 274 case GL_RENDERBUFFER_STENCIL_SIZE: 275 return 1; 276 // -- glGetRenderbufferAttachmentParameteriv with 277 // GL_EXT_multisampled_render_to_texture 278 case GL_RENDERBUFFER_SAMPLES_EXT: 279 return 1; 280 281 // -- glGetShaderiv 282 case GL_SHADER_TYPE: 283 return 1; 284 // Already defined under glGetFramebufferAttachemntParameteriv. 285 // case GL_DELETE_STATUS: 286 // return 1; 287 case GL_COMPILE_STATUS: 288 return 1; 289 // Already defined under glGetFramebufferAttachemntParameteriv. 290 // case GL_INFO_LOG_LENGTH: 291 // return 1; 292 case GL_SHADER_SOURCE_LENGTH: 293 return 1; 294 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: 295 return 1; 296 297 // -- glGetTexParameterfv, glGetTexParameteriv 298 case GL_TEXTURE_MAG_FILTER: 299 return 1; 300 case GL_TEXTURE_MIN_FILTER: 301 return 1; 302 case GL_TEXTURE_WRAP_S: 303 return 1; 304 case GL_TEXTURE_WRAP_T: 305 return 1; 306 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 307 return 1; 308 309 // -- glGetVertexAttribfv, glGetVertexAttribiv 310 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 311 return 1; 312 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: 313 return 1; 314 case GL_VERTEX_ATTRIB_ARRAY_SIZE: 315 return 1; 316 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: 317 return 1; 318 case GL_VERTEX_ATTRIB_ARRAY_TYPE: 319 return 1; 320 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: 321 return 1; 322 case GL_CURRENT_VERTEX_ATTRIB: 323 return 4; 324 325 // -- glHint with GL_OES_standard_derivatives 326 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 327 return 1; 328 329 // bad enum 330 default: 331 return 0; 332 } 333 } 334 335 namespace { 336 337 // Return the number of elements per group of a specified format. 338 int ElementsPerGroup(int format, int type) { 339 switch (type) { 340 case GL_UNSIGNED_SHORT_5_6_5: 341 case GL_UNSIGNED_SHORT_4_4_4_4: 342 case GL_UNSIGNED_SHORT_5_5_5_1: 343 case GL_UNSIGNED_INT_24_8_OES: 344 return 1; 345 default: 346 break; 347 } 348 349 switch (format) { 350 case GL_RGB: 351 return 3; 352 case GL_LUMINANCE_ALPHA: 353 return 2; 354 case GL_RGBA: 355 case GL_BGRA_EXT: 356 return 4; 357 case GL_ALPHA: 358 case GL_LUMINANCE: 359 case GL_DEPTH_COMPONENT: 360 case GL_DEPTH_COMPONENT24_OES: 361 case GL_DEPTH_COMPONENT32_OES: 362 case GL_DEPTH_COMPONENT16: 363 case GL_DEPTH24_STENCIL8_OES: 364 case GL_DEPTH_STENCIL_OES: 365 return 1; 366 default: 367 return 0; 368 } 369 } 370 371 // Return the number of bytes per element, based on the element type. 372 int BytesPerElement(int type) { 373 switch (type) { 374 case GL_FLOAT: 375 case GL_UNSIGNED_INT_24_8_OES: 376 case GL_UNSIGNED_INT: 377 return 4; 378 case GL_HALF_FLOAT_OES: 379 case GL_UNSIGNED_SHORT: 380 case GL_SHORT: 381 case GL_UNSIGNED_SHORT_5_6_5: 382 case GL_UNSIGNED_SHORT_4_4_4_4: 383 case GL_UNSIGNED_SHORT_5_5_5_1: 384 return 2; 385 case GL_UNSIGNED_BYTE: 386 case GL_BYTE: 387 return 1; 388 default: 389 return 0; 390 } 391 } 392 393 } // anonymous namespace 394 395 uint32 GLES2Util::ComputeImageGroupSize(int format, int type) { 396 return BytesPerElement(type) * ElementsPerGroup(format, type); 397 } 398 399 bool GLES2Util::ComputeImagePaddedRowSize( 400 int width, int format, int type, int unpack_alignment, 401 uint32* padded_row_size) { 402 uint32 bytes_per_group = ComputeImageGroupSize(format, type); 403 uint32 unpadded_row_size; 404 if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) { 405 return false; 406 } 407 uint32 temp; 408 if (!SafeAddUint32(unpadded_row_size, unpack_alignment - 1, &temp)) { 409 return false; 410 } 411 *padded_row_size = (temp / unpack_alignment) * unpack_alignment; 412 return true; 413 } 414 415 // Returns the amount of data glTexImage2D or glTexSubImage2D will access. 416 bool GLES2Util::ComputeImageDataSizes( 417 int width, int height, int format, int type, int unpack_alignment, 418 uint32* size, uint32* ret_unpadded_row_size, uint32* ret_padded_row_size) { 419 uint32 bytes_per_group = ComputeImageGroupSize(format, type); 420 uint32 row_size; 421 if (!SafeMultiplyUint32(width, bytes_per_group, &row_size)) { 422 return false; 423 } 424 if (height > 1) { 425 uint32 temp; 426 if (!SafeAddUint32(row_size, unpack_alignment - 1, &temp)) { 427 return false; 428 } 429 uint32 padded_row_size = (temp / unpack_alignment) * unpack_alignment; 430 uint32 size_of_all_but_last_row; 431 if (!SafeMultiplyUint32((height - 1), padded_row_size, 432 &size_of_all_but_last_row)) { 433 return false; 434 } 435 if (!SafeAddUint32(size_of_all_but_last_row, row_size, size)) { 436 return false; 437 } 438 if (ret_padded_row_size) { 439 *ret_padded_row_size = padded_row_size; 440 } 441 } else { 442 if (!SafeMultiplyUint32(height, row_size, size)) { 443 return false; 444 } 445 if (ret_padded_row_size) { 446 *ret_padded_row_size = row_size; 447 } 448 } 449 if (ret_unpadded_row_size) { 450 *ret_unpadded_row_size = row_size; 451 } 452 453 return true; 454 } 455 456 size_t GLES2Util::RenderbufferBytesPerPixel(int format) { 457 switch (format) { 458 case GL_STENCIL_INDEX8: 459 return 1; 460 case GL_RGBA4: 461 case GL_RGB565: 462 case GL_RGB5_A1: 463 case GL_DEPTH_COMPONENT16: 464 return 2; 465 case GL_RGB: 466 case GL_RGBA: 467 case GL_DEPTH24_STENCIL8_OES: 468 case GL_RGB8_OES: 469 case GL_RGBA8_OES: 470 case GL_DEPTH_COMPONENT24_OES: 471 return 4; 472 default: 473 return 0; 474 } 475 } 476 477 uint32 GLES2Util::GetGLDataTypeSizeForUniforms(int type) { 478 switch (type) { 479 case GL_FLOAT: 480 return sizeof(GLfloat); // NOLINT 481 case GL_FLOAT_VEC2: 482 return sizeof(GLfloat) * 2; // NOLINT 483 case GL_FLOAT_VEC3: 484 return sizeof(GLfloat) * 3; // NOLINT 485 case GL_FLOAT_VEC4: 486 return sizeof(GLfloat) * 4; // NOLINT 487 case GL_INT: 488 return sizeof(GLint); // NOLINT 489 case GL_INT_VEC2: 490 return sizeof(GLint) * 2; // NOLINT 491 case GL_INT_VEC3: 492 return sizeof(GLint) * 3; // NOLINT 493 case GL_INT_VEC4: 494 return sizeof(GLint) * 4; // NOLINT 495 case GL_BOOL: 496 return sizeof(GLint); // NOLINT 497 case GL_BOOL_VEC2: 498 return sizeof(GLint) * 2; // NOLINT 499 case GL_BOOL_VEC3: 500 return sizeof(GLint) * 3; // NOLINT 501 case GL_BOOL_VEC4: 502 return sizeof(GLint) * 4; // NOLINT 503 case GL_FLOAT_MAT2: 504 return sizeof(GLfloat) * 2 * 2; // NOLINT 505 case GL_FLOAT_MAT3: 506 return sizeof(GLfloat) * 3 * 3; // NOLINT 507 case GL_FLOAT_MAT4: 508 return sizeof(GLfloat) * 4 * 4; // NOLINT 509 case GL_SAMPLER_2D: 510 return sizeof(GLint); // NOLINT 511 case GL_SAMPLER_2D_RECT_ARB: 512 return sizeof(GLint); // NOLINT 513 case GL_SAMPLER_CUBE: 514 return sizeof(GLint); // NOLINT 515 case GL_SAMPLER_EXTERNAL_OES: 516 return sizeof(GLint); // NOLINT 517 default: 518 return 0; 519 } 520 } 521 522 size_t GLES2Util::GetGLTypeSizeForTexturesAndBuffers(uint32 type) { 523 switch (type) { 524 case GL_BYTE: 525 return sizeof(GLbyte); // NOLINT 526 case GL_UNSIGNED_BYTE: 527 return sizeof(GLubyte); // NOLINT 528 case GL_SHORT: 529 return sizeof(GLshort); // NOLINT 530 case GL_UNSIGNED_SHORT: 531 return sizeof(GLushort); // NOLINT 532 case GL_INT: 533 return sizeof(GLint); // NOLINT 534 case GL_UNSIGNED_INT: 535 return sizeof(GLuint); // NOLINT 536 case GL_FLOAT: 537 return sizeof(GLfloat); // NOLINT 538 case GL_FIXED: 539 return sizeof(GLfixed); // NOLINT 540 default: 541 return 0; 542 } 543 } 544 545 uint32 GLES2Util::GLErrorToErrorBit(uint32 error) { 546 switch (error) { 547 case GL_INVALID_ENUM: 548 return gl_error_bit::kInvalidEnum; 549 case GL_INVALID_VALUE: 550 return gl_error_bit::kInvalidValue; 551 case GL_INVALID_OPERATION: 552 return gl_error_bit::kInvalidOperation; 553 case GL_OUT_OF_MEMORY: 554 return gl_error_bit::kOutOfMemory; 555 case GL_INVALID_FRAMEBUFFER_OPERATION: 556 return gl_error_bit::kInvalidFrameBufferOperation; 557 default: 558 GPU_NOTREACHED(); 559 return gl_error_bit::kNoError; 560 } 561 } 562 563 uint32 GLES2Util::GLErrorBitToGLError(uint32 error_bit) { 564 switch (error_bit) { 565 case gl_error_bit::kInvalidEnum: 566 return GL_INVALID_ENUM; 567 case gl_error_bit::kInvalidValue: 568 return GL_INVALID_VALUE; 569 case gl_error_bit::kInvalidOperation: 570 return GL_INVALID_OPERATION; 571 case gl_error_bit::kOutOfMemory: 572 return GL_OUT_OF_MEMORY; 573 case gl_error_bit::kInvalidFrameBufferOperation: 574 return GL_INVALID_FRAMEBUFFER_OPERATION; 575 default: 576 GPU_NOTREACHED(); 577 return GL_NO_ERROR; 578 } 579 } 580 581 uint32 GLES2Util::IndexToGLFaceTarget(int index) { 582 static uint32 faces[] = { 583 GL_TEXTURE_CUBE_MAP_POSITIVE_X, 584 GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 585 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 586 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 587 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 588 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 589 }; 590 return faces[index]; 591 } 592 593 uint32 GLES2Util::GetChannelsForFormat(int format) { 594 switch (format) { 595 case GL_ALPHA: 596 case GL_ALPHA16F_EXT: 597 case GL_ALPHA32F_EXT: 598 return kAlpha; 599 case GL_LUMINANCE: 600 return kRGB; 601 case GL_LUMINANCE_ALPHA: 602 return kRGBA; 603 case GL_RGB: 604 case GL_RGB8_OES: 605 case GL_RGB565: 606 case GL_RGB16F_EXT: 607 case GL_RGB32F_EXT: 608 return kRGB; 609 case GL_BGRA_EXT: 610 case GL_BGRA8_EXT: 611 case GL_RGBA16F_EXT: 612 case GL_RGBA32F_EXT: 613 case GL_RGBA: 614 case GL_RGBA8_OES: 615 case GL_RGBA4: 616 case GL_RGB5_A1: 617 return kRGBA; 618 case GL_DEPTH_COMPONENT32_OES: 619 case GL_DEPTH_COMPONENT24_OES: 620 case GL_DEPTH_COMPONENT16: 621 case GL_DEPTH_COMPONENT: 622 return kDepth; 623 case GL_STENCIL_INDEX8: 624 return kStencil; 625 case GL_DEPTH_STENCIL_OES: 626 case GL_DEPTH24_STENCIL8_OES: 627 return kDepth | kStencil; 628 default: 629 return 0x0000; 630 } 631 } 632 633 uint32 GLES2Util::GetChannelsNeededForAttachmentType( 634 int type, uint32 max_color_attachments) { 635 switch (type) { 636 case GL_DEPTH_ATTACHMENT: 637 return kDepth; 638 case GL_STENCIL_ATTACHMENT: 639 return kStencil; 640 default: 641 if (type >= GL_COLOR_ATTACHMENT0 && 642 type < static_cast<int>( 643 GL_COLOR_ATTACHMENT0 + max_color_attachments)) { 644 return kRGBA; 645 } 646 return 0x0000; 647 } 648 } 649 650 std::string GLES2Util::GetStringEnum(uint32 value) { 651 const EnumToString* entry = enum_to_string_table_; 652 const EnumToString* end = entry + enum_to_string_table_len_; 653 for (;entry < end; ++entry) { 654 if (value == entry->value) { 655 return entry->name; 656 } 657 } 658 char buffer[20]; 659 sprintf(buffer, (value < 0x10000) ? "0x%04x" : "0x%08x", value); 660 return buffer; 661 } 662 663 std::string GLES2Util::GetStringError(uint32 value) { 664 static EnumToString string_table[] = { 665 { GL_NONE, "GL_NONE" }, 666 }; 667 return GLES2Util::GetQualifiedEnumString( 668 string_table, arraysize(string_table), value); 669 } 670 671 std::string GLES2Util::GetStringBool(uint32 value) { 672 return value ? "GL_TRUE" : "GL_FALSE"; 673 } 674 675 std::string GLES2Util::GetQualifiedEnumString( 676 const EnumToString* table, size_t count, uint32 value) { 677 for (const EnumToString* end = table + count; table < end; ++table) { 678 if (table->value == value) { 679 return table->name; 680 } 681 } 682 return GetStringEnum(value); 683 } 684 685 bool GLES2Util::ParseUniformName( 686 const std::string& name, 687 size_t* array_pos, 688 int* element_index, 689 bool* getting_array) { 690 bool getting_array_location = false; 691 size_t open_pos = std::string::npos; 692 int index = 0; 693 if (name[name.size() - 1] == ']') { 694 if (name.size() < 3) { 695 return false; 696 } 697 open_pos = name.find_last_of('['); 698 if (open_pos == std::string::npos || 699 open_pos >= name.size() - 2) { 700 return false; 701 } 702 size_t last = name.size() - 1; 703 for (size_t pos = open_pos + 1; pos < last; ++pos) { 704 int8 digit = name[pos] - '0'; 705 if (digit < 0 || digit > 9) { 706 return false; 707 } 708 index = index * 10 + digit; 709 } 710 getting_array_location = true; 711 } 712 *getting_array = getting_array_location; 713 *element_index = index; 714 *array_pos = open_pos; 715 return true; 716 } 717 718 ContextCreationAttribParser::ContextCreationAttribParser() 719 : alpha_size_(-1), 720 blue_size_(-1), 721 green_size_(-1), 722 red_size_(-1), 723 depth_size_(-1), 724 stencil_size_(-1), 725 samples_(-1), 726 sample_buffers_(-1), 727 buffer_preserved_(true), 728 share_resources_(false), 729 bind_generates_resource_(true) { 730 } 731 732 bool ContextCreationAttribParser::Parse(const std::vector<int32>& attribs) { 733 // From <EGL/egl.h>. 734 const int32 EGL_ALPHA_SIZE = 0x3021; 735 const int32 EGL_BLUE_SIZE = 0x3022; 736 const int32 EGL_GREEN_SIZE = 0x3023; 737 const int32 EGL_RED_SIZE = 0x3024; 738 const int32 EGL_DEPTH_SIZE = 0x3025; 739 const int32 EGL_STENCIL_SIZE = 0x3026; 740 const int32 EGL_SAMPLES = 0x3031; 741 const int32 EGL_SAMPLE_BUFFERS = 0x3032; 742 const int32 EGL_NONE = 0x3038; 743 const int32 EGL_SWAP_BEHAVIOR = 0x3093; 744 const int32 EGL_BUFFER_PRESERVED = 0x3094; 745 746 // Chromium only. 747 const int32 SHARE_RESOURCES = 0x10000; 748 const int32 BIND_GENERATES_RESOURCES = 0x10001; 749 750 for (size_t i = 0; i < attribs.size(); i += 2) { 751 const int32 attrib = attribs[i]; 752 if (i + 1 >= attribs.size()) { 753 if (attrib == EGL_NONE) { 754 return true; 755 } 756 757 GPU_DLOG(ERROR) << "Missing value after context creation attribute: " 758 << attrib; 759 return false; 760 } 761 762 const int32 value = attribs[i+1]; 763 switch (attrib) { 764 case EGL_ALPHA_SIZE: 765 alpha_size_ = value; 766 break; 767 case EGL_BLUE_SIZE: 768 blue_size_ = value; 769 break; 770 case EGL_GREEN_SIZE: 771 green_size_ = value; 772 break; 773 case EGL_RED_SIZE: 774 red_size_ = value; 775 break; 776 case EGL_DEPTH_SIZE: 777 depth_size_ = value; 778 break; 779 case EGL_STENCIL_SIZE: 780 stencil_size_ = value; 781 break; 782 case EGL_SAMPLES: 783 samples_ = value; 784 break; 785 case EGL_SAMPLE_BUFFERS: 786 sample_buffers_ = value; 787 break; 788 case EGL_SWAP_BEHAVIOR: 789 buffer_preserved_ = value == EGL_BUFFER_PRESERVED; 790 break; 791 case SHARE_RESOURCES: 792 share_resources_ = value != 0; 793 break; 794 case BIND_GENERATES_RESOURCES: 795 bind_generates_resource_ = value != 0; 796 break; 797 case EGL_NONE: 798 // Terminate list, even if more attributes. 799 return true; 800 default: 801 GPU_DLOG(ERROR) << "Invalid context creation attribute: " << attrib; 802 return false; 803 } 804 } 805 806 return true; 807 } 808 809 #include "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h" 810 811 } // namespace gles2 812 } // namespace gpu 813 814