| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // A class to emulate GLES2 over command buffers. | 5 // A class to emulate GLES2 over command buffers. |
| 6 | 6 |
| 7 #include "../client/gles2_implementation.h" | 7 #include "../client/gles2_implementation.h" |
| 8 | 8 |
| 9 #include <set> |
| 10 #include <queue> |
| 9 #include <GLES2/gl2ext.h> | 11 #include <GLES2/gl2ext.h> |
| 10 #include "../client/mapped_memory.h" | 12 #include "../client/mapped_memory.h" |
| 11 #include "../client/program_info_manager.h" | 13 #include "../client/program_info_manager.h" |
| 12 #include "../common/gles2_cmd_utils.h" | 14 #include "../common/gles2_cmd_utils.h" |
| 13 #include "../common/id_allocator.h" | 15 #include "../common/id_allocator.h" |
| 14 #include "../common/trace_event.h" | 16 #include "../common/trace_event.h" |
| 15 | 17 |
| 16 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 18 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 17 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 19 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
| 18 #endif | 20 #endif |
| (...skipping 25 matching lines...) Expand all Loading... |
| 44 } | 46 } |
| 45 } else { | 47 } else { |
| 46 for (GLsizei ii = 0; ii < n; ++ii) { | 48 for (GLsizei ii = 0; ii < n; ++ii) { |
| 47 ids[ii] = id_allocator_.AllocateIDAtOrAbove(id_offset); | 49 ids[ii] = id_allocator_.AllocateIDAtOrAbove(id_offset); |
| 48 id_offset = ids[ii] + 1; | 50 id_offset = ids[ii] + 1; |
| 49 } | 51 } |
| 50 } | 52 } |
| 51 } | 53 } |
| 52 | 54 |
| 53 // Overridden from IdHandlerInterface. | 55 // Overridden from IdHandlerInterface. |
| 54 virtual void FreeIds(GLsizei n, const GLuint* ids) { | 56 virtual bool FreeIds(GLsizei n, const GLuint* ids) { |
| 55 for (GLsizei ii = 0; ii < n; ++ii) { | 57 for (GLsizei ii = 0; ii < n; ++ii) { |
| 56 id_allocator_.FreeID(ids[ii]); | 58 id_allocator_.FreeID(ids[ii]); |
| 57 } | 59 } |
| 60 return true; |
| 58 } | 61 } |
| 59 | 62 |
| 60 // Overridden from IdHandlerInterface. | 63 // Overridden from IdHandlerInterface. |
| 61 virtual bool MarkAsUsedForBind(GLuint id) { | 64 virtual bool MarkAsUsedForBind(GLuint id) { |
| 62 return id == 0 ? true : id_allocator_.MarkAsUsed(id); | 65 return id == 0 ? true : id_allocator_.MarkAsUsed(id); |
| 63 } | 66 } |
| 64 private: | 67 private: |
| 65 IdAllocator id_allocator_; | 68 IdAllocator id_allocator_; |
| 66 }; | 69 }; |
| 67 | 70 |
| 68 // An id handler for non-shared ids that are never reused. | 71 // An id handler for non-shared ids that are never reused. |
| 69 class NonSharedNonReusedIdHandler : public IdHandlerInterface { | 72 class NonSharedNonReusedIdHandler : public IdHandlerInterface { |
| 70 public: | 73 public: |
| 71 NonSharedNonReusedIdHandler() : last_id_(0) { } | 74 NonSharedNonReusedIdHandler() : last_id_(0) { } |
| 72 virtual ~NonSharedNonReusedIdHandler() { } | 75 virtual ~NonSharedNonReusedIdHandler() { } |
| 73 | 76 |
| 74 // Overridden from IdHandlerInterface. | 77 // Overridden from IdHandlerInterface. |
| 75 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | 78 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { |
| 76 for (GLsizei ii = 0; ii < n; ++ii) { | 79 for (GLsizei ii = 0; ii < n; ++ii) { |
| 77 ids[ii] = ++last_id_ + id_offset; | 80 ids[ii] = ++last_id_ + id_offset; |
| 78 } | 81 } |
| 79 } | 82 } |
| 80 | 83 |
| 81 // Overridden from IdHandlerInterface. | 84 // Overridden from IdHandlerInterface. |
| 82 virtual void FreeIds(GLsizei /* n */, const GLuint* /* ids */) { | 85 virtual bool FreeIds(GLsizei /* n */, const GLuint* /* ids */) { |
| 83 // Ids are never freed. | 86 // Ids are never freed. |
| 87 return true; |
| 84 } | 88 } |
| 85 | 89 |
| 86 // Overridden from IdHandlerInterface. | 90 // Overridden from IdHandlerInterface. |
| 87 virtual bool MarkAsUsedForBind(GLuint /* id */) { | 91 virtual bool MarkAsUsedForBind(GLuint /* id */) { |
| 88 // This is only used for Shaders and Programs which have no bind. | 92 // This is only used for Shaders and Programs which have no bind. |
| 89 return false; | 93 return false; |
| 90 } | 94 } |
| 91 | 95 |
| 92 private: | 96 private: |
| 93 GLuint last_id_; | 97 GLuint last_id_; |
| 94 }; | 98 }; |
| 95 | 99 |
| 96 // An id handler for shared ids. | 100 // An id handler for shared ids. |
| 97 class SharedIdHandler : public IdHandlerInterface { | 101 class SharedIdHandler : public IdHandlerInterface { |
| 98 public: | 102 public: |
| 99 SharedIdHandler( | 103 SharedIdHandler( |
| 100 GLES2Implementation* gles2, | 104 GLES2Implementation* gles2, |
| 101 id_namespaces::IdNamespaces id_namespace) | 105 id_namespaces::IdNamespaces id_namespace) |
| 102 : gles2_(gles2), | 106 : gles2_(gles2), |
| 103 id_namespace_(id_namespace) { | 107 id_namespace_(id_namespace) { |
| 104 } | 108 } |
| 105 | 109 |
| 106 virtual ~SharedIdHandler() { } | 110 virtual ~SharedIdHandler() { } |
| 107 | 111 |
| 108 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | 112 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { |
| 109 gles2_->GenSharedIdsCHROMIUM(id_namespace_, id_offset, n, ids); | 113 gles2_->GenSharedIdsCHROMIUM(id_namespace_, id_offset, n, ids); |
| 110 } | 114 } |
| 111 | 115 |
| 112 virtual void FreeIds(GLsizei n, const GLuint* ids) { | 116 virtual bool FreeIds(GLsizei n, const GLuint* ids) { |
| 113 gles2_->DeleteSharedIdsCHROMIUM(id_namespace_, n, ids); | 117 gles2_->DeleteSharedIdsCHROMIUM(id_namespace_, n, ids); |
| 118 return true; |
| 114 } | 119 } |
| 115 | 120 |
| 116 virtual bool MarkAsUsedForBind(GLuint) { // NOLINT | 121 virtual bool MarkAsUsedForBind(GLuint /* id */) { |
| 117 // This has no meaning for shared resources. | 122 // This has no meaning for shared resources. |
| 118 return true; | 123 return true; |
| 119 } | 124 } |
| 120 | 125 |
| 121 private: | 126 private: |
| 122 GLES2Implementation* gles2_; | 127 GLES2Implementation* gles2_; |
| 123 id_namespaces::IdNamespaces id_namespace_; | 128 id_namespaces::IdNamespaces id_namespace_; |
| 124 }; | 129 }; |
| 125 | 130 |
| 131 // An id handler for shared ids that requires ids are made before using and |
| 132 // that only the context that created the id can delete it. |
| 133 // Assumes the service will enforce that non made ids generate an error. |
| 134 class StrictSharedIdHandler : public IdHandlerInterface { |
| 135 public: |
| 136 StrictSharedIdHandler( |
| 137 GLES2Implementation* gles2, |
| 138 id_namespaces::IdNamespaces id_namespace) |
| 139 : gles2_(gles2), |
| 140 id_namespace_(id_namespace) { |
| 141 } |
| 142 |
| 143 virtual ~StrictSharedIdHandler() { } |
| 144 |
| 145 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { |
| 146 for (GLsizei ii = 0; ii < n; ++ii) { |
| 147 ids[ii] = GetId(id_offset); |
| 148 } |
| 149 } |
| 150 |
| 151 virtual bool FreeIds(GLsizei n, const GLuint* ids) { |
| 152 // OpenGL sematics. If any id is bad none of them get freed. |
| 153 for (GLsizei ii = 0; ii < n; ++ii) { |
| 154 GLuint id = ids[ii]; |
| 155 if (id != 0) { |
| 156 ResourceIdSet::iterator it = used_ids_.find(id); |
| 157 if (it == used_ids_.end()) { |
| 158 return false; |
| 159 } |
| 160 } |
| 161 } |
| 162 for (GLsizei ii = 0; ii < n; ++ii) { |
| 163 GLuint id = ids[ii]; |
| 164 if (id != 0) { |
| 165 ResourceIdSet::iterator it = used_ids_.find(id); |
| 166 if (it != used_ids_.end()) { |
| 167 used_ids_.erase(it); |
| 168 free_ids_.push(id); |
| 169 } |
| 170 } |
| 171 } |
| 172 return true; |
| 173 } |
| 174 |
| 175 virtual bool MarkAsUsedForBind(GLuint /* id */) { |
| 176 // This has no meaning for shared resources. |
| 177 return true; |
| 178 } |
| 179 |
| 180 private: |
| 181 static const GLsizei kNumIdsToGet = 2048; |
| 182 typedef std::queue<GLuint> ResourceIdQueue; |
| 183 typedef std::set<GLuint> ResourceIdSet; |
| 184 |
| 185 GLuint GetId(GLuint id_offset) { |
| 186 if (free_ids_.empty()) { |
| 187 GLuint ids[kNumIdsToGet]; |
| 188 gles2_->GenSharedIdsCHROMIUM(id_namespace_, id_offset, kNumIdsToGet, ids); |
| 189 for (GLsizei ii = 0; ii < kNumIdsToGet; ++ii) { |
| 190 free_ids_.push(ids[ii]); |
| 191 } |
| 192 } |
| 193 GLuint id = free_ids_.front(); |
| 194 free_ids_.pop(); |
| 195 used_ids_.insert(id); |
| 196 return id; |
| 197 } |
| 198 |
| 199 bool FreeId(GLuint id) { |
| 200 ResourceIdSet::iterator it = used_ids_.find(id); |
| 201 if (it == used_ids_.end()) { |
| 202 return false; |
| 203 } |
| 204 used_ids_.erase(it); |
| 205 free_ids_.push(id); |
| 206 return true; |
| 207 } |
| 208 |
| 209 GLES2Implementation* gles2_; |
| 210 id_namespaces::IdNamespaces id_namespace_; |
| 211 ResourceIdSet used_ids_; |
| 212 ResourceIdQueue free_ids_; |
| 213 }; |
| 214 |
| 215 #ifndef _MSC_VER |
| 216 const GLsizei StrictSharedIdHandler::kNumIdsToGet; |
| 217 #endif |
| 218 |
| 126 static GLsizei RoundUpToMultipleOf4(GLsizei size) { | 219 static GLsizei RoundUpToMultipleOf4(GLsizei size) { |
| 127 return (size + 3) & ~3; | 220 return (size + 3) & ~3; |
| 128 } | 221 } |
| 129 | 222 |
| 130 // This class tracks VertexAttribPointers and helps emulate client side buffers. | 223 // This class tracks VertexAttribPointers and helps emulate client side buffers. |
| 131 // | 224 // |
| 132 // The way client side buffers work is we shadow all the Vertex Attribs so we | 225 // The way client side buffers work is we shadow all the Vertex Attribs so we |
| 133 // know which ones are pointing to client side buffers. | 226 // know which ones are pointing to client side buffers. |
| 134 // | 227 // |
| 135 // At Draw time, for any attribs pointing to client side buffers we copy them | 228 // At Draw time, for any attribs pointing to client side buffers we copy them |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 #endif | 521 #endif |
| 429 | 522 |
| 430 COMPILE_ASSERT(gpu::kInvalidResource == 0, | 523 COMPILE_ASSERT(gpu::kInvalidResource == 0, |
| 431 INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS); | 524 INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS); |
| 432 | 525 |
| 433 GLES2Implementation::GLES2Implementation( | 526 GLES2Implementation::GLES2Implementation( |
| 434 GLES2CmdHelper* helper, | 527 GLES2CmdHelper* helper, |
| 435 size_t transfer_buffer_size, | 528 size_t transfer_buffer_size, |
| 436 void* transfer_buffer, | 529 void* transfer_buffer, |
| 437 int32 transfer_buffer_id, | 530 int32 transfer_buffer_id, |
| 438 bool share_resources) | 531 bool share_resources, |
| 532 bool bind_generates_resource) |
| 439 : helper_(helper), | 533 : helper_(helper), |
| 440 transfer_buffer_( | 534 transfer_buffer_( |
| 441 kStartingOffset, | 535 kStartingOffset, |
| 442 transfer_buffer_size - kStartingOffset, | 536 transfer_buffer_size - kStartingOffset, |
| 443 helper, | 537 helper, |
| 444 static_cast<char*>(transfer_buffer) + kStartingOffset), | 538 static_cast<char*>(transfer_buffer) + kStartingOffset), |
| 445 transfer_buffer_id_(transfer_buffer_id), | 539 transfer_buffer_id_(transfer_buffer_id), |
| 446 pack_alignment_(4), | 540 pack_alignment_(4), |
| 447 unpack_alignment_(4), | 541 unpack_alignment_(4), |
| 448 unpack_flip_y_(false), | 542 unpack_flip_y_(false), |
| 449 active_texture_unit_(0), | 543 active_texture_unit_(0), |
| 450 bound_framebuffer_(0), | 544 bound_framebuffer_(0), |
| 451 bound_renderbuffer_(0), | 545 bound_renderbuffer_(0), |
| 452 bound_array_buffer_id_(0), | 546 bound_array_buffer_id_(0), |
| 453 bound_element_array_buffer_id_(0), | 547 bound_element_array_buffer_id_(0), |
| 454 client_side_array_id_(0), | 548 client_side_array_id_(0), |
| 455 client_side_element_array_id_(0), | 549 client_side_element_array_id_(0), |
| 456 error_bits_(0), | 550 error_bits_(0), |
| 457 debug_(false), | 551 debug_(false), |
| 458 sharing_resources_(share_resources) { | 552 sharing_resources_(share_resources), |
| 553 bind_generates_resource_(bind_generates_resource) { |
| 459 GPU_CLIENT_LOG_CODE_BLOCK({ | 554 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 460 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( | 555 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( |
| 461 switches::kEnableGPUClientLogging); | 556 switches::kEnableGPUClientLogging); |
| 462 }); | 557 }); |
| 463 | 558 |
| 464 // Allocate space for simple GL results. | 559 // Allocate space for simple GL results. |
| 465 result_buffer_ = transfer_buffer; | 560 result_buffer_ = transfer_buffer; |
| 466 result_shm_offset_ = 0; | 561 result_shm_offset_ = 0; |
| 467 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); | 562 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); |
| 468 | 563 |
| 469 mapped_memory_.reset(new MappedMemoryManager(helper_)); | 564 mapped_memory_.reset(new MappedMemoryManager(helper_)); |
| 470 | 565 |
| 471 if (share_resources) { | 566 if (share_resources) { |
| 472 buffer_id_handler_.reset( | 567 if (!bind_generates_resource) { |
| 473 new SharedIdHandler(this, id_namespaces::kBuffers)); | 568 buffer_id_handler_.reset( |
| 474 framebuffer_id_handler_.reset( | 569 new StrictSharedIdHandler(this, id_namespaces::kBuffers)); |
| 475 new SharedIdHandler(this, id_namespaces::kFramebuffers)); | 570 framebuffer_id_handler_.reset( |
| 476 renderbuffer_id_handler_.reset( | 571 new StrictSharedIdHandler(this, id_namespaces::kFramebuffers)); |
| 477 new SharedIdHandler(this, id_namespaces::kRenderbuffers)); | 572 renderbuffer_id_handler_.reset( |
| 478 program_and_shader_id_handler_.reset( | 573 new StrictSharedIdHandler(this, id_namespaces::kRenderbuffers)); |
| 479 new SharedIdHandler(this, id_namespaces::kProgramsAndShaders)); | 574 program_and_shader_id_handler_.reset( |
| 480 texture_id_handler_.reset( | 575 new StrictSharedIdHandler(this, id_namespaces::kProgramsAndShaders)); |
| 481 new SharedIdHandler(this, id_namespaces::kTextures)); | 576 texture_id_handler_.reset( |
| 577 new StrictSharedIdHandler(this, id_namespaces::kTextures)); |
| 578 } else { |
| 579 buffer_id_handler_.reset( |
| 580 new SharedIdHandler(this, id_namespaces::kBuffers)); |
| 581 framebuffer_id_handler_.reset( |
| 582 new SharedIdHandler(this, id_namespaces::kFramebuffers)); |
| 583 renderbuffer_id_handler_.reset( |
| 584 new SharedIdHandler(this, id_namespaces::kRenderbuffers)); |
| 585 program_and_shader_id_handler_.reset( |
| 586 new SharedIdHandler(this, id_namespaces::kProgramsAndShaders)); |
| 587 texture_id_handler_.reset( |
| 588 new SharedIdHandler(this, id_namespaces::kTextures)); |
| 589 } |
| 482 } else { | 590 } else { |
| 483 buffer_id_handler_.reset(new NonSharedIdHandler()); | 591 buffer_id_handler_.reset(new NonSharedIdHandler()); |
| 484 framebuffer_id_handler_.reset(new NonSharedIdHandler()); | 592 framebuffer_id_handler_.reset(new NonSharedIdHandler()); |
| 485 renderbuffer_id_handler_.reset(new NonSharedIdHandler()); | 593 renderbuffer_id_handler_.reset(new NonSharedIdHandler()); |
| 486 program_and_shader_id_handler_.reset(new NonSharedNonReusedIdHandler()); | 594 program_and_shader_id_handler_.reset(new NonSharedNonReusedIdHandler()); |
| 487 texture_id_handler_.reset(new NonSharedIdHandler()); | 595 texture_id_handler_.reset(new NonSharedIdHandler()); |
| 488 } | 596 } |
| 489 | 597 |
| 490 static const GLenum pnames[] = { | 598 static const GLenum pnames[] = { |
| 491 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, | 599 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 507 util_.set_num_shader_binary_formats( | 615 util_.set_num_shader_binary_formats( |
| 508 gl_state_.num_shader_binary_formats); | 616 gl_state_.num_shader_binary_formats); |
| 509 | 617 |
| 510 GetMultipleIntegervCHROMIUM( | 618 GetMultipleIntegervCHROMIUM( |
| 511 pnames, arraysize(pnames), &gl_state_.max_combined_texture_image_units, | 619 pnames, arraysize(pnames), &gl_state_.max_combined_texture_image_units, |
| 512 sizeof(gl_state_)); | 620 sizeof(gl_state_)); |
| 513 | 621 |
| 514 texture_units_.reset( | 622 texture_units_.reset( |
| 515 new TextureUnit[gl_state_.max_combined_texture_image_units]); | 623 new TextureUnit[gl_state_.max_combined_texture_image_units]); |
| 516 | 624 |
| 517 | |
| 518 program_info_manager_.reset(ProgramInfoManager::Create(sharing_resources_)); | 625 program_info_manager_.reset(ProgramInfoManager::Create(sharing_resources_)); |
| 519 | 626 |
| 520 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 627 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 521 buffer_id_handler_->MakeIds( | 628 buffer_id_handler_->MakeIds( |
| 522 kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); | 629 kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); |
| 523 | 630 |
| 524 client_side_buffer_helper_.reset(new ClientSideBufferHelper( | 631 client_side_buffer_helper_.reset(new ClientSideBufferHelper( |
| 525 gl_state_.max_vertex_attribs, | 632 gl_state_.max_vertex_attribs, |
| 526 reserved_ids_[0], | 633 reserved_ids_[0], |
| 527 reserved_ids_[1])); | 634 reserved_ids_[1])); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 case GL_MAX_VERTEX_UNIFORM_VECTORS: | 805 case GL_MAX_VERTEX_UNIFORM_VECTORS: |
| 699 *params = gl_state_.max_vertex_uniform_vectors; | 806 *params = gl_state_.max_vertex_uniform_vectors; |
| 700 return true; | 807 return true; |
| 701 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: | 808 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: |
| 702 *params = gl_state_.num_compressed_texture_formats; | 809 *params = gl_state_.num_compressed_texture_formats; |
| 703 return true; | 810 return true; |
| 704 case GL_NUM_SHADER_BINARY_FORMATS: | 811 case GL_NUM_SHADER_BINARY_FORMATS: |
| 705 *params = gl_state_.num_shader_binary_formats; | 812 *params = gl_state_.num_shader_binary_formats; |
| 706 return true; | 813 return true; |
| 707 case GL_ARRAY_BUFFER_BINDING: | 814 case GL_ARRAY_BUFFER_BINDING: |
| 708 *params = bound_array_buffer_id_; | 815 if (bind_generates_resource_) { |
| 709 return true; | 816 *params = bound_array_buffer_id_; |
| 817 return true; |
| 818 } |
| 819 return false; |
| 710 case GL_ELEMENT_ARRAY_BUFFER_BINDING: | 820 case GL_ELEMENT_ARRAY_BUFFER_BINDING: |
| 711 *params = bound_element_array_buffer_id_; | 821 if (bind_generates_resource_) { |
| 712 return true; | 822 *params = bound_element_array_buffer_id_; |
| 823 return true; |
| 824 } |
| 825 return false; |
| 713 case GL_ACTIVE_TEXTURE: | 826 case GL_ACTIVE_TEXTURE: |
| 714 *params = active_texture_unit_ + GL_TEXTURE0; | 827 *params = active_texture_unit_ + GL_TEXTURE0; |
| 715 return true; | 828 return true; |
| 716 case GL_TEXTURE_BINDING_2D: | 829 case GL_TEXTURE_BINDING_2D: |
| 717 *params = texture_units_[active_texture_unit_].bound_texture_2d; | 830 if (bind_generates_resource_) { |
| 718 return true; | 831 *params = texture_units_[active_texture_unit_].bound_texture_2d; |
| 832 return true; |
| 833 } |
| 834 return false; |
| 719 case GL_TEXTURE_BINDING_CUBE_MAP: | 835 case GL_TEXTURE_BINDING_CUBE_MAP: |
| 720 *params = texture_units_[active_texture_unit_].bound_texture_cube_map; | 836 if (bind_generates_resource_) { |
| 721 return true; | 837 *params = texture_units_[active_texture_unit_].bound_texture_cube_map; |
| 838 return true; |
| 839 } |
| 840 return false; |
| 722 case GL_FRAMEBUFFER_BINDING: | 841 case GL_FRAMEBUFFER_BINDING: |
| 723 *params = bound_framebuffer_; | 842 if (bind_generates_resource_) { |
| 724 return true; | 843 *params = bound_framebuffer_; |
| 844 return true; |
| 845 } |
| 846 return false; |
| 725 case GL_RENDERBUFFER_BINDING: | 847 case GL_RENDERBUFFER_BINDING: |
| 726 *params = bound_renderbuffer_; | 848 if (bind_generates_resource_) { |
| 727 return true; | 849 *params = bound_renderbuffer_; |
| 850 return true; |
| 851 } |
| 852 return false; |
| 728 default: | 853 default: |
| 729 return false; | 854 return false; |
| 730 } | 855 } |
| 731 } | 856 } |
| 732 | 857 |
| 733 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) { | 858 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) { |
| 734 // TODO(gman): Make this handle pnames that return more than 1 value. | 859 // TODO(gman): Make this handle pnames that return more than 1 value. |
| 735 GLint value; | 860 GLint value; |
| 736 if (!GetHelper(pname, &value)) { | 861 if (!GetHelper(pname, &value)) { |
| 737 return false; | 862 return false; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { | 975 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { |
| 851 GPU_CLIENT_LOG("[" << this << "] glGenSharedIdsCHROMIUMTextures(" | 976 GPU_CLIENT_LOG("[" << this << "] glGenSharedIdsCHROMIUMTextures(" |
| 852 << namespace_id << ", " << id_offset << ", " << n << ", " << | 977 << namespace_id << ", " << id_offset << ", " << n << ", " << |
| 853 static_cast<void*>(ids) << ")"); | 978 static_cast<void*>(ids) << ")"); |
| 854 GPU_CLIENT_LOG_CODE_BLOCK({ | 979 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 855 for (GLsizei i = 0; i < n; ++i) { | 980 for (GLsizei i = 0; i < n; ++i) { |
| 856 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); | 981 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); |
| 857 } | 982 } |
| 858 }); | 983 }); |
| 859 TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM"); | 984 TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM"); |
| 860 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 985 GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); |
| 861 helper_->GenSharedIdsCHROMIUM(namespace_id, id_offset, n, | 986 GLsizei max_num_per = max_size / sizeof(ids[0]); |
| 862 transfer_buffer_id_, | 987 while (n) { |
| 863 transfer_buffer_.GetOffset(id_buffer)); | 988 GLsizei num = std::min(n, max_num_per); |
| 864 WaitForCmd(); | 989 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(num); |
| 865 memcpy(ids, id_buffer, sizeof(*ids) * n); | 990 helper_->GenSharedIdsCHROMIUM( |
| 866 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 991 namespace_id, id_offset, num, |
| 992 transfer_buffer_id_, |
| 993 transfer_buffer_.GetOffset(id_buffer)); |
| 994 WaitForCmd(); |
| 995 memcpy(ids, id_buffer, sizeof(*ids) * num); |
| 996 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 997 n -= num; |
| 998 ids += num; |
| 999 } |
| 867 } | 1000 } |
| 868 | 1001 |
| 869 void GLES2Implementation::DeleteSharedIdsCHROMIUM( | 1002 void GLES2Implementation::DeleteSharedIdsCHROMIUM( |
| 870 GLuint namespace_id, GLsizei n, const GLuint* ids) { | 1003 GLuint namespace_id, GLsizei n, const GLuint* ids) { |
| 871 GPU_CLIENT_LOG("[" << this << "] glDeleteSharedIdsCHROMIUM(" | 1004 GPU_CLIENT_LOG("[" << this << "] glDeleteSharedIdsCHROMIUM(" |
| 872 << namespace_id << ", " << n << ", " | 1005 << namespace_id << ", " << n << ", " |
| 873 << static_cast<const void*>(ids) << ")"); | 1006 << static_cast<const void*>(ids) << ")"); |
| 874 GPU_CLIENT_LOG_CODE_BLOCK({ | 1007 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 875 for (GLsizei i = 0; i < n; ++i) { | 1008 for (GLsizei i = 0; i < n; ++i) { |
| 876 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); | 1009 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); |
| 877 } | 1010 } |
| 878 }); | 1011 }); |
| 879 TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM"); | 1012 TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM"); |
| 880 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 1013 GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); |
| 881 memcpy(id_buffer, ids, sizeof(*ids) * n); | 1014 GLsizei max_num_per = max_size / sizeof(ids[0]); |
| 882 helper_->DeleteSharedIdsCHROMIUM(namespace_id, n, | 1015 while (n) { |
| 883 transfer_buffer_id_, | 1016 GLsizei num = std::min(n, max_num_per); |
| 884 transfer_buffer_.GetOffset(id_buffer)); | 1017 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(num); |
| 885 WaitForCmd(); | 1018 memcpy(id_buffer, ids, sizeof(*ids) * num); |
| 886 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 1019 helper_->DeleteSharedIdsCHROMIUM( |
| 1020 namespace_id, num, |
| 1021 transfer_buffer_id_, |
| 1022 transfer_buffer_.GetOffset(id_buffer)); |
| 1023 WaitForCmd(); |
| 1024 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 1025 n -= num; |
| 1026 ids += num; |
| 1027 } |
| 887 } | 1028 } |
| 888 | 1029 |
| 889 void GLES2Implementation::RegisterSharedIdsCHROMIUM( | 1030 void GLES2Implementation::RegisterSharedIdsCHROMIUM( |
| 890 GLuint namespace_id, GLsizei n, const GLuint* ids) { | 1031 GLuint namespace_id, GLsizei n, const GLuint* ids) { |
| 891 GPU_CLIENT_LOG("[" << this << "] glRegisterSharedIdsCHROMIUM(" | 1032 GPU_CLIENT_LOG("[" << this << "] glRegisterSharedIdsCHROMIUM(" |
| 892 << namespace_id << ", " << n << ", " | 1033 << namespace_id << ", " << n << ", " |
| 893 << static_cast<const void*>(ids) << ")"); | 1034 << static_cast<const void*>(ids) << ")"); |
| 894 GPU_CLIENT_LOG_CODE_BLOCK({ | 1035 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 895 for (GLsizei i = 0; i < n; ++i) { | 1036 for (GLsizei i = 0; i < n; ++i) { |
| 896 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); | 1037 GPU_CLIENT_LOG(" " << i << ": " << ids[i]); |
| 897 } | 1038 } |
| 898 }); | 1039 }); |
| 899 TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM"); | 1040 TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM"); |
| 900 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 1041 GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); |
| 901 memcpy(id_buffer, ids, sizeof(*ids) * n); | 1042 GLsizei max_num_per = max_size / sizeof(ids[0]); |
| 902 helper_->RegisterSharedIdsCHROMIUM(namespace_id, n, | 1043 while (n) { |
| 903 transfer_buffer_id_, | 1044 GLsizei num = std::min(n, max_num_per); |
| 904 transfer_buffer_.GetOffset(id_buffer)); | 1045 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); |
| 905 WaitForCmd(); | 1046 memcpy(id_buffer, ids, sizeof(*ids) * n); |
| 906 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 1047 helper_->RegisterSharedIdsCHROMIUM( |
| 1048 namespace_id, n, |
| 1049 transfer_buffer_id_, |
| 1050 transfer_buffer_.GetOffset(id_buffer)); |
| 1051 WaitForCmd(); |
| 1052 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 1053 n -= num; |
| 1054 ids += num; |
| 1055 } |
| 907 } | 1056 } |
| 908 | 1057 |
| 909 void GLES2Implementation::BindAttribLocation( | 1058 void GLES2Implementation::BindAttribLocation( |
| 910 GLuint program, GLuint index, const char* name) { | 1059 GLuint program, GLuint index, const char* name) { |
| 911 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", " | 1060 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", " |
| 912 << index << ", " << name << ")"); | 1061 << index << ", " << name << ")"); |
| 913 SetBucketAsString(kResultBucketId, name); | 1062 SetBucketAsString(kResultBucketId, name); |
| 914 helper_->BindAttribLocationBucket(program, index, kResultBucketId); | 1063 helper_->BindAttribLocationBucket(program, index, kResultBucketId); |
| 915 helper_->SetBucketSize(kResultBucketId, 0); | 1064 helper_->SetBucketSize(kResultBucketId, 0); |
| 916 } | 1065 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 936 index, pname, result_shm_id(), result_shm_offset()); | 1085 index, pname, result_shm_id(), result_shm_offset()); |
| 937 WaitForCmd(); | 1086 WaitForCmd(); |
| 938 result->CopyResult(ptr); | 1087 result->CopyResult(ptr); |
| 939 GPU_CLIENT_LOG_CODE_BLOCK({ | 1088 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 940 for (int32 i = 0; i < result->GetNumResults(); ++i) { | 1089 for (int32 i = 0; i < result->GetNumResults(); ++i) { |
| 941 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); | 1090 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); |
| 942 } | 1091 } |
| 943 }); | 1092 }); |
| 944 } | 1093 } |
| 945 | 1094 |
| 946 void GLES2Implementation::DeleteProgramOrShaderHelper( | 1095 bool GLES2Implementation::DeleteProgramHelper(GLuint program) { |
| 947 GLuint program_or_shader) { | 1096 if (!program_and_shader_id_handler_->FreeIds(1, &program)) { |
| 948 program_and_shader_id_handler_->FreeIds(1, &program_or_shader); | 1097 SetGLError( |
| 949 program_info_manager_->DeleteInfo(program_or_shader); | 1098 GL_INVALID_VALUE, |
| 1099 "glDeleteProgram: id not created by this context."); |
| 1100 return false; |
| 1101 } |
| 1102 program_info_manager_->DeleteInfo(program); |
| 1103 helper_->DeleteProgram(program); |
| 1104 Flush(); |
| 1105 return true; |
| 1106 } |
| 1107 |
| 1108 bool GLES2Implementation::DeleteShaderHelper(GLuint shader) { |
| 1109 if (!program_and_shader_id_handler_->FreeIds(1, &shader)) { |
| 1110 SetGLError( |
| 1111 GL_INVALID_VALUE, |
| 1112 "glDeleteShader: id not created by this context."); |
| 1113 return false; |
| 1114 } |
| 1115 program_info_manager_->DeleteInfo(shader); |
| 1116 helper_->DeleteShader(shader); |
| 1117 Flush(); |
| 1118 return true; |
| 950 } | 1119 } |
| 951 | 1120 |
| 952 GLint GLES2Implementation::GetAttribLocationHelper( | 1121 GLint GLES2Implementation::GetAttribLocationHelper( |
| 953 GLuint program, const char* name) { | 1122 GLuint program, const char* name) { |
| 954 typedef GetAttribLocationBucket::Result Result; | 1123 typedef GetAttribLocationBucket::Result Result; |
| 955 Result* result = GetResultAs<Result*>(); | 1124 Result* result = GetResultAs<Result*>(); |
| 956 *result = -1; | 1125 *result = -1; |
| 957 SetBucketAsCString(kResultBucketId, name); | 1126 SetBucketAsCString(kResultBucketId, name); |
| 958 helper_->GetAttribLocationBucket( | 1127 helper_->GetAttribLocationBucket( |
| 959 program, kResultBucketId, result_shm_id(), result_shm_offset()); | 1128 program, kResultBucketId, result_shm_id(), result_shm_offset()); |
| (...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1957 return false; | 2126 return false; |
| 1958 } | 2127 } |
| 1959 #else | 2128 #else |
| 1960 bool GLES2Implementation::IsBufferReservedId(GLuint /* id */) { | 2129 bool GLES2Implementation::IsBufferReservedId(GLuint /* id */) { |
| 1961 return false; | 2130 return false; |
| 1962 } | 2131 } |
| 1963 #endif | 2132 #endif |
| 1964 | 2133 |
| 1965 void GLES2Implementation::DeleteBuffersHelper( | 2134 void GLES2Implementation::DeleteBuffersHelper( |
| 1966 GLsizei n, const GLuint* buffers) { | 2135 GLsizei n, const GLuint* buffers) { |
| 1967 buffer_id_handler_->FreeIds(n, buffers); | 2136 if (!buffer_id_handler_->FreeIds(n, buffers)) { |
| 2137 SetGLError( |
| 2138 GL_INVALID_VALUE, |
| 2139 "glDeleteBuffers: id not created by this context."); |
| 2140 return; |
| 2141 } |
| 1968 for (GLsizei ii = 0; ii < n; ++ii) { | 2142 for (GLsizei ii = 0; ii < n; ++ii) { |
| 1969 if (buffers[ii] == bound_array_buffer_id_) { | 2143 if (buffers[ii] == bound_array_buffer_id_) { |
| 1970 bound_array_buffer_id_ = 0; | 2144 bound_array_buffer_id_ = 0; |
| 1971 } | 2145 } |
| 1972 if (buffers[ii] == bound_element_array_buffer_id_) { | 2146 if (buffers[ii] == bound_element_array_buffer_id_) { |
| 1973 bound_element_array_buffer_id_ = 0; | 2147 bound_element_array_buffer_id_ = 0; |
| 1974 } | 2148 } |
| 1975 } | 2149 } |
| 2150 helper_->DeleteBuffersImmediate(n, buffers); |
| 2151 Flush(); |
| 1976 } | 2152 } |
| 1977 | 2153 |
| 1978 void GLES2Implementation::DeleteFramebuffersHelper( | 2154 void GLES2Implementation::DeleteFramebuffersHelper( |
| 1979 GLsizei n, const GLuint* framebuffers) { | 2155 GLsizei n, const GLuint* framebuffers) { |
| 1980 framebuffer_id_handler_->FreeIds(n, framebuffers); | 2156 if (!framebuffer_id_handler_->FreeIds(n, framebuffers)) { |
| 2157 SetGLError( |
| 2158 GL_INVALID_VALUE, |
| 2159 "glDeleteFramebuffers: id not created by this context."); |
| 2160 return; |
| 2161 } |
| 1981 for (GLsizei ii = 0; ii < n; ++ii) { | 2162 for (GLsizei ii = 0; ii < n; ++ii) { |
| 1982 if (framebuffers[ii] == bound_framebuffer_) { | 2163 if (framebuffers[ii] == bound_framebuffer_) { |
| 1983 bound_framebuffer_ = 0; | 2164 bound_framebuffer_ = 0; |
| 1984 } | 2165 } |
| 1985 } | 2166 } |
| 2167 helper_->DeleteFramebuffersImmediate(n, framebuffers); |
| 2168 Flush(); |
| 1986 } | 2169 } |
| 1987 | 2170 |
| 1988 void GLES2Implementation::DeleteRenderbuffersHelper( | 2171 void GLES2Implementation::DeleteRenderbuffersHelper( |
| 1989 GLsizei n, const GLuint* renderbuffers) { | 2172 GLsizei n, const GLuint* renderbuffers) { |
| 1990 renderbuffer_id_handler_->FreeIds(n, renderbuffers); | 2173 if (!renderbuffer_id_handler_->FreeIds(n, renderbuffers)) { |
| 2174 SetGLError( |
| 2175 GL_INVALID_VALUE, |
| 2176 "glDeleteRenderbuffers: id not created by this context."); |
| 2177 return; |
| 2178 } |
| 1991 for (GLsizei ii = 0; ii < n; ++ii) { | 2179 for (GLsizei ii = 0; ii < n; ++ii) { |
| 1992 if (renderbuffers[ii] == bound_renderbuffer_) { | 2180 if (renderbuffers[ii] == bound_renderbuffer_) { |
| 1993 bound_renderbuffer_ = 0; | 2181 bound_renderbuffer_ = 0; |
| 1994 } | 2182 } |
| 1995 } | 2183 } |
| 2184 helper_->DeleteRenderbuffersImmediate(n, renderbuffers); |
| 2185 Flush(); |
| 1996 } | 2186 } |
| 1997 | 2187 |
| 1998 void GLES2Implementation::DeleteTexturesHelper( | 2188 void GLES2Implementation::DeleteTexturesHelper( |
| 1999 GLsizei n, const GLuint* textures) { | 2189 GLsizei n, const GLuint* textures) { |
| 2000 texture_id_handler_->FreeIds(n, textures); | 2190 if (!texture_id_handler_->FreeIds(n, textures)) { |
| 2191 SetGLError( |
| 2192 GL_INVALID_VALUE, |
| 2193 "glDeleteTextures: id not created by this context."); |
| 2194 return; |
| 2195 } |
| 2001 for (GLsizei ii = 0; ii < n; ++ii) { | 2196 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2002 for (GLint tt = 0; tt < gl_state_.max_combined_texture_image_units; ++tt) { | 2197 for (GLint tt = 0; tt < gl_state_.max_combined_texture_image_units; ++tt) { |
| 2003 TextureUnit& unit = texture_units_[active_texture_unit_]; | 2198 TextureUnit& unit = texture_units_[active_texture_unit_]; |
| 2004 if (textures[ii] == unit.bound_texture_2d) { | 2199 if (textures[ii] == unit.bound_texture_2d) { |
| 2005 unit.bound_texture_2d = 0; | 2200 unit.bound_texture_2d = 0; |
| 2006 } | 2201 } |
| 2007 if (textures[ii] == unit.bound_texture_cube_map) { | 2202 if (textures[ii] == unit.bound_texture_cube_map) { |
| 2008 unit.bound_texture_cube_map = 0; | 2203 unit.bound_texture_cube_map = 0; |
| 2009 } | 2204 } |
| 2010 } | 2205 } |
| 2011 } | 2206 } |
| 2207 helper_->DeleteTexturesImmediate(n, textures); |
| 2208 Flush(); |
| 2012 } | 2209 } |
| 2013 | 2210 |
| 2014 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { | 2211 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { |
| 2015 GPU_CLIENT_LOG( | 2212 GPU_CLIENT_LOG( |
| 2016 "[" << this << "] glDisableVertexAttribArray(" << index << ")"); | 2213 "[" << this << "] glDisableVertexAttribArray(" << index << ")"); |
| 2017 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 2214 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 2018 client_side_buffer_helper_->SetAttribEnable(index, false); | 2215 client_side_buffer_helper_->SetAttribEnable(index, false); |
| 2019 #endif | 2216 #endif |
| 2020 helper_->DisableVertexAttribArray(index); | 2217 helper_->DisableVertexAttribArray(index); |
| 2021 } | 2218 } |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2421 if (static_cast<size_t>(bufsize) < result.size()) { | 2618 if (static_cast<size_t>(bufsize) < result.size()) { |
| 2422 SetGLError(GL_INVALID_OPERATION, | 2619 SetGLError(GL_INVALID_OPERATION, |
| 2423 "glProgramInfoCHROMIUM: bufsize is too small for result."); | 2620 "glProgramInfoCHROMIUM: bufsize is too small for result."); |
| 2424 return; | 2621 return; |
| 2425 } | 2622 } |
| 2426 memcpy(info, &result[0], result.size()); | 2623 memcpy(info, &result[0], result.size()); |
| 2427 } | 2624 } |
| 2428 | 2625 |
| 2429 } // namespace gles2 | 2626 } // namespace gles2 |
| 2430 } // namespace gpu | 2627 } // namespace gpu |
| 2628 |
| OLD | NEW |