| 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 |