Index: gpu/command_buffer/client/mapped_memory.cc |
diff --git a/gpu/command_buffer/client/mapped_memory.cc b/gpu/command_buffer/client/mapped_memory.cc |
index 6d57af4ed57204e62156f215d3af59143b658da7..7c5864a4710e64e03296d6829fef1f1ad9170fbb 100644 |
--- a/gpu/command_buffer/client/mapped_memory.cc |
+++ b/gpu/command_buffer/client/mapped_memory.cc |
@@ -30,7 +30,8 @@ MappedMemoryManager::MappedMemoryManager(CommandBufferHelper* helper, |
helper_(helper), |
poll_callback_(poll_callback), |
allocated_memory_(0), |
- max_free_bytes_(unused_memory_reclaim_limit) { |
+ max_free_bytes_(unused_memory_reclaim_limit), |
+ max_allocated_bytes_(kNoLimit) { |
} |
MappedMemoryManager::~MappedMemoryManager() { |
@@ -81,6 +82,11 @@ void* MappedMemoryManager::Alloc( |
} |
} |
+ if (max_allocated_bytes_ != kNoLimit && |
+ (allocated_memory_ + size) > max_allocated_bytes_) { |
+ return nullptr; |
+ } |
+ |
// Make a new chunk to satisfy the request. |
CommandBuffer* cmd_buf = helper_->command_buffer(); |
unsigned int chunk_size = |
@@ -140,4 +146,26 @@ void MappedMemoryManager::FreeUnused() { |
} |
} |
+void ScopedMappedMemoryPtr::Release() { |
+ if (buffer_) { |
+ mapped_memory_manager_->FreePendingToken(buffer_, helper_->InsertToken()); |
+ buffer_ = nullptr; |
+ size_ = 0; |
+ shm_id_ = 0; |
+ shm_offset_ = 0; |
+ |
+ if (flush_after_release_) |
+ helper_->CommandBufferHelper::Flush(); |
+ } |
+} |
+ |
+void ScopedMappedMemoryPtr::Reset(uint32_t new_size) { |
+ Release(); |
+ |
+ if (new_size) { |
+ buffer_ = mapped_memory_manager_->Alloc(new_size, &shm_id_, &shm_offset_); |
+ size_ = buffer_ ? new_size : 0; |
+ } |
+} |
+ |
} // namespace gpu |