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 |