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

Side by Side Diff: cc/resources/resource_provider.cc

Issue 2751953003: cc: Remove redundant BufferIdAllocator (Closed)
Patch Set: cc: Remove redundant BufferIdAllocator Created 3 years, 9 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
« no previous file with comments | « cc/resources/resource_provider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 #include "cc/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 30 matching lines...) Expand all
41 #include "ui/gfx/geometry/rect.h" 41 #include "ui/gfx/geometry/rect.h"
42 #include "ui/gfx/geometry/vector2d.h" 42 #include "ui/gfx/geometry/vector2d.h"
43 #include "ui/gfx/gpu_memory_buffer_tracing.h" 43 #include "ui/gfx/gpu_memory_buffer_tracing.h"
44 #include "ui/gfx/icc_profile.h" 44 #include "ui/gfx/icc_profile.h"
45 #include "ui/gl/trace_util.h" 45 #include "ui/gl/trace_util.h"
46 46
47 using gpu::gles2::GLES2Interface; 47 using gpu::gles2::GLES2Interface;
48 48
49 namespace cc { 49 namespace cc {
50 50
51 class IdAllocator { 51 class TextureIdAllocator {
52 public: 52 public:
53 virtual ~IdAllocator() {} 53 TextureIdAllocator(GLES2Interface* gl,
54 54 size_t texture_id_allocation_chunk_size)
55 virtual GLuint NextId() = 0;
56
57 protected:
58 IdAllocator(GLES2Interface* gl, size_t id_allocation_chunk_size)
59 : gl_(gl), 55 : gl_(gl),
60 id_allocation_chunk_size_(id_allocation_chunk_size), 56 id_allocation_chunk_size_(texture_id_allocation_chunk_size),
61 ids_(new GLuint[id_allocation_chunk_size]), 57 ids_(new GLuint[texture_id_allocation_chunk_size]),
62 next_id_index_(id_allocation_chunk_size) { 58 next_id_index_(texture_id_allocation_chunk_size) {
63 DCHECK(id_allocation_chunk_size_); 59 DCHECK(id_allocation_chunk_size_);
64 DCHECK_LE(id_allocation_chunk_size_, 60 DCHECK_LE(id_allocation_chunk_size_,
65 static_cast<size_t>(std::numeric_limits<int>::max())); 61 static_cast<size_t>(std::numeric_limits<int>::max()));
66 } 62 }
67 63
64 ~TextureIdAllocator() {
65 gl_->DeleteTextures(
66 static_cast<int>(id_allocation_chunk_size_ - next_id_index_),
67 ids_.get() + next_id_index_);
68 }
69
70 GLuint NextId() {
71 if (next_id_index_ == id_allocation_chunk_size_) {
72 gl_->GenTextures(static_cast<int>(id_allocation_chunk_size_), ids_.get());
73 next_id_index_ = 0;
74 }
75
76 return ids_[next_id_index_++];
77 }
78
79 private:
68 GLES2Interface* gl_; 80 GLES2Interface* gl_;
69 const size_t id_allocation_chunk_size_; 81 const size_t id_allocation_chunk_size_;
70 std::unique_ptr<GLuint[]> ids_; 82 std::unique_ptr<GLuint[]> ids_;
71 size_t next_id_index_; 83 size_t next_id_index_;
84
85 DISALLOW_COPY_AND_ASSIGN(TextureIdAllocator);
72 }; 86 };
73 87
74 namespace { 88 namespace {
75 89
76 bool IsGpuResourceType(ResourceProvider::ResourceType type) { 90 bool IsGpuResourceType(ResourceProvider::ResourceType type) {
77 return type != ResourceProvider::RESOURCE_TYPE_BITMAP; 91 return type != ResourceProvider::RESOURCE_TYPE_BITMAP;
78 } 92 }
79 93
80 GLenum TextureToStorageFormat(ResourceFormat format) { 94 GLenum TextureToStorageFormat(ResourceFormat format) {
81 GLenum storage_format = GL_RGBA8_OES; 95 GLenum storage_format = GL_RGBA8_OES;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 // Active unit being GL_TEXTURE0 is effectively the ground state. 166 // Active unit being GL_TEXTURE0 is effectively the ground state.
153 if (unit_ != GL_TEXTURE0) 167 if (unit_ != GL_TEXTURE0)
154 gl_->ActiveTexture(GL_TEXTURE0); 168 gl_->ActiveTexture(GL_TEXTURE0);
155 } 169 }
156 170
157 private: 171 private:
158 GLES2Interface* gl_; 172 GLES2Interface* gl_;
159 GLenum unit_; 173 GLenum unit_;
160 }; 174 };
161 175
162 class TextureIdAllocator : public IdAllocator {
163 public:
164 TextureIdAllocator(GLES2Interface* gl,
165 size_t texture_id_allocation_chunk_size)
166 : IdAllocator(gl, texture_id_allocation_chunk_size) {}
167 ~TextureIdAllocator() override {
168 gl_->DeleteTextures(
169 static_cast<int>(id_allocation_chunk_size_ - next_id_index_),
170 ids_.get() + next_id_index_);
171 }
172
173 // Overridden from IdAllocator:
174 GLuint NextId() override {
175 if (next_id_index_ == id_allocation_chunk_size_) {
176 gl_->GenTextures(static_cast<int>(id_allocation_chunk_size_), ids_.get());
177 next_id_index_ = 0;
178 }
179
180 return ids_[next_id_index_++];
181 }
182
183 private:
184 DISALLOW_COPY_AND_ASSIGN(TextureIdAllocator);
185 };
186
187 class BufferIdAllocator : public IdAllocator {
188 public:
189 BufferIdAllocator(GLES2Interface* gl, size_t buffer_id_allocation_chunk_size)
190 : IdAllocator(gl, buffer_id_allocation_chunk_size) {}
191 ~BufferIdAllocator() override {
192 gl_->DeleteBuffers(
193 static_cast<int>(id_allocation_chunk_size_ - next_id_index_),
194 ids_.get() + next_id_index_);
195 }
196
197 // Overridden from IdAllocator:
198 GLuint NextId() override {
199 if (next_id_index_ == id_allocation_chunk_size_) {
200 gl_->GenBuffers(static_cast<int>(id_allocation_chunk_size_), ids_.get());
201 next_id_index_ = 0;
202 }
203
204 return ids_[next_id_index_++];
205 }
206
207 private:
208 DISALLOW_COPY_AND_ASSIGN(BufferIdAllocator);
209 };
210
211 // Generates process-unique IDs to use for tracing a ResourceProvider's 176 // Generates process-unique IDs to use for tracing a ResourceProvider's
212 // resources. 177 // resources.
213 base::StaticAtomicSequenceNumber g_next_resource_provider_tracing_id; 178 base::StaticAtomicSequenceNumber g_next_resource_provider_tracing_id;
214 179
215 } // namespace 180 } // namespace
216 181
217 ResourceProvider::Resource::~Resource() {} 182 ResourceProvider::Resource::~Resource() {}
218 183
219 ResourceProvider::Resource::Resource(GLuint texture_id, 184 ResourceProvider::Resource::Resource(GLuint texture_id,
220 const gfx::Size& size, 185 const gfx::Size& size,
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 // TODO(ericrk): Get this working in Android Webview. crbug.com/517156 445 // TODO(ericrk): Get this working in Android Webview. crbug.com/517156
481 if (base::ThreadTaskRunnerHandle::IsSet()) { 446 if (base::ThreadTaskRunnerHandle::IsSet()) {
482 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( 447 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
483 this, "cc::ResourceProvider", base::ThreadTaskRunnerHandle::Get()); 448 this, "cc::ResourceProvider", base::ThreadTaskRunnerHandle::Get());
484 } 449 }
485 450
486 if (!compositor_context_provider) 451 if (!compositor_context_provider)
487 return; 452 return;
488 453
489 DCHECK(!texture_id_allocator_); 454 DCHECK(!texture_id_allocator_);
490 DCHECK(!buffer_id_allocator_);
491 GLES2Interface* gl = ContextGL(); 455 GLES2Interface* gl = ContextGL();
492 texture_id_allocator_.reset( 456 texture_id_allocator_.reset(
493 new TextureIdAllocator(gl, id_allocation_chunk_size)); 457 new TextureIdAllocator(gl, id_allocation_chunk_size));
494 buffer_id_allocator_.reset(
495 new BufferIdAllocator(gl, id_allocation_chunk_size));
496 } 458 }
497 459
498 ResourceProvider::~ResourceProvider() { 460 ResourceProvider::~ResourceProvider() {
499 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( 461 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
500 this); 462 this);
501 463
502 while (!children_.empty()) 464 while (!children_.empty())
503 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN); 465 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN);
504 while (!resources_.empty()) 466 while (!resources_.empty())
505 DeleteResourceInternal(resources_.begin(), FOR_SHUTDOWN); 467 DeleteResourceInternal(resources_.begin(), FOR_SHUTDOWN);
506 468
507 GLES2Interface* gl = ContextGL(); 469 GLES2Interface* gl = ContextGL();
508 if (!IsGpuResourceType(settings_.default_resource_type)) { 470 if (!IsGpuResourceType(settings_.default_resource_type)) {
509 // We are not in GL mode, but double check before returning. 471 // We are not in GL mode, but double check before returning.
510 DCHECK(!gl); 472 DCHECK(!gl);
511 return; 473 return;
512 } 474 }
513 475
514 DCHECK(gl); 476 DCHECK(gl);
515 #if DCHECK_IS_ON() 477 #if DCHECK_IS_ON()
516 // Check that all GL resources has been deleted. 478 // Check that all GL resources has been deleted.
517 for (ResourceMap::const_iterator itr = resources_.begin(); 479 for (ResourceMap::const_iterator itr = resources_.begin();
518 itr != resources_.end(); ++itr) { 480 itr != resources_.end(); ++itr) {
519 DCHECK(!IsGpuResourceType(itr->second.type)); 481 DCHECK(!IsGpuResourceType(itr->second.type));
520 } 482 }
521 #endif // DCHECK_IS_ON() 483 #endif // DCHECK_IS_ON()
522 484
523 texture_id_allocator_ = nullptr; 485 texture_id_allocator_ = nullptr;
524 buffer_id_allocator_ = nullptr;
525 gl->Finish(); 486 gl->Finish();
526 } 487 }
527 488
528 bool ResourceProvider::IsResourceFormatSupported(ResourceFormat format) const { 489 bool ResourceProvider::IsResourceFormatSupported(ResourceFormat format) const {
529 gpu::Capabilities caps; 490 gpu::Capabilities caps;
530 if (compositor_context_provider_) 491 if (compositor_context_provider_)
531 caps = compositor_context_provider_->ContextCapabilities(); 492 caps = compositor_context_provider_->ContextCapabilities();
532 493
533 switch (format) { 494 switch (format) {
534 case ALPHA_8: 495 case ALPHA_8:
(...skipping 1652 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 2148
2188 const int kImportance = 2; 2149 const int kImportance = 2;
2189 pmd->CreateSharedGlobalAllocatorDump(guid); 2150 pmd->CreateSharedGlobalAllocatorDump(guid);
2190 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); 2151 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
2191 } 2152 }
2192 2153
2193 return true; 2154 return true;
2194 } 2155 }
2195 2156
2196 } // namespace cc 2157 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/resource_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698