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> | 7 #include <memory> |
8 | 8 |
9 #include "base/allocator/allocator_extension.h" | |
9 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
10 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
11 #include "base/threading/thread_task_runner_handle.h" | 12 #include "base/threading/thread_task_runner_handle.h" |
12 #include "base/trace_event/memory_dump_manager.h" | 13 #include "base/trace_event/memory_dump_manager.h" |
13 #include "cc/base/container_util.h" | 14 #include "cc/base/container_util.h" |
14 #include "cc/debug/traced_value.h" | 15 #include "cc/debug/traced_value.h" |
15 #include "cc/resources/scoped_resource.h" | 16 #include "cc/resources/scoped_resource.h" |
16 #include "gpu/command_buffer/client/gles2_interface.h" | 17 #include "gpu/command_buffer/client/gles2_interface.h" |
17 | 18 |
18 namespace cc { | 19 namespace cc { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
134 free_staging_buffer_usage_in_bytes_(0), | 135 free_staging_buffer_usage_in_bytes_(0), |
135 staging_buffer_expiration_delay_( | 136 staging_buffer_expiration_delay_( |
136 base::TimeDelta::FromMilliseconds(kStagingBufferExpirationDelayMs)), | 137 base::TimeDelta::FromMilliseconds(kStagingBufferExpirationDelayMs)), |
137 reduce_memory_usage_pending_(false), | 138 reduce_memory_usage_pending_(false), |
138 weak_ptr_factory_(this) { | 139 weak_ptr_factory_(this) { |
139 DCHECK(worker_context_provider_); | 140 DCHECK(worker_context_provider_); |
140 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 141 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
141 this, "cc::StagingBufferPool", base::ThreadTaskRunnerHandle::Get()); | 142 this, "cc::StagingBufferPool", base::ThreadTaskRunnerHandle::Get()); |
142 reduce_memory_usage_callback_ = base::Bind( | 143 reduce_memory_usage_callback_ = base::Bind( |
143 &StagingBufferPool::ReduceMemoryUsage, weak_ptr_factory_.GetWeakPtr()); | 144 &StagingBufferPool::ReduceMemoryUsage, weak_ptr_factory_.GetWeakPtr()); |
145 | |
146 memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind( | |
147 &StagingBufferPool::OnMemoryPressure, base::Unretained(this)))); | |
144 } | 148 } |
145 | 149 |
146 StagingBufferPool::~StagingBufferPool() { | 150 StagingBufferPool::~StagingBufferPool() { |
147 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 151 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
148 this); | 152 this); |
149 } | 153 } |
150 | 154 |
151 void StagingBufferPool::Shutdown() { | 155 void StagingBufferPool::Shutdown() { |
152 base::AutoLock lock(lock_); | 156 base::AutoLock lock(lock_); |
153 if (buffers_.empty()) | 157 if (buffers_.empty()) |
(...skipping 25 matching lines...) Expand all Loading... | |
179 [buffer](const std::unique_ptr<StagingBuffer>& b) { | 183 [buffer](const std::unique_ptr<StagingBuffer>& b) { |
180 return b.get() == buffer; | 184 return b.get() == buffer; |
181 }); | 185 }); |
182 buffer->OnMemoryDump(pmd, buffer->format, | 186 buffer->OnMemoryDump(pmd, buffer->format, |
183 in_free_buffers != free_buffers_.end()); | 187 in_free_buffers != free_buffers_.end()); |
184 } | 188 } |
185 | 189 |
186 return true; | 190 return true; |
187 } | 191 } |
188 | 192 |
193 void StagingBufferPool::OnMemoryPressure( | |
194 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { | |
195 base::AutoLock lock(lock_); | |
196 if (buffers_.empty()) | |
197 return; | |
198 | |
199 ReleaseBuffersNotUsedSince(base::TimeTicks() + base::TimeDelta::Max()); | |
200 base::allocator::ReleaseFreeMemory(); | |
esprehn
2016/08/05 23:00:57
is this is very strange inside the cc/raster code.
tasak
2016/08/08 04:47:36
Acknowledged.
Yeah, I agree that MemoryCoordinato
| |
201 } | |
202 | |
189 void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer, | 203 void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer, |
190 ResourceFormat format) { | 204 ResourceFormat format) { |
191 lock_.AssertAcquired(); | 205 lock_.AssertAcquired(); |
192 | 206 |
193 DCHECK(buffers_.find(staging_buffer) == buffers_.end()); | 207 DCHECK(buffers_.find(staging_buffer) == buffers_.end()); |
194 buffers_.insert(staging_buffer); | 208 buffers_.insert(staging_buffer); |
195 int buffer_usage_in_bytes = | 209 int buffer_usage_in_bytes = |
196 ResourceUtil::UncheckedSizeInBytes<int>(staging_buffer->size, format); | 210 ResourceUtil::UncheckedSizeInBytes<int>(staging_buffer->size, format); |
197 staging_buffer_usage_in_bytes_ += buffer_usage_in_bytes; | 211 staging_buffer_usage_in_bytes_ += buffer_usage_in_bytes; |
198 } | 212 } |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
403 return; | 417 return; |
404 | 418 |
405 busy_buffers_.front()->DestroyGLResources(gl); | 419 busy_buffers_.front()->DestroyGLResources(gl); |
406 RemoveStagingBuffer(busy_buffers_.front().get()); | 420 RemoveStagingBuffer(busy_buffers_.front().get()); |
407 busy_buffers_.pop_front(); | 421 busy_buffers_.pop_front(); |
408 } | 422 } |
409 } | 423 } |
410 } | 424 } |
411 | 425 |
412 } // namespace cc | 426 } // namespace cc |
OLD | NEW |