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 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 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::GetPreferredGLReadPixelsFormat(uint32 internal_format) { 594 switch (internal_format) { 595 case GL_RGB16F_EXT: 596 case GL_RGB32F_EXT: 597 return GL_RGB; 598 case GL_RGBA16F_EXT: 599 case GL_RGBA32F_EXT: 600 return GL_RGBA; 601 default: 602 return GL_RGBA; 603 } 604 } 605 606 uint32 GLES2Util::GetPreferredGLReadPixelsType( 607 uint32 internal_format, uint32 texture_type) { 608 switch (internal_format) { 609 case GL_RGBA32F_EXT: 610 case GL_RGB32F_EXT: 611 return GL_FLOAT; 612 case GL_RGBA16F_EXT: 613 case GL_RGB16F_EXT: 614 return GL_HALF_FLOAT_OES; 615 case GL_RGBA: 616 case GL_RGB: 617 // Unsized internal format, check the type 618 switch (texture_type) { 619 case GL_FLOAT: 620 case GL_HALF_FLOAT_OES: 621 return GL_FLOAT; 622 default: 623 return GL_UNSIGNED_BYTE; 624 } 625 default: 626 return GL_UNSIGNED_BYTE; 627 } 628 } 629 630 uint32 GLES2Util::GetChannelsForFormat(int format) { 631 switch (format) { 632 case GL_ALPHA: 633 case GL_ALPHA16F_EXT: 634 case GL_ALPHA32F_EXT: 635 return kAlpha; 636 case GL_LUMINANCE: 637 return kRGB; 638 case GL_LUMINANCE_ALPHA: 639 return kRGBA; 640 case GL_RGB: 641 case GL_RGB8_OES: 642 case GL_RGB565: 643 case GL_RGB16F_EXT: 644 case GL_RGB32F_EXT: 645 return kRGB; 646 case GL_BGRA_EXT: 647 case GL_BGRA8_EXT: 648 case GL_RGBA16F_EXT: 649 case GL_RGBA32F_EXT: 650 case GL_RGBA: 651 case GL_RGBA8_OES: 652 case GL_RGBA4: 653 case GL_RGB5_A1: 654 return kRGBA; 655 case GL_DEPTH_COMPONENT32_OES: 656 case GL_DEPTH_COMPONENT24_OES: 657 case GL_DEPTH_COMPONENT16: 658 case GL_DEPTH_COMPONENT: 659 return kDepth; 660 case GL_STENCIL_INDEX8: 661 return kStencil; 662 case GL_DEPTH_STENCIL_OES: 663 case GL_DEPTH24_STENCIL8_OES: 664 return kDepth | kStencil; 665 default: 666 return 0x0000; 667 } 668 } 669 670 uint32 GLES2Util::GetChannelsNeededForAttachmentType( 671 int type, uint32 max_color_attachments) { 672 switch (type) { 673 case GL_DEPTH_ATTACHMENT: 674 return kDepth; 675 case GL_STENCIL_ATTACHMENT: 676 return kStencil; 677 default: 678 if (type >= GL_COLOR_ATTACHMENT0 && 679 type < static_cast<int>( 680 GL_COLOR_ATTACHMENT0 + max_color_attachments)) { 681 return kRGBA; 682 } 683 return 0x0000; 684 } 685 } 686 687 std::string GLES2Util::GetStringEnum(uint32 value) { 688 const EnumToString* entry = enum_to_string_table_; 689 const EnumToString* end = entry + enum_to_string_table_len_; 690 for (;entry < end; ++entry) { 691 if (value == entry->value) { 692 return entry->name; 693 } 694 } 695 char buffer[20]; 696 sprintf(buffer, (value < 0x10000) ? "0x%04x" : "0x%08x", value); 697 return buffer; 698 } 699 700 std::string GLES2Util::GetStringError(uint32 value) { 701 static EnumToString string_table[] = { 702 { GL_NONE, "GL_NONE" }, 703 }; 704 return GLES2Util::GetQualifiedEnumString( 705 string_table, arraysize(string_table), value); 706 } 707 708 std::string GLES2Util::GetStringBool(uint32 value) { 709 return value ? "GL_TRUE" : "GL_FALSE"; 710 } 711 712 std::string GLES2Util::GetQualifiedEnumString( 713 const EnumToString* table, size_t count, uint32 value) { 714 for (const EnumToString* end = table + count; table < end; ++table) { 715 if (table->value == value) { 716 return table->name; 717 } 718 } 719 return GetStringEnum(value); 720 } 721 722 bool GLES2Util::ParseUniformName( 723 const std::string& name, 724 size_t* array_pos, 725 int* element_index, 726 bool* getting_array) { 727 bool getting_array_location = false; 728 size_t open_pos = std::string::npos; 729 int index = 0; 730 if (name[name.size() - 1] == ']') { 731 if (name.size() < 3) { 732 return false; 733 } 734 open_pos = name.find_last_of('['); 735 if (open_pos == std::string::npos || 736 open_pos >= name.size() - 2) { 737 return false; 738 } 739 size_t last = name.size() - 1; 740 for (size_t pos = open_pos + 1; pos < last; ++pos) { 741 int8 digit = name[pos] - '0'; 742 if (digit < 0 || digit > 9) { 743 return false; 744 } 745 index = index * 10 + digit; 746 } 747 getting_array_location = true; 748 } 749 *getting_array = getting_array_location; 750 *element_index = index; 751 *array_pos = open_pos; 752 return true; 753 } 754 755 namespace { 756 757 // From <EGL/egl.h>. 758 const int32 kAlphaSize = 0x3021; // EGL_ALPHA_SIZE 759 const int32 kBlueSize = 0x3022; // EGL_BLUE_SIZE 760 const int32 kGreenSize = 0x3023; // EGL_GREEN_SIZE 761 const int32 kRedSize = 0x3024; // EGL_RED_SIZE 762 const int32 kDepthSize = 0x3025; // EGL_DEPTH_SIZE 763 const int32 kStencilSize = 0x3026; // EGL_STENCIL_SIZE 764 const int32 kSamples = 0x3031; // EGL_SAMPLES 765 const int32 kSampleBuffers = 0x3032; // EGL_SAMPLE_BUFFERS 766 const int32 kNone = 0x3038; // EGL_NONE 767 const int32 kSwapBehavior = 0x3093; // EGL_SWAP_BEHAVIOR 768 const int32 kBufferPreserved = 0x3094; // EGL_BUFFER_PRESERVED 769 const int32 kBufferDestroyed = 0x3095; // EGL_BUFFER_DESTROYED 770 771 // Chromium only. 772 const int32 kShareResources = 0x10000; 773 const int32 kBindGeneratesResource = 0x10001; 774 const int32 kFailIfMajorPerfCaveat = 0x10002; 775 776 } // namespace 777 778 ContextCreationAttribHelper::ContextCreationAttribHelper() 779 : alpha_size_(-1), 780 blue_size_(-1), 781 green_size_(-1), 782 red_size_(-1), 783 depth_size_(-1), 784 stencil_size_(-1), 785 samples_(-1), 786 sample_buffers_(-1), 787 buffer_preserved_(true), 788 share_resources_(false), 789 bind_generates_resource_(true), 790 fail_if_major_perf_caveat_(false) { 791 } 792 793 void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) { 794 if (alpha_size_ != -1) { 795 attribs->push_back(kAlphaSize); 796 attribs->push_back(alpha_size_); 797 } 798 if (blue_size_ != -1) { 799 attribs->push_back(kBlueSize); 800 attribs->push_back(blue_size_); 801 } 802 if (green_size_ != -1) { 803 attribs->push_back(kGreenSize); 804 attribs->push_back(green_size_); 805 } 806 if (red_size_ != -1) { 807 attribs->push_back(kRedSize); 808 attribs->push_back(red_size_); 809 } 810 if (depth_size_ != -1) { 811 attribs->push_back(kDepthSize); 812 attribs->push_back(depth_size_); 813 } 814 if (stencil_size_ != -1) { 815 attribs->push_back(kStencilSize); 816 attribs->push_back(stencil_size_); 817 } 818 if (samples_ != -1) { 819 attribs->push_back(kSamples); 820 attribs->push_back(samples_); 821 } 822 if (sample_buffers_ != -1) { 823 attribs->push_back(kSampleBuffers); 824 attribs->push_back(sample_buffers_); 825 } 826 attribs->push_back(kSwapBehavior); 827 attribs->push_back(buffer_preserved_ ? kBufferPreserved : kBufferDestroyed); 828 attribs->push_back(kShareResources); 829 attribs->push_back(share_resources_ ? 1 : 0); 830 attribs->push_back(kBindGeneratesResource); 831 attribs->push_back(bind_generates_resource_ ? 1 : 0); 832 attribs->push_back(kFailIfMajorPerfCaveat); 833 attribs->push_back(fail_if_major_perf_caveat_ ? 1 : 0); 834 attribs->push_back(kNone); 835 } 836 837 bool ContextCreationAttribHelper::Parse(const std::vector<int32>& attribs) { 838 for (size_t i = 0; i < attribs.size(); i += 2) { 839 const int32 attrib = attribs[i]; 840 if (i + 1 >= attribs.size()) { 841 if (attrib == kNone) { 842 return true; 843 } 844 845 DLOG(ERROR) << "Missing value after context creation attribute: " 846 << attrib; 847 return false; 848 } 849 850 const int32 value = attribs[i+1]; 851 switch (attrib) { 852 case kAlphaSize: 853 alpha_size_ = value; 854 break; 855 case kBlueSize: 856 blue_size_ = value; 857 break; 858 case kGreenSize: 859 green_size_ = value; 860 break; 861 case kRedSize: 862 red_size_ = value; 863 break; 864 case kDepthSize: 865 depth_size_ = value; 866 break; 867 case kStencilSize: 868 stencil_size_ = value; 869 break; 870 case kSamples: 871 samples_ = value; 872 break; 873 case kSampleBuffers: 874 sample_buffers_ = value; 875 break; 876 case kSwapBehavior: 877 buffer_preserved_ = value == kBufferPreserved; 878 break; 879 case kShareResources: 880 share_resources_ = value != 0; 881 break; 882 case kBindGeneratesResource: 883 bind_generates_resource_ = value != 0; 884 break; 885 case kFailIfMajorPerfCaveat: 886 fail_if_major_perf_caveat_ = value != 0; 887 break; 888 case kNone: 889 // Terminate list, even if more attributes. 890 return true; 891 default: 892 DLOG(ERROR) << "Invalid context creation attribute: " << attrib; 893 return false; 894 } 895 } 896 897 return true; 898 } 899 900 #include "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h" 901 902 } // namespace gles2 903 } // namespace gpu 904 905