| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| 11 #include <queue> | 11 #include <queue> |
| 12 #include <GLES2/gl2ext.h> | 12 #include <GLES2/gl2ext.h> |
| 13 #include "../client/mapped_memory.h" | 13 #include "../client/mapped_memory.h" |
| 14 #include "../client/program_info_manager.h" | 14 #include "../client/program_info_manager.h" |
| 15 #include "../client/query_tracker.h" | 15 #include "../client/query_tracker.h" |
| 16 #include "../client/share_group.h" | |
| 17 #include "../client/transfer_buffer.h" | 16 #include "../client/transfer_buffer.h" |
| 18 #include "../common/gles2_cmd_utils.h" | 17 #include "../common/gles2_cmd_utils.h" |
| 19 #include "../common/id_allocator.h" | |
| 20 #include "../common/trace_event.h" | 18 #include "../common/trace_event.h" |
| 21 | 19 |
| 22 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 20 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 23 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 21 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
| 24 #endif | 22 #endif |
| 25 | 23 |
| 26 #if defined(GPU_CLIENT_DEBUG) | 24 #if defined(GPU_CLIENT_DEBUG) |
| 27 #include "ui/gfx/gl/gl_switches.h" | 25 #include "ui/gfx/gl/gl_switches.h" |
| 28 #include "base/command_line.h" | 26 #include "base/command_line.h" |
| 29 #endif | 27 #endif |
| 30 | 28 |
| 31 namespace gpu { | 29 namespace gpu { |
| 32 namespace gles2 { | 30 namespace gles2 { |
| 33 | 31 |
| 34 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. | 32 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. |
| 35 static GLuint ToGLuint(const void* ptr) { | 33 static GLuint ToGLuint(const void* ptr) { |
| 36 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); | 34 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); |
| 37 } | 35 } |
| 38 | 36 |
| 39 // An id handler for non-shared ids. | |
| 40 class NonSharedIdHandler : public IdHandlerInterface { | |
| 41 public: | |
| 42 NonSharedIdHandler() { } | |
| 43 virtual ~NonSharedIdHandler() { } | |
| 44 | |
| 45 // Overridden from IdHandlerInterface. | |
| 46 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | |
| 47 if (id_offset == 0) { | |
| 48 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 49 ids[ii] = id_allocator_.AllocateID(); | |
| 50 } | |
| 51 } else { | |
| 52 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 53 ids[ii] = id_allocator_.AllocateIDAtOrAbove(id_offset); | |
| 54 id_offset = ids[ii] + 1; | |
| 55 } | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 // Overridden from IdHandlerInterface. | |
| 60 virtual bool FreeIds(GLsizei n, const GLuint* ids) { | |
| 61 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 62 id_allocator_.FreeID(ids[ii]); | |
| 63 } | |
| 64 return true; | |
| 65 } | |
| 66 | |
| 67 // Overridden from IdHandlerInterface. | |
| 68 virtual bool MarkAsUsedForBind(GLuint id) { | |
| 69 return id == 0 ? true : id_allocator_.MarkAsUsed(id); | |
| 70 } | |
| 71 private: | |
| 72 IdAllocator id_allocator_; | |
| 73 }; | |
| 74 | |
| 75 // An id handler for non-shared ids that are never reused. | |
| 76 class NonSharedNonReusedIdHandler : public IdHandlerInterface { | |
| 77 public: | |
| 78 NonSharedNonReusedIdHandler() : last_id_(0) { } | |
| 79 virtual ~NonSharedNonReusedIdHandler() { } | |
| 80 | |
| 81 // Overridden from IdHandlerInterface. | |
| 82 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | |
| 83 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 84 ids[ii] = ++last_id_ + id_offset; | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 // Overridden from IdHandlerInterface. | |
| 89 virtual bool FreeIds(GLsizei /* n */, const GLuint* /* ids */) { | |
| 90 // Ids are never freed. | |
| 91 return true; | |
| 92 } | |
| 93 | |
| 94 // Overridden from IdHandlerInterface. | |
| 95 virtual bool MarkAsUsedForBind(GLuint /* id */) { | |
| 96 // This is only used for Shaders and Programs which have no bind. | |
| 97 return false; | |
| 98 } | |
| 99 | |
| 100 private: | |
| 101 GLuint last_id_; | |
| 102 }; | |
| 103 | |
| 104 // An id handler for shared ids. | |
| 105 class SharedIdHandler : public IdHandlerInterface { | |
| 106 public: | |
| 107 SharedIdHandler( | |
| 108 GLES2Implementation* gles2, | |
| 109 id_namespaces::IdNamespaces id_namespace) | |
| 110 : gles2_(gles2), | |
| 111 id_namespace_(id_namespace) { | |
| 112 } | |
| 113 | |
| 114 virtual ~SharedIdHandler() { } | |
| 115 | |
| 116 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | |
| 117 gles2_->GenSharedIdsCHROMIUM(id_namespace_, id_offset, n, ids); | |
| 118 } | |
| 119 | |
| 120 virtual bool FreeIds(GLsizei n, const GLuint* ids) { | |
| 121 gles2_->DeleteSharedIdsCHROMIUM(id_namespace_, n, ids); | |
| 122 // We need to ensure that the delete call is evaluated on the service side | |
| 123 // before any other contexts issue commands using these client ids. | |
| 124 gles2_->helper()->CommandBufferHelper::Flush(); | |
| 125 return true; | |
| 126 } | |
| 127 | |
| 128 virtual bool MarkAsUsedForBind(GLuint /* id */) { | |
| 129 // This has no meaning for shared resources. | |
| 130 return true; | |
| 131 } | |
| 132 | |
| 133 private: | |
| 134 GLES2Implementation* gles2_; | |
| 135 id_namespaces::IdNamespaces id_namespace_; | |
| 136 }; | |
| 137 | |
| 138 // An id handler for shared ids that requires ids are made before using and | |
| 139 // that only the context that created the id can delete it. | |
| 140 // Assumes the service will enforce that non made ids generate an error. | |
| 141 class StrictSharedIdHandler : public IdHandlerInterface { | |
| 142 public: | |
| 143 StrictSharedIdHandler( | |
| 144 GLES2Implementation* gles2, | |
| 145 id_namespaces::IdNamespaces id_namespace) | |
| 146 : gles2_(gles2), | |
| 147 id_namespace_(id_namespace) { | |
| 148 } | |
| 149 | |
| 150 virtual ~StrictSharedIdHandler() { | |
| 151 Destroy(); | |
| 152 } | |
| 153 | |
| 154 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) { | |
| 155 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 156 ids[ii] = GetId(id_offset); | |
| 157 } | |
| 158 } | |
| 159 | |
| 160 virtual bool FreeIds(GLsizei n, const GLuint* ids) { | |
| 161 // OpenGL sematics. If any id is bad none of them get freed. | |
| 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 return false; | |
| 168 } | |
| 169 } | |
| 170 } | |
| 171 for (GLsizei ii = 0; ii < n; ++ii) { | |
| 172 GLuint id = ids[ii]; | |
| 173 if (id != 0) { | |
| 174 ResourceIdSet::iterator it = used_ids_.find(id); | |
| 175 if (it != used_ids_.end()) { | |
| 176 used_ids_.erase(it); | |
| 177 free_ids_.push(id); | |
| 178 } | |
| 179 } | |
| 180 } | |
| 181 return true; | |
| 182 } | |
| 183 | |
| 184 virtual bool MarkAsUsedForBind(GLuint /* id */) { | |
| 185 // This has no meaning for shared resources. | |
| 186 return true; | |
| 187 } | |
| 188 | |
| 189 private: | |
| 190 static const GLsizei kNumIdsToGet = 2048; | |
| 191 typedef std::queue<GLuint> ResourceIdQueue; | |
| 192 typedef std::set<GLuint> ResourceIdSet; | |
| 193 | |
| 194 void Destroy() { | |
| 195 // Free all the ids not being used. | |
| 196 while (!free_ids_.empty()) { | |
| 197 GLuint ids[kNumIdsToGet]; | |
| 198 int count = 0; | |
| 199 while (count < kNumIdsToGet && !free_ids_.empty()) { | |
| 200 ids[count++] = free_ids_.front(); | |
| 201 free_ids_.pop(); | |
| 202 } | |
| 203 gles2_->DeleteSharedIdsCHROMIUM(id_namespace_, count, ids); | |
| 204 } | |
| 205 } | |
| 206 | |
| 207 GLuint GetId(GLuint id_offset) { | |
| 208 if (free_ids_.empty()) { | |
| 209 GLuint ids[kNumIdsToGet]; | |
| 210 gles2_->GenSharedIdsCHROMIUM(id_namespace_, id_offset, kNumIdsToGet, ids); | |
| 211 for (GLsizei ii = 0; ii < kNumIdsToGet; ++ii) { | |
| 212 free_ids_.push(ids[ii]); | |
| 213 } | |
| 214 } | |
| 215 GLuint id = free_ids_.front(); | |
| 216 free_ids_.pop(); | |
| 217 used_ids_.insert(id); | |
| 218 return id; | |
| 219 } | |
| 220 | |
| 221 GLES2Implementation* gles2_; | |
| 222 id_namespaces::IdNamespaces id_namespace_; | |
| 223 ResourceIdSet used_ids_; | |
| 224 ResourceIdQueue free_ids_; | |
| 225 }; | |
| 226 | |
| 227 #ifndef _MSC_VER | |
| 228 const GLsizei StrictSharedIdHandler::kNumIdsToGet; | |
| 229 #endif | |
| 230 | |
| 231 static GLsizei RoundUpToMultipleOf4(GLsizei size) { | 37 static GLsizei RoundUpToMultipleOf4(GLsizei size) { |
| 232 return (size + 3) & ~3; | 38 return (size + 3) & ~3; |
| 233 } | 39 } |
| 234 | 40 |
| 235 // This class tracks VertexAttribPointers and helps emulate client side buffers. | 41 // This class tracks VertexAttribPointers and helps emulate client side buffers. |
| 236 // | 42 // |
| 237 // The way client side buffers work is we shadow all the Vertex Attribs so we | 43 // The way client side buffers work is we shadow all the Vertex Attribs so we |
| 238 // know which ones are pointing to client side buffers. | 44 // know which ones are pointing to client side buffers. |
| 239 // | 45 // |
| 240 // At Draw time, for any attribs pointing to client side buffers we copy them | 46 // At Draw time, for any attribs pointing to client side buffers we copy them |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 scoped_array<int8> collection_buffer_; | 358 scoped_array<int8> collection_buffer_; |
| 553 | 359 |
| 554 DISALLOW_COPY_AND_ASSIGN(ClientSideBufferHelper); | 360 DISALLOW_COPY_AND_ASSIGN(ClientSideBufferHelper); |
| 555 }; | 361 }; |
| 556 | 362 |
| 557 #if !defined(_MSC_VER) | 363 #if !defined(_MSC_VER) |
| 558 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; | 364 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; |
| 559 const unsigned int GLES2Implementation::kStartingOffset; | 365 const unsigned int GLES2Implementation::kStartingOffset; |
| 560 #endif | 366 #endif |
| 561 | 367 |
| 562 COMPILE_ASSERT(gpu::kInvalidResource == 0, | |
| 563 INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS); | |
| 564 | |
| 565 GLES2Implementation::SingleThreadChecker::SingleThreadChecker( | 368 GLES2Implementation::SingleThreadChecker::SingleThreadChecker( |
| 566 GLES2Implementation* gles2_implementation) | 369 GLES2Implementation* gles2_implementation) |
| 567 : gles2_implementation_(gles2_implementation) { | 370 : gles2_implementation_(gles2_implementation) { |
| 568 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); | 371 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); |
| 569 ++gles2_implementation_->use_count_; | 372 ++gles2_implementation_->use_count_; |
| 570 } | 373 } |
| 571 | 374 |
| 572 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { | 375 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { |
| 573 --gles2_implementation_->use_count_; | 376 --gles2_implementation_->use_count_; |
| 574 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); | 377 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 589 pack_reverse_row_order_(false), | 392 pack_reverse_row_order_(false), |
| 590 active_texture_unit_(0), | 393 active_texture_unit_(0), |
| 591 bound_framebuffer_(0), | 394 bound_framebuffer_(0), |
| 592 bound_renderbuffer_(0), | 395 bound_renderbuffer_(0), |
| 593 bound_array_buffer_id_(0), | 396 bound_array_buffer_id_(0), |
| 594 bound_element_array_buffer_id_(0), | 397 bound_element_array_buffer_id_(0), |
| 595 client_side_array_id_(0), | 398 client_side_array_id_(0), |
| 596 client_side_element_array_id_(0), | 399 client_side_element_array_id_(0), |
| 597 error_bits_(0), | 400 error_bits_(0), |
| 598 debug_(false), | 401 debug_(false), |
| 599 sharing_resources_(share_resources), | |
| 600 bind_generates_resource_(bind_generates_resource), | |
| 601 use_count_(0), | 402 use_count_(0), |
| 602 current_query_(NULL), | 403 current_query_(NULL), |
| 603 error_message_callback_(NULL) { | 404 error_message_callback_(NULL) { |
| 604 GPU_DCHECK(helper); | 405 GPU_DCHECK(helper); |
| 605 GPU_DCHECK(transfer_buffer); | 406 GPU_DCHECK(transfer_buffer); |
| 606 GPU_CLIENT_LOG_CODE_BLOCK({ | 407 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 607 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( | 408 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( |
| 608 switches::kEnableGPUClientLogging); | 409 switches::kEnableGPUClientLogging); |
| 609 }); | 410 }); |
| 610 | 411 |
| 611 share_group_ = (share_group ? share_group : new ShareGroup()); | 412 share_group_ = (share_group ? share_group : new ShareGroup( |
| 413 share_resources, bind_generates_resource)); |
| 612 | 414 |
| 613 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); | 415 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); |
| 614 } | 416 } |
| 615 | 417 |
| 616 bool GLES2Implementation::Initialize( | 418 bool GLES2Implementation::Initialize( |
| 617 unsigned int starting_transfer_buffer_size, | 419 unsigned int starting_transfer_buffer_size, |
| 618 unsigned int min_transfer_buffer_size, | 420 unsigned int min_transfer_buffer_size, |
| 619 unsigned int max_transfer_buffer_size) { | 421 unsigned int max_transfer_buffer_size) { |
| 620 GPU_DCHECK_GE(starting_transfer_buffer_size, min_transfer_buffer_size); | 422 GPU_DCHECK_GE(starting_transfer_buffer_size, min_transfer_buffer_size); |
| 621 GPU_DCHECK_LE(starting_transfer_buffer_size, max_transfer_buffer_size); | 423 GPU_DCHECK_LE(starting_transfer_buffer_size, max_transfer_buffer_size); |
| 622 GPU_DCHECK_GE(min_transfer_buffer_size, kStartingOffset); | 424 GPU_DCHECK_GE(min_transfer_buffer_size, kStartingOffset); |
| 623 | 425 |
| 624 if (!transfer_buffer_->Initialize( | 426 if (!transfer_buffer_->Initialize( |
| 625 starting_transfer_buffer_size, | 427 starting_transfer_buffer_size, |
| 626 kStartingOffset, | 428 kStartingOffset, |
| 627 min_transfer_buffer_size, | 429 min_transfer_buffer_size, |
| 628 max_transfer_buffer_size, | 430 max_transfer_buffer_size, |
| 629 kAlignment, | 431 kAlignment, |
| 630 kSizeToFlush)) { | 432 kSizeToFlush)) { |
| 631 return false; | 433 return false; |
| 632 } | 434 } |
| 633 | 435 |
| 634 mapped_memory_.reset(new MappedMemoryManager(helper_)); | 436 mapped_memory_.reset(new MappedMemoryManager(helper_)); |
| 635 SetSharedMemoryChunkSizeMultiple(1024 * 1024 * 2); | 437 SetSharedMemoryChunkSizeMultiple(1024 * 1024 * 2); |
| 636 | 438 |
| 637 if (sharing_resources_) { | |
| 638 if (!bind_generates_resource_) { | |
| 639 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { | |
| 640 id_handlers_[i].reset(new StrictSharedIdHandler( | |
| 641 this, static_cast<id_namespaces::IdNamespaces>(i))); | |
| 642 } | |
| 643 } else { | |
| 644 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { | |
| 645 id_handlers_[i].reset(new SharedIdHandler( | |
| 646 this, static_cast<id_namespaces::IdNamespaces>(i))); | |
| 647 } | |
| 648 } | |
| 649 } else { | |
| 650 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { | |
| 651 if (i == id_namespaces::kProgramsAndShaders) | |
| 652 id_handlers_[i].reset(new NonSharedNonReusedIdHandler); | |
| 653 else | |
| 654 id_handlers_[i].reset(new NonSharedIdHandler); | |
| 655 } | |
| 656 } | |
| 657 | |
| 658 static const GLenum pnames[] = { | 439 static const GLenum pnames[] = { |
| 659 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, | 440 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, |
| 660 GL_MAX_CUBE_MAP_TEXTURE_SIZE, | 441 GL_MAX_CUBE_MAP_TEXTURE_SIZE, |
| 661 GL_MAX_FRAGMENT_UNIFORM_VECTORS, | 442 GL_MAX_FRAGMENT_UNIFORM_VECTORS, |
| 662 GL_MAX_RENDERBUFFER_SIZE, | 443 GL_MAX_RENDERBUFFER_SIZE, |
| 663 GL_MAX_TEXTURE_IMAGE_UNITS, | 444 GL_MAX_TEXTURE_IMAGE_UNITS, |
| 664 GL_MAX_TEXTURE_SIZE, | 445 GL_MAX_TEXTURE_SIZE, |
| 665 GL_MAX_VARYING_VECTORS, | 446 GL_MAX_VARYING_VECTORS, |
| 666 GL_MAX_VERTEX_ATTRIBS, | 447 GL_MAX_VERTEX_ATTRIBS, |
| 667 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, | 448 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, |
| 668 GL_MAX_VERTEX_UNIFORM_VECTORS, | 449 GL_MAX_VERTEX_UNIFORM_VECTORS, |
| 669 GL_NUM_COMPRESSED_TEXTURE_FORMATS, | 450 GL_NUM_COMPRESSED_TEXTURE_FORMATS, |
| 670 GL_NUM_SHADER_BINARY_FORMATS, | 451 GL_NUM_SHADER_BINARY_FORMATS, |
| 671 }; | 452 }; |
| 672 | 453 |
| 673 util_.set_num_compressed_texture_formats( | 454 util_.set_num_compressed_texture_formats( |
| 674 gl_state_.num_compressed_texture_formats); | 455 gl_state_.num_compressed_texture_formats); |
| 675 util_.set_num_shader_binary_formats( | 456 util_.set_num_shader_binary_formats( |
| 676 gl_state_.num_shader_binary_formats); | 457 gl_state_.num_shader_binary_formats); |
| 677 | 458 |
| 678 GetMultipleIntegervCHROMIUM( | 459 GetMultipleIntegervCHROMIUM( |
| 679 pnames, arraysize(pnames), &gl_state_.max_combined_texture_image_units, | 460 pnames, arraysize(pnames), &gl_state_.max_combined_texture_image_units, |
| 680 sizeof(gl_state_)); | 461 sizeof(gl_state_)); |
| 681 | 462 |
| 682 texture_units_.reset( | 463 texture_units_.reset( |
| 683 new TextureUnit[gl_state_.max_combined_texture_image_units]); | 464 new TextureUnit[gl_state_.max_combined_texture_image_units]); |
| 684 | 465 |
| 685 program_info_manager_.reset(ProgramInfoManager::Create(sharing_resources_)); | |
| 686 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); | 466 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); |
| 687 | 467 |
| 688 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 468 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 689 id_handlers_[id_namespaces::kBuffers]->MakeIds( | 469 GetIdHandler(id_namespaces::kBuffers)->MakeIds( |
| 690 kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); | 470 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); |
| 691 | 471 |
| 692 client_side_buffer_helper_.reset(new ClientSideBufferHelper( | 472 client_side_buffer_helper_.reset(new ClientSideBufferHelper( |
| 693 gl_state_.max_vertex_attribs, | 473 gl_state_.max_vertex_attribs, |
| 694 reserved_ids_[0], | 474 reserved_ids_[0], |
| 695 reserved_ids_[1])); | 475 reserved_ids_[1])); |
| 696 #endif | 476 #endif |
| 697 | 477 |
| 698 return true; | 478 return true; |
| 699 } | 479 } |
| 700 | 480 |
| 701 GLES2Implementation::~GLES2Implementation() { | 481 GLES2Implementation::~GLES2Implementation() { |
| 702 // Make sure the queries are finished otherwise we'll delete the | 482 // Make sure the queries are finished otherwise we'll delete the |
| 703 // shared memory (mapped_memory_) which will free the memory used | 483 // shared memory (mapped_memory_) which will free the memory used |
| 704 // by the queries. The GPU process when validating that memory is still | 484 // by the queries. The GPU process when validating that memory is still |
| 705 // shared will fail and abort (ie, it will stop running). | 485 // shared will fail and abort (ie, it will stop running). |
| 706 Finish(); | 486 Finish(); |
| 707 query_tracker_.reset(); | 487 query_tracker_.reset(); |
| 708 | 488 |
| 709 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 489 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 710 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); | 490 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); |
| 711 #endif | 491 #endif |
| 712 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { | 492 // The share group needs to be able to use a command buffer to talk |
| 713 id_handlers_[i].reset(); | 493 // to service if it's destroyed so set one for it then release the reference. |
| 714 } | 494 // If it's destroyed it will use this GLES2Implemenation. |
| 495 share_group_->SetGLES2ImplementationForDestruction(this); |
| 496 share_group_ = NULL; |
| 715 // Make sure the commands make it the service. | 497 // Make sure the commands make it the service. |
| 716 Finish(); | 498 Finish(); |
| 717 } | 499 } |
| 718 | 500 |
| 501 GLuint GLES2Implementation::MakeTextureId() { |
| 502 GLuint id; |
| 503 GetIdHandler(id_namespaces::kTextures)->MakeIds(this, 0, 1, &id); |
| 504 return id; |
| 505 } |
| 506 |
| 507 void GLES2Implementation::FreeTextureId(GLuint id) { |
| 508 GetIdHandler(id_namespaces::kTextures)->FreeIds(this, 1, &id); |
| 509 } |
| 510 |
| 511 IdHandlerInterface* GLES2Implementation::GetIdHandler(int namespace_id) const { |
| 512 return share_group_->GetIdHandler(namespace_id); |
| 513 } |
| 514 |
| 719 void* GLES2Implementation::GetResultBuffer() { | 515 void* GLES2Implementation::GetResultBuffer() { |
| 720 return transfer_buffer_->GetResultBuffer(); | 516 return transfer_buffer_->GetResultBuffer(); |
| 721 } | 517 } |
| 722 | 518 |
| 723 int32 GLES2Implementation::GetResultShmId() { | 519 int32 GLES2Implementation::GetResultShmId() { |
| 724 return transfer_buffer_->GetShmId(); | 520 return transfer_buffer_->GetShmId(); |
| 725 } | 521 } |
| 726 | 522 |
| 727 uint32 GLES2Implementation::GetResultShmOffset() { | 523 uint32 GLES2Implementation::GetResultShmOffset() { |
| 728 return transfer_buffer_->GetResultOffset(); | 524 return transfer_buffer_->GetResultOffset(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 case GL_MAX_VERTEX_UNIFORM_VECTORS: | 750 case GL_MAX_VERTEX_UNIFORM_VECTORS: |
| 955 *params = gl_state_.max_vertex_uniform_vectors; | 751 *params = gl_state_.max_vertex_uniform_vectors; |
| 956 return true; | 752 return true; |
| 957 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: | 753 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: |
| 958 *params = gl_state_.num_compressed_texture_formats; | 754 *params = gl_state_.num_compressed_texture_formats; |
| 959 return true; | 755 return true; |
| 960 case GL_NUM_SHADER_BINARY_FORMATS: | 756 case GL_NUM_SHADER_BINARY_FORMATS: |
| 961 *params = gl_state_.num_shader_binary_formats; | 757 *params = gl_state_.num_shader_binary_formats; |
| 962 return true; | 758 return true; |
| 963 case GL_ARRAY_BUFFER_BINDING: | 759 case GL_ARRAY_BUFFER_BINDING: |
| 964 if (bind_generates_resource_) { | 760 if (share_group_->bind_generates_resource()) { |
| 965 *params = bound_array_buffer_id_; | 761 *params = bound_array_buffer_id_; |
| 966 return true; | 762 return true; |
| 967 } | 763 } |
| 968 return false; | 764 return false; |
| 969 case GL_ELEMENT_ARRAY_BUFFER_BINDING: | 765 case GL_ELEMENT_ARRAY_BUFFER_BINDING: |
| 970 if (bind_generates_resource_) { | 766 if (share_group_->bind_generates_resource()) { |
| 971 *params = bound_element_array_buffer_id_; | 767 *params = bound_element_array_buffer_id_; |
| 972 return true; | 768 return true; |
| 973 } | 769 } |
| 974 return false; | 770 return false; |
| 975 case GL_ACTIVE_TEXTURE: | 771 case GL_ACTIVE_TEXTURE: |
| 976 *params = active_texture_unit_ + GL_TEXTURE0; | 772 *params = active_texture_unit_ + GL_TEXTURE0; |
| 977 return true; | 773 return true; |
| 978 case GL_TEXTURE_BINDING_2D: | 774 case GL_TEXTURE_BINDING_2D: |
| 979 if (bind_generates_resource_) { | 775 if (share_group_->bind_generates_resource()) { |
| 980 *params = texture_units_[active_texture_unit_].bound_texture_2d; | 776 *params = texture_units_[active_texture_unit_].bound_texture_2d; |
| 981 return true; | 777 return true; |
| 982 } | 778 } |
| 983 return false; | 779 return false; |
| 984 case GL_TEXTURE_BINDING_CUBE_MAP: | 780 case GL_TEXTURE_BINDING_CUBE_MAP: |
| 985 if (bind_generates_resource_) { | 781 if (share_group_->bind_generates_resource()) { |
| 986 *params = texture_units_[active_texture_unit_].bound_texture_cube_map; | 782 *params = texture_units_[active_texture_unit_].bound_texture_cube_map; |
| 987 return true; | 783 return true; |
| 988 } | 784 } |
| 989 return false; | 785 return false; |
| 990 case GL_FRAMEBUFFER_BINDING: | 786 case GL_FRAMEBUFFER_BINDING: |
| 991 if (bind_generates_resource_) { | 787 if (share_group_->bind_generates_resource()) { |
| 992 *params = bound_framebuffer_; | 788 *params = bound_framebuffer_; |
| 993 return true; | 789 return true; |
| 994 } | 790 } |
| 995 return false; | 791 return false; |
| 996 case GL_RENDERBUFFER_BINDING: | 792 case GL_RENDERBUFFER_BINDING: |
| 997 if (bind_generates_resource_) { | 793 if (share_group_->bind_generates_resource()) { |
| 998 *params = bound_renderbuffer_; | 794 *params = bound_renderbuffer_; |
| 999 return true; | 795 return true; |
| 1000 } | 796 } |
| 1001 return false; | 797 return false; |
| 1002 default: | 798 default: |
| 1003 return false; | 799 return false; |
| 1004 } | 800 } |
| 1005 } | 801 } |
| 1006 | 802 |
| 1007 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) { | 803 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) { |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 WaitForCmd(); | 1064 WaitForCmd(); |
| 1269 result->CopyResult(ptr); | 1065 result->CopyResult(ptr); |
| 1270 GPU_CLIENT_LOG_CODE_BLOCK({ | 1066 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 1271 for (int32 i = 0; i < result->GetNumResults(); ++i) { | 1067 for (int32 i = 0; i < result->GetNumResults(); ++i) { |
| 1272 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); | 1068 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); |
| 1273 } | 1069 } |
| 1274 }); | 1070 }); |
| 1275 } | 1071 } |
| 1276 | 1072 |
| 1277 bool GLES2Implementation::DeleteProgramHelper(GLuint program) { | 1073 bool GLES2Implementation::DeleteProgramHelper(GLuint program) { |
| 1278 if (!id_handlers_[id_namespaces::kProgramsAndShaders]->FreeIds(1, &program)) { | 1074 if (!GetIdHandler(id_namespaces::kProgramsAndShaders)->FreeIds( |
| 1075 this, 1, &program)) { |
| 1279 SetGLError( | 1076 SetGLError( |
| 1280 GL_INVALID_VALUE, | 1077 GL_INVALID_VALUE, |
| 1281 "glDeleteProgram: id not created by this context."); | 1078 "glDeleteProgram: id not created by this context."); |
| 1282 return false; | 1079 return false; |
| 1283 } | 1080 } |
| 1284 program_info_manager_->DeleteInfo(program); | 1081 share_group_->program_info_manager()->DeleteInfo(program); |
| 1285 helper_->DeleteProgram(program); | 1082 helper_->DeleteProgram(program); |
| 1286 return true; | 1083 return true; |
| 1287 } | 1084 } |
| 1288 | 1085 |
| 1289 bool GLES2Implementation::DeleteShaderHelper(GLuint shader) { | 1086 bool GLES2Implementation::DeleteShaderHelper(GLuint shader) { |
| 1290 if (!id_handlers_[id_namespaces::kProgramsAndShaders]->FreeIds(1, &shader)) { | 1087 if (!GetIdHandler(id_namespaces::kProgramsAndShaders)->FreeIds( |
| 1088 this, 1, &shader)) { |
| 1291 SetGLError( | 1089 SetGLError( |
| 1292 GL_INVALID_VALUE, | 1090 GL_INVALID_VALUE, |
| 1293 "glDeleteShader: id not created by this context."); | 1091 "glDeleteShader: id not created by this context."); |
| 1294 return false; | 1092 return false; |
| 1295 } | 1093 } |
| 1296 program_info_manager_->DeleteInfo(shader); | 1094 share_group_->program_info_manager()->DeleteInfo(shader); |
| 1297 helper_->DeleteShader(shader); | 1095 helper_->DeleteShader(shader); |
| 1298 return true; | 1096 return true; |
| 1299 } | 1097 } |
| 1300 | 1098 |
| 1301 GLint GLES2Implementation::GetAttribLocationHelper( | 1099 GLint GLES2Implementation::GetAttribLocationHelper( |
| 1302 GLuint program, const char* name) { | 1100 GLuint program, const char* name) { |
| 1303 typedef GetAttribLocationBucket::Result Result; | 1101 typedef GetAttribLocationBucket::Result Result; |
| 1304 Result* result = GetResultAs<Result*>(); | 1102 Result* result = GetResultAs<Result*>(); |
| 1305 if (!result) { | 1103 if (!result) { |
| 1306 return -1; | 1104 return -1; |
| 1307 } | 1105 } |
| 1308 *result = -1; | 1106 *result = -1; |
| 1309 SetBucketAsCString(kResultBucketId, name); | 1107 SetBucketAsCString(kResultBucketId, name); |
| 1310 helper_->GetAttribLocationBucket( | 1108 helper_->GetAttribLocationBucket( |
| 1311 program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); | 1109 program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); |
| 1312 WaitForCmd(); | 1110 WaitForCmd(); |
| 1313 helper_->SetBucketSize(kResultBucketId, 0); | 1111 helper_->SetBucketSize(kResultBucketId, 0); |
| 1314 return *result; | 1112 return *result; |
| 1315 } | 1113 } |
| 1316 | 1114 |
| 1317 GLint GLES2Implementation::GetAttribLocation( | 1115 GLint GLES2Implementation::GetAttribLocation( |
| 1318 GLuint program, const char* name) { | 1116 GLuint program, const char* name) { |
| 1319 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1117 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 1320 GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program | 1118 GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program |
| 1321 << ", " << name << ")"); | 1119 << ", " << name << ")"); |
| 1322 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); | 1120 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); |
| 1323 GLint loc = program_info_manager_->GetAttribLocation(this, program, name); | 1121 GLint loc = share_group_->program_info_manager()->GetAttribLocation( |
| 1122 this, program, name); |
| 1324 GPU_CLIENT_LOG("returned " << loc); | 1123 GPU_CLIENT_LOG("returned " << loc); |
| 1325 return loc; | 1124 return loc; |
| 1326 } | 1125 } |
| 1327 | 1126 |
| 1328 GLint GLES2Implementation::GetUniformLocationHelper( | 1127 GLint GLES2Implementation::GetUniformLocationHelper( |
| 1329 GLuint program, const char* name) { | 1128 GLuint program, const char* name) { |
| 1330 typedef GetUniformLocationBucket::Result Result; | 1129 typedef GetUniformLocationBucket::Result Result; |
| 1331 Result* result = GetResultAs<Result*>(); | 1130 Result* result = GetResultAs<Result*>(); |
| 1332 if (!result) { | 1131 if (!result) { |
| 1333 return -1; | 1132 return -1; |
| 1334 } | 1133 } |
| 1335 *result = -1; | 1134 *result = -1; |
| 1336 SetBucketAsCString(kResultBucketId, name); | 1135 SetBucketAsCString(kResultBucketId, name); |
| 1337 helper_->GetUniformLocationBucket(program, kResultBucketId, | 1136 helper_->GetUniformLocationBucket(program, kResultBucketId, |
| 1338 GetResultShmId(), GetResultShmOffset()); | 1137 GetResultShmId(), GetResultShmOffset()); |
| 1339 WaitForCmd(); | 1138 WaitForCmd(); |
| 1340 helper_->SetBucketSize(kResultBucketId, 0); | 1139 helper_->SetBucketSize(kResultBucketId, 0); |
| 1341 return *result; | 1140 return *result; |
| 1342 } | 1141 } |
| 1343 | 1142 |
| 1344 GLint GLES2Implementation::GetUniformLocation( | 1143 GLint GLES2Implementation::GetUniformLocation( |
| 1345 GLuint program, const char* name) { | 1144 GLuint program, const char* name) { |
| 1346 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1145 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 1347 GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program | 1146 GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program |
| 1348 << ", " << name << ")"); | 1147 << ", " << name << ")"); |
| 1349 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); | 1148 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); |
| 1350 GLint loc = program_info_manager_->GetUniformLocation(this, program, name); | 1149 GLint loc = share_group_->program_info_manager()->GetUniformLocation( |
| 1150 this, program, name); |
| 1351 GPU_CLIENT_LOG("returned " << loc); | 1151 GPU_CLIENT_LOG("returned " << loc); |
| 1352 return loc; | 1152 return loc; |
| 1353 } | 1153 } |
| 1354 | 1154 |
| 1355 bool GLES2Implementation::GetProgramivHelper( | 1155 bool GLES2Implementation::GetProgramivHelper( |
| 1356 GLuint program, GLenum pname, GLint* params) { | 1156 GLuint program, GLenum pname, GLint* params) { |
| 1357 return program_info_manager_->GetProgramiv(this, program, pname, params); | 1157 return share_group_->program_info_manager()->GetProgramiv( |
| 1158 this, program, pname, params); |
| 1358 } | 1159 } |
| 1359 | 1160 |
| 1360 void GLES2Implementation::LinkProgram(GLuint program) { | 1161 void GLES2Implementation::LinkProgram(GLuint program) { |
| 1361 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1162 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 1362 GPU_CLIENT_LOG("[" << this << "] glLinkProgram(" << program << ")"); | 1163 GPU_CLIENT_LOG("[" << this << "] glLinkProgram(" << program << ")"); |
| 1363 helper_->LinkProgram(program); | 1164 helper_->LinkProgram(program); |
| 1364 program_info_manager_->CreateInfo(program); | 1165 share_group_->program_info_manager()->CreateInfo(program); |
| 1365 } | 1166 } |
| 1366 | 1167 |
| 1367 void GLES2Implementation::ShaderBinary( | 1168 void GLES2Implementation::ShaderBinary( |
| 1368 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, | 1169 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, |
| 1369 GLsizei length) { | 1170 GLsizei length) { |
| 1370 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1171 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 1371 GPU_CLIENT_LOG("[" << this << "] glShaderBinary(" << n << ", " | 1172 GPU_CLIENT_LOG("[" << this << "] glShaderBinary(" << n << ", " |
| 1372 << static_cast<const void*>(shaders) << ", " | 1173 << static_cast<const void*>(shaders) << ", " |
| 1373 << GLES2Util::GetStringEnum(binaryformat) << ", " | 1174 << GLES2Util::GetStringEnum(binaryformat) << ", " |
| 1374 << static_cast<const void*>(binary) << ", " | 1175 << static_cast<const void*>(binary) << ", " |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1946 << program << ", " << index << ", " << bufsize << ", " | 1747 << program << ", " << index << ", " << bufsize << ", " |
| 1947 << static_cast<const void*>(length) << ", " | 1748 << static_cast<const void*>(length) << ", " |
| 1948 << static_cast<const void*>(size) << ", " | 1749 << static_cast<const void*>(size) << ", " |
| 1949 << static_cast<const void*>(type) << ", " | 1750 << static_cast<const void*>(type) << ", " |
| 1950 << static_cast<const void*>(name) << ", "); | 1751 << static_cast<const void*>(name) << ", "); |
| 1951 if (bufsize < 0) { | 1752 if (bufsize < 0) { |
| 1952 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); | 1753 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); |
| 1953 return; | 1754 return; |
| 1954 } | 1755 } |
| 1955 TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); | 1756 TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); |
| 1956 bool success = program_info_manager_->GetActiveAttrib( | 1757 bool success = share_group_->program_info_manager()->GetActiveAttrib( |
| 1957 this, program, index, bufsize, length, size, type, name); | 1758 this, program, index, bufsize, length, size, type, name); |
| 1958 if (success) { | 1759 if (success) { |
| 1959 if (size) { | 1760 if (size) { |
| 1960 GPU_CLIENT_LOG(" size: " << *size); | 1761 GPU_CLIENT_LOG(" size: " << *size); |
| 1961 } | 1762 } |
| 1962 if (type) { | 1763 if (type) { |
| 1963 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); | 1764 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
| 1964 } | 1765 } |
| 1965 if (name) { | 1766 if (name) { |
| 1966 GPU_CLIENT_LOG(" name: " << name); | 1767 GPU_CLIENT_LOG(" name: " << name); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2016 << program << ", " << index << ", " << bufsize << ", " | 1817 << program << ", " << index << ", " << bufsize << ", " |
| 2017 << static_cast<const void*>(length) << ", " | 1818 << static_cast<const void*>(length) << ", " |
| 2018 << static_cast<const void*>(size) << ", " | 1819 << static_cast<const void*>(size) << ", " |
| 2019 << static_cast<const void*>(type) << ", " | 1820 << static_cast<const void*>(type) << ", " |
| 2020 << static_cast<const void*>(name) << ", "); | 1821 << static_cast<const void*>(name) << ", "); |
| 2021 if (bufsize < 0) { | 1822 if (bufsize < 0) { |
| 2022 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); | 1823 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); |
| 2023 return; | 1824 return; |
| 2024 } | 1825 } |
| 2025 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); | 1826 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); |
| 2026 bool success = program_info_manager_->GetActiveUniform( | 1827 bool success = share_group_->program_info_manager()->GetActiveUniform( |
| 2027 this, program, index, bufsize, length, size, type, name); | 1828 this, program, index, bufsize, length, size, type, name); |
| 2028 if (success) { | 1829 if (success) { |
| 2029 if (size) { | 1830 if (size) { |
| 2030 GPU_CLIENT_LOG(" size: " << *size); | 1831 GPU_CLIENT_LOG(" size: " << *size); |
| 2031 } | 1832 } |
| 2032 if (type) { | 1833 if (type) { |
| 2033 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); | 1834 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
| 2034 } | 1835 } |
| 2035 if (name) { | 1836 if (name) { |
| 2036 GPU_CLIENT_LOG(" name: " << name); | 1837 GPU_CLIENT_LOG(" name: " << name); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 bound_array_buffer_id_ = buffer; | 2137 bound_array_buffer_id_ = buffer; |
| 2337 break; | 2138 break; |
| 2338 case GL_ELEMENT_ARRAY_BUFFER: | 2139 case GL_ELEMENT_ARRAY_BUFFER: |
| 2339 bound_element_array_buffer_id_ = buffer; | 2140 bound_element_array_buffer_id_ = buffer; |
| 2340 break; | 2141 break; |
| 2341 default: | 2142 default: |
| 2342 break; | 2143 break; |
| 2343 } | 2144 } |
| 2344 // TODO(gman): There's a bug here. If the target is invalid the ID will not be | 2145 // TODO(gman): There's a bug here. If the target is invalid the ID will not be |
| 2345 // used even though it's marked it as used here. | 2146 // used even though it's marked it as used here. |
| 2346 id_handlers_[id_namespaces::kBuffers]->MarkAsUsedForBind(buffer); | 2147 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer); |
| 2347 } | 2148 } |
| 2348 | 2149 |
| 2349 void GLES2Implementation::BindFramebufferHelper( | 2150 void GLES2Implementation::BindFramebufferHelper( |
| 2350 GLenum target, GLuint framebuffer) { | 2151 GLenum target, GLuint framebuffer) { |
| 2351 // TODO(gman): See note #1 above. | 2152 // TODO(gman): See note #1 above. |
| 2352 switch (target) { | 2153 switch (target) { |
| 2353 case GL_FRAMEBUFFER: | 2154 case GL_FRAMEBUFFER: |
| 2354 bound_framebuffer_ = framebuffer; | 2155 bound_framebuffer_ = framebuffer; |
| 2355 break; | 2156 break; |
| 2356 default: | 2157 default: |
| 2357 break; | 2158 break; |
| 2358 } | 2159 } |
| 2359 // TODO(gman): There's a bug here. If the target is invalid the ID will not be | 2160 // TODO(gman): There's a bug here. If the target is invalid the ID will not be |
| 2360 // used even though it's marked it as used here. | 2161 // used even though it's marked it as used here. |
| 2361 id_handlers_[id_namespaces::kFramebuffers]->MarkAsUsedForBind(framebuffer); | 2162 GetIdHandler(id_namespaces::kFramebuffers)->MarkAsUsedForBind(framebuffer); |
| 2362 } | 2163 } |
| 2363 | 2164 |
| 2364 void GLES2Implementation::BindRenderbufferHelper( | 2165 void GLES2Implementation::BindRenderbufferHelper( |
| 2365 GLenum target, GLuint renderbuffer) { | 2166 GLenum target, GLuint renderbuffer) { |
| 2366 // TODO(gman): See note #1 above. | 2167 // TODO(gman): See note #1 above. |
| 2367 switch (target) { | 2168 switch (target) { |
| 2368 case GL_RENDERBUFFER: | 2169 case GL_RENDERBUFFER: |
| 2369 bound_renderbuffer_ = renderbuffer; | 2170 bound_renderbuffer_ = renderbuffer; |
| 2370 break; | 2171 break; |
| 2371 default: | 2172 default: |
| 2372 break; | 2173 break; |
| 2373 } | 2174 } |
| 2374 // TODO(gman): There's a bug here. If the target is invalid the ID will not be | 2175 // TODO(gman): There's a bug here. If the target is invalid the ID will not be |
| 2375 // used even though it's marked it as used here. | 2176 // used even though it's marked it as used here. |
| 2376 id_handlers_[id_namespaces::kRenderbuffers]->MarkAsUsedForBind(renderbuffer); | 2177 GetIdHandler(id_namespaces::kRenderbuffers)->MarkAsUsedForBind(renderbuffer); |
| 2377 } | 2178 } |
| 2378 | 2179 |
| 2379 void GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) { | 2180 void GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) { |
| 2380 // TODO(gman): See note #1 above. | 2181 // TODO(gman): See note #1 above. |
| 2381 TextureUnit& unit = texture_units_[active_texture_unit_]; | 2182 TextureUnit& unit = texture_units_[active_texture_unit_]; |
| 2382 switch (target) { | 2183 switch (target) { |
| 2383 case GL_TEXTURE_2D: | 2184 case GL_TEXTURE_2D: |
| 2384 unit.bound_texture_2d = texture; | 2185 unit.bound_texture_2d = texture; |
| 2385 break; | 2186 break; |
| 2386 case GL_TEXTURE_CUBE_MAP: | 2187 case GL_TEXTURE_CUBE_MAP: |
| 2387 unit.bound_texture_cube_map = texture; | 2188 unit.bound_texture_cube_map = texture; |
| 2388 break; | 2189 break; |
| 2389 default: | 2190 default: |
| 2390 break; | 2191 break; |
| 2391 } | 2192 } |
| 2392 // TODO(gman): There's a bug here. If the target is invalid the ID will not be | 2193 // TODO(gman): There's a bug here. If the target is invalid the ID will not be |
| 2393 // used. even though it's marked it as used here. | 2194 // used. even though it's marked it as used here. |
| 2394 id_handlers_[id_namespaces::kTextures]->MarkAsUsedForBind(texture); | 2195 GetIdHandler(id_namespaces::kTextures)->MarkAsUsedForBind(texture); |
| 2395 } | 2196 } |
| 2396 | 2197 |
| 2397 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 2198 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 2398 bool GLES2Implementation::IsBufferReservedId(GLuint id) { | 2199 bool GLES2Implementation::IsBufferReservedId(GLuint id) { |
| 2399 for (size_t ii = 0; ii < arraysize(reserved_ids_); ++ii) { | 2200 for (size_t ii = 0; ii < arraysize(reserved_ids_); ++ii) { |
| 2400 if (id == reserved_ids_[ii]) { | 2201 if (id == reserved_ids_[ii]) { |
| 2401 return true; | 2202 return true; |
| 2402 } | 2203 } |
| 2403 } | 2204 } |
| 2404 return false; | 2205 return false; |
| 2405 } | 2206 } |
| 2406 #else | 2207 #else |
| 2407 bool GLES2Implementation::IsBufferReservedId(GLuint /* id */) { | 2208 bool GLES2Implementation::IsBufferReservedId(GLuint /* id */) { |
| 2408 return false; | 2209 return false; |
| 2409 } | 2210 } |
| 2410 #endif | 2211 #endif |
| 2411 | 2212 |
| 2412 void GLES2Implementation::DeleteBuffersHelper( | 2213 void GLES2Implementation::DeleteBuffersHelper( |
| 2413 GLsizei n, const GLuint* buffers) { | 2214 GLsizei n, const GLuint* buffers) { |
| 2414 if (!id_handlers_[id_namespaces::kBuffers]->FreeIds(n, buffers)) { | 2215 if (!GetIdHandler(id_namespaces::kBuffers)->FreeIds(this, n, buffers)) { |
| 2415 SetGLError( | 2216 SetGLError( |
| 2416 GL_INVALID_VALUE, | 2217 GL_INVALID_VALUE, |
| 2417 "glDeleteBuffers: id not created by this context."); | 2218 "glDeleteBuffers: id not created by this context."); |
| 2418 return; | 2219 return; |
| 2419 } | 2220 } |
| 2420 for (GLsizei ii = 0; ii < n; ++ii) { | 2221 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2421 if (buffers[ii] == bound_array_buffer_id_) { | 2222 if (buffers[ii] == bound_array_buffer_id_) { |
| 2422 bound_array_buffer_id_ = 0; | 2223 bound_array_buffer_id_ = 0; |
| 2423 } | 2224 } |
| 2424 if (buffers[ii] == bound_element_array_buffer_id_) { | 2225 if (buffers[ii] == bound_element_array_buffer_id_) { |
| 2425 bound_element_array_buffer_id_ = 0; | 2226 bound_element_array_buffer_id_ = 0; |
| 2426 } | 2227 } |
| 2427 } | 2228 } |
| 2428 helper_->DeleteBuffersImmediate(n, buffers); | 2229 helper_->DeleteBuffersImmediate(n, buffers); |
| 2429 } | 2230 } |
| 2430 | 2231 |
| 2431 void GLES2Implementation::DeleteFramebuffersHelper( | 2232 void GLES2Implementation::DeleteFramebuffersHelper( |
| 2432 GLsizei n, const GLuint* framebuffers) { | 2233 GLsizei n, const GLuint* framebuffers) { |
| 2433 if (!id_handlers_[id_namespaces::kFramebuffers]->FreeIds(n, framebuffers)) { | 2234 if (!GetIdHandler(id_namespaces::kFramebuffers)->FreeIds( |
| 2235 this, n, framebuffers)) { |
| 2434 SetGLError( | 2236 SetGLError( |
| 2435 GL_INVALID_VALUE, | 2237 GL_INVALID_VALUE, |
| 2436 "glDeleteFramebuffers: id not created by this context."); | 2238 "glDeleteFramebuffers: id not created by this context."); |
| 2437 return; | 2239 return; |
| 2438 } | 2240 } |
| 2439 for (GLsizei ii = 0; ii < n; ++ii) { | 2241 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2440 if (framebuffers[ii] == bound_framebuffer_) { | 2242 if (framebuffers[ii] == bound_framebuffer_) { |
| 2441 bound_framebuffer_ = 0; | 2243 bound_framebuffer_ = 0; |
| 2442 } | 2244 } |
| 2443 } | 2245 } |
| 2444 helper_->DeleteFramebuffersImmediate(n, framebuffers); | 2246 helper_->DeleteFramebuffersImmediate(n, framebuffers); |
| 2445 } | 2247 } |
| 2446 | 2248 |
| 2447 void GLES2Implementation::DeleteRenderbuffersHelper( | 2249 void GLES2Implementation::DeleteRenderbuffersHelper( |
| 2448 GLsizei n, const GLuint* renderbuffers) { | 2250 GLsizei n, const GLuint* renderbuffers) { |
| 2449 if (!id_handlers_[id_namespaces::kRenderbuffers]->FreeIds(n, renderbuffers)) { | 2251 if (!GetIdHandler(id_namespaces::kRenderbuffers)->FreeIds( |
| 2252 this, n, renderbuffers)) { |
| 2450 SetGLError( | 2253 SetGLError( |
| 2451 GL_INVALID_VALUE, | 2254 GL_INVALID_VALUE, |
| 2452 "glDeleteRenderbuffers: id not created by this context."); | 2255 "glDeleteRenderbuffers: id not created by this context."); |
| 2453 return; | 2256 return; |
| 2454 } | 2257 } |
| 2455 for (GLsizei ii = 0; ii < n; ++ii) { | 2258 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2456 if (renderbuffers[ii] == bound_renderbuffer_) { | 2259 if (renderbuffers[ii] == bound_renderbuffer_) { |
| 2457 bound_renderbuffer_ = 0; | 2260 bound_renderbuffer_ = 0; |
| 2458 } | 2261 } |
| 2459 } | 2262 } |
| 2460 helper_->DeleteRenderbuffersImmediate(n, renderbuffers); | 2263 helper_->DeleteRenderbuffersImmediate(n, renderbuffers); |
| 2461 } | 2264 } |
| 2462 | 2265 |
| 2463 void GLES2Implementation::DeleteTexturesHelper( | 2266 void GLES2Implementation::DeleteTexturesHelper( |
| 2464 GLsizei n, const GLuint* textures) { | 2267 GLsizei n, const GLuint* textures) { |
| 2465 if (!id_handlers_[id_namespaces::kTextures]->FreeIds(n, textures)) { | 2268 if (!GetIdHandler(id_namespaces::kTextures)->FreeIds( |
| 2269 this, n, textures)) { |
| 2466 SetGLError( | 2270 SetGLError( |
| 2467 GL_INVALID_VALUE, | 2271 GL_INVALID_VALUE, |
| 2468 "glDeleteTextures: id not created by this context."); | 2272 "glDeleteTextures: id not created by this context."); |
| 2469 return; | 2273 return; |
| 2470 } | 2274 } |
| 2471 for (GLsizei ii = 0; ii < n; ++ii) { | 2275 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2472 for (GLint tt = 0; tt < gl_state_.max_combined_texture_image_units; ++tt) { | 2276 for (GLint tt = 0; tt < gl_state_.max_combined_texture_image_units; ++tt) { |
| 2473 TextureUnit& unit = texture_units_[active_texture_unit_]; | 2277 TextureUnit& unit = texture_units_[active_texture_unit_]; |
| 2474 if (textures[ii] == unit.bound_texture_2d) { | 2278 if (textures[ii] == unit.bound_texture_2d) { |
| 2475 unit.bound_texture_2d = 0; | 2279 unit.bound_texture_2d = 0; |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2984 helper_->PostSubBufferCHROMIUM(x, y, width, height); | 2788 helper_->PostSubBufferCHROMIUM(x, y, width, height); |
| 2985 helper_->CommandBufferHelper::Flush(); | 2789 helper_->CommandBufferHelper::Flush(); |
| 2986 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { | 2790 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { |
| 2987 helper_->WaitForToken(swap_buffers_tokens_.front()); | 2791 helper_->WaitForToken(swap_buffers_tokens_.front()); |
| 2988 swap_buffers_tokens_.pop(); | 2792 swap_buffers_tokens_.pop(); |
| 2989 } | 2793 } |
| 2990 } | 2794 } |
| 2991 | 2795 |
| 2992 void GLES2Implementation::DeleteQueriesEXTHelper( | 2796 void GLES2Implementation::DeleteQueriesEXTHelper( |
| 2993 GLsizei n, const GLuint* queries) { | 2797 GLsizei n, const GLuint* queries) { |
| 2994 if (!id_handlers_[id_namespaces::kQueries]->FreeIds(n, queries)) { | 2798 if (!GetIdHandler(id_namespaces::kQueries)->FreeIds( |
| 2799 this, n, queries)) { |
| 2995 SetGLError( | 2800 SetGLError( |
| 2996 GL_INVALID_VALUE, | 2801 GL_INVALID_VALUE, |
| 2997 "glDeleteTextures: id not created by this context."); | 2802 "glDeleteTextures: id not created by this context."); |
| 2998 return; | 2803 return; |
| 2999 } | 2804 } |
| 3000 // When you delete a query you can't mark its memory as unused until it's | 2805 // When you delete a query you can't mark its memory as unused until it's |
| 3001 // completed. | 2806 // completed. |
| 3002 // Note: If you don't do this you won't mess up the service but you will mess | 2807 // Note: If you don't do this you won't mess up the service but you will mess |
| 3003 // up yourself. | 2808 // up yourself. |
| 3004 | 2809 |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3258 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 3063 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
| 3259 } | 3064 } |
| 3260 #else | 3065 #else |
| 3261 helper_->DrawElementsInstancedANGLE( | 3066 helper_->DrawElementsInstancedANGLE( |
| 3262 mode, count, type, ToGLuint(indices), primcount); | 3067 mode, count, type, ToGLuint(indices), primcount); |
| 3263 #endif | 3068 #endif |
| 3264 } | 3069 } |
| 3265 | 3070 |
| 3266 } // namespace gles2 | 3071 } // namespace gles2 |
| 3267 } // namespace gpu | 3072 } // namespace gpu |
| OLD | NEW |