Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 7633060: Add option to not generate resources on bind in OpenGL ES (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nacl fix Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698