OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/raster/staging_buffer_pool.h" | 5 #include "cc/raster/staging_buffer_pool.h" |
6 | 6 |
| 7 #include <memory> |
| 8 |
| 9 #include "base/memory/ptr_util.h" |
7 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
8 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
9 #include "base/trace_event/memory_dump_manager.h" | 12 #include "base/trace_event/memory_dump_manager.h" |
10 #include "cc/base/container_util.h" | 13 #include "cc/base/container_util.h" |
11 #include "cc/debug/traced_value.h" | 14 #include "cc/debug/traced_value.h" |
12 #include "cc/resources/scoped_resource.h" | 15 #include "cc/resources/scoped_resource.h" |
13 #include "gpu/command_buffer/client/gles2_interface.h" | 16 #include "gpu/command_buffer/client/gles2_interface.h" |
14 | 17 |
15 namespace cc { | 18 namespace cc { |
16 namespace { | 19 namespace { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 gfx::GetGpuMemoryBufferGUIDForTracing(tracing_process_id, buffer_id); | 114 gfx::GetGpuMemoryBufferGUIDForTracing(tracing_process_id, buffer_id); |
112 pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid); | 115 pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid); |
113 | 116 |
114 // By creating an edge with a higher |importance| (w.r.t. browser-side dumps) | 117 // By creating an edge with a higher |importance| (w.r.t. browser-side dumps) |
115 // the tracing UI will account the effective size of the buffer to the child. | 118 // the tracing UI will account the effective size of the buffer to the child. |
116 const int kImportance = 2; | 119 const int kImportance = 2; |
117 pmd->AddOwnershipEdge(buffer_dump->guid(), shared_buffer_guid, kImportance); | 120 pmd->AddOwnershipEdge(buffer_dump->guid(), shared_buffer_guid, kImportance); |
118 } | 121 } |
119 | 122 |
120 // static | 123 // static |
121 scoped_ptr<StagingBufferPool> StagingBufferPool::Create( | 124 std::unique_ptr<StagingBufferPool> StagingBufferPool::Create( |
122 base::SequencedTaskRunner* task_runner, | 125 base::SequencedTaskRunner* task_runner, |
123 ResourceProvider* resource_provider, | 126 ResourceProvider* resource_provider, |
124 bool use_partial_raster, | 127 bool use_partial_raster, |
125 int max_staging_buffer_usage_in_bytes) { | 128 int max_staging_buffer_usage_in_bytes) { |
126 return make_scoped_ptr<StagingBufferPool>( | 129 return base::WrapUnique( |
127 new StagingBufferPool(task_runner, resource_provider, use_partial_raster, | 130 new StagingBufferPool(task_runner, resource_provider, use_partial_raster, |
128 max_staging_buffer_usage_in_bytes)); | 131 max_staging_buffer_usage_in_bytes)); |
129 } | 132 } |
130 | 133 |
131 StagingBufferPool::StagingBufferPool(base::SequencedTaskRunner* task_runner, | 134 StagingBufferPool::StagingBufferPool(base::SequencedTaskRunner* task_runner, |
132 ResourceProvider* resource_provider, | 135 ResourceProvider* resource_provider, |
133 bool use_partial_raster, | 136 bool use_partial_raster, |
134 int max_staging_buffer_usage_in_bytes) | 137 int max_staging_buffer_usage_in_bytes) |
135 : task_runner_(task_runner), | 138 : task_runner_(task_runner), |
136 resource_provider_(resource_provider), | 139 resource_provider_(resource_provider), |
(...skipping 20 matching lines...) Expand all Loading... |
157 base::AutoLock lock(lock_); | 160 base::AutoLock lock(lock_); |
158 if (buffers_.empty()) | 161 if (buffers_.empty()) |
159 return; | 162 return; |
160 | 163 |
161 ReleaseBuffersNotUsedSince(base::TimeTicks() + base::TimeDelta::Max()); | 164 ReleaseBuffersNotUsedSince(base::TimeTicks() + base::TimeDelta::Max()); |
162 DCHECK_EQ(staging_buffer_usage_in_bytes_, 0); | 165 DCHECK_EQ(staging_buffer_usage_in_bytes_, 0); |
163 DCHECK_EQ(free_staging_buffer_usage_in_bytes_, 0); | 166 DCHECK_EQ(free_staging_buffer_usage_in_bytes_, 0); |
164 } | 167 } |
165 | 168 |
166 void StagingBufferPool::ReleaseStagingBuffer( | 169 void StagingBufferPool::ReleaseStagingBuffer( |
167 scoped_ptr<StagingBuffer> staging_buffer) { | 170 std::unique_ptr<StagingBuffer> staging_buffer) { |
168 base::AutoLock lock(lock_); | 171 base::AutoLock lock(lock_); |
169 | 172 |
170 staging_buffer->last_usage = base::TimeTicks::Now(); | 173 staging_buffer->last_usage = base::TimeTicks::Now(); |
171 busy_buffers_.push_back(std::move(staging_buffer)); | 174 busy_buffers_.push_back(std::move(staging_buffer)); |
172 | 175 |
173 ScheduleReduceMemoryUsage(); | 176 ScheduleReduceMemoryUsage(); |
174 } | 177 } |
175 | 178 |
176 bool StagingBufferPool::OnMemoryDump( | 179 bool StagingBufferPool::OnMemoryDump( |
177 const base::trace_event::MemoryDumpArgs& args, | 180 const base::trace_event::MemoryDumpArgs& args, |
178 base::trace_event::ProcessMemoryDump* pmd) { | 181 base::trace_event::ProcessMemoryDump* pmd) { |
179 base::AutoLock lock(lock_); | 182 base::AutoLock lock(lock_); |
180 | 183 |
181 for (const auto* buffer : buffers_) { | 184 for (const auto* buffer : buffers_) { |
182 auto in_free_buffers = | 185 auto in_free_buffers = |
183 std::find_if(free_buffers_.begin(), free_buffers_.end(), | 186 std::find_if(free_buffers_.begin(), free_buffers_.end(), |
184 [buffer](const scoped_ptr<StagingBuffer>& b) { | 187 [buffer](const std::unique_ptr<StagingBuffer>& b) { |
185 return b.get() == buffer; | 188 return b.get() == buffer; |
186 }); | 189 }); |
187 buffer->OnMemoryDump(pmd, buffer->format, | 190 buffer->OnMemoryDump(pmd, buffer->format, |
188 in_free_buffers != free_buffers_.end()); | 191 in_free_buffers != free_buffers_.end()); |
189 } | 192 } |
190 | 193 |
191 return true; | 194 return true; |
192 } | 195 } |
193 | 196 |
194 void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer, | 197 void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 void StagingBufferPool::MarkStagingBufferAsBusy( | 229 void StagingBufferPool::MarkStagingBufferAsBusy( |
227 const StagingBuffer* staging_buffer) { | 230 const StagingBuffer* staging_buffer) { |
228 lock_.AssertAcquired(); | 231 lock_.AssertAcquired(); |
229 | 232 |
230 int buffer_usage_in_bytes = ResourceUtil::UncheckedSizeInBytes<int>( | 233 int buffer_usage_in_bytes = ResourceUtil::UncheckedSizeInBytes<int>( |
231 staging_buffer->size, staging_buffer->format); | 234 staging_buffer->size, staging_buffer->format); |
232 DCHECK_GE(free_staging_buffer_usage_in_bytes_, buffer_usage_in_bytes); | 235 DCHECK_GE(free_staging_buffer_usage_in_bytes_, buffer_usage_in_bytes); |
233 free_staging_buffer_usage_in_bytes_ -= buffer_usage_in_bytes; | 236 free_staging_buffer_usage_in_bytes_ -= buffer_usage_in_bytes; |
234 } | 237 } |
235 | 238 |
236 scoped_ptr<StagingBuffer> StagingBufferPool::AcquireStagingBuffer( | 239 std::unique_ptr<StagingBuffer> StagingBufferPool::AcquireStagingBuffer( |
237 const Resource* resource, | 240 const Resource* resource, |
238 uint64_t previous_content_id) { | 241 uint64_t previous_content_id) { |
239 base::AutoLock lock(lock_); | 242 base::AutoLock lock(lock_); |
240 | 243 |
241 scoped_ptr<StagingBuffer> staging_buffer; | 244 std::unique_ptr<StagingBuffer> staging_buffer; |
242 | 245 |
243 ContextProvider* context_provider = | 246 ContextProvider* context_provider = |
244 resource_provider_->output_surface()->worker_context_provider(); | 247 resource_provider_->output_surface()->worker_context_provider(); |
245 DCHECK(context_provider); | 248 DCHECK(context_provider); |
246 | 249 |
247 ContextProvider::ScopedContextLock scoped_context(context_provider); | 250 ContextProvider::ScopedContextLock scoped_context(context_provider); |
248 | 251 |
249 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); | 252 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
250 DCHECK(gl); | 253 DCHECK(gl); |
251 | 254 |
(...skipping 28 matching lines...) Expand all Loading... |
280 free_buffers_.push_back(PopFront(&busy_buffers_)); | 283 free_buffers_.push_back(PopFront(&busy_buffers_)); |
281 } | 284 } |
282 } | 285 } |
283 } | 286 } |
284 | 287 |
285 // Find a staging buffer that allows us to perform partial raster when | 288 // Find a staging buffer that allows us to perform partial raster when |
286 // using persistent GpuMemoryBuffers. | 289 // using persistent GpuMemoryBuffers. |
287 if (use_partial_raster_ && previous_content_id) { | 290 if (use_partial_raster_ && previous_content_id) { |
288 StagingBufferDeque::iterator it = std::find_if( | 291 StagingBufferDeque::iterator it = std::find_if( |
289 free_buffers_.begin(), free_buffers_.end(), | 292 free_buffers_.begin(), free_buffers_.end(), |
290 [previous_content_id](const scoped_ptr<StagingBuffer>& buffer) { | 293 [previous_content_id](const std::unique_ptr<StagingBuffer>& buffer) { |
291 return buffer->content_id == previous_content_id; | 294 return buffer->content_id == previous_content_id; |
292 }); | 295 }); |
293 if (it != free_buffers_.end()) { | 296 if (it != free_buffers_.end()) { |
294 staging_buffer = std::move(*it); | 297 staging_buffer = std::move(*it); |
295 free_buffers_.erase(it); | 298 free_buffers_.erase(it); |
296 MarkStagingBufferAsBusy(staging_buffer.get()); | 299 MarkStagingBufferAsBusy(staging_buffer.get()); |
297 } | 300 } |
298 } | 301 } |
299 | 302 |
300 // Find staging buffer of correct size and format. | 303 // Find staging buffer of correct size and format. |
301 if (!staging_buffer) { | 304 if (!staging_buffer) { |
302 StagingBufferDeque::iterator it = | 305 StagingBufferDeque::iterator it = |
303 std::find_if(free_buffers_.begin(), free_buffers_.end(), | 306 std::find_if(free_buffers_.begin(), free_buffers_.end(), |
304 [resource](const scoped_ptr<StagingBuffer>& buffer) { | 307 [resource](const std::unique_ptr<StagingBuffer>& buffer) { |
305 return buffer->size == resource->size() && | 308 return buffer->size == resource->size() && |
306 buffer->format == resource->format(); | 309 buffer->format == resource->format(); |
307 }); | 310 }); |
308 if (it != free_buffers_.end()) { | 311 if (it != free_buffers_.end()) { |
309 staging_buffer = std::move(*it); | 312 staging_buffer = std::move(*it); |
310 free_buffers_.erase(it); | 313 free_buffers_.erase(it); |
311 MarkStagingBufferAsBusy(staging_buffer.get()); | 314 MarkStagingBufferAsBusy(staging_buffer.get()); |
312 } | 315 } |
313 } | 316 } |
314 | 317 |
315 // Create new staging buffer if necessary. | 318 // Create new staging buffer if necessary. |
316 if (!staging_buffer) { | 319 if (!staging_buffer) { |
317 staging_buffer = make_scoped_ptr( | 320 staging_buffer = base::WrapUnique( |
318 new StagingBuffer(resource->size(), resource->format())); | 321 new StagingBuffer(resource->size(), resource->format())); |
319 AddStagingBuffer(staging_buffer.get(), resource->format()); | 322 AddStagingBuffer(staging_buffer.get(), resource->format()); |
320 } | 323 } |
321 | 324 |
322 // Release enough free buffers to stay within the limit. | 325 // Release enough free buffers to stay within the limit. |
323 while (staging_buffer_usage_in_bytes_ > max_staging_buffer_usage_in_bytes_) { | 326 while (staging_buffer_usage_in_bytes_ > max_staging_buffer_usage_in_bytes_) { |
324 if (free_buffers_.empty()) | 327 if (free_buffers_.empty()) |
325 break; | 328 break; |
326 | 329 |
327 free_buffers_.front()->DestroyGLResources(gl); | 330 free_buffers_.front()->DestroyGLResources(gl); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 return; | 419 return; |
417 | 420 |
418 busy_buffers_.front()->DestroyGLResources(gl); | 421 busy_buffers_.front()->DestroyGLResources(gl); |
419 RemoveStagingBuffer(busy_buffers_.front().get()); | 422 RemoveStagingBuffer(busy_buffers_.front().get()); |
420 busy_buffers_.pop_front(); | 423 busy_buffers_.pop_front(); |
421 } | 424 } |
422 } | 425 } |
423 } | 426 } |
424 | 427 |
425 } // namespace cc | 428 } // namespace cc |
OLD | NEW |