Index: cc/raster/staging_buffer_pool.h |
diff --git a/cc/raster/staging_buffer_pool.h b/cc/raster/staging_buffer_pool.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1b3f04604e23b7b6794ffe2f3580c8f3e4025c65 |
--- /dev/null |
+++ b/cc/raster/staging_buffer_pool.h |
@@ -0,0 +1,117 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CC_RASTER_STAGING_BUFFER_POOL_H_ |
+#define CC_RASTER_STAGING_BUFFER_POOL_H_ |
+ |
+#include <stdint.h> |
+ |
+#include <deque> |
+#include <set> |
+ |
+#include "base/macros.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/synchronization/lock.h" |
+#include "base/time/time.h" |
+#include "base/trace_event/memory_dump_provider.h" |
+#include "cc/output/context_provider.h" |
+#include "cc/resources/resource_provider.h" |
+ |
+namespace gpu { |
+namespace gles2 { |
+class GLES2Interface; |
+} |
+} |
+ |
+namespace cc { |
+class Resource; |
+class RasterSource; |
+class ResourcePool; |
+ |
+struct StagingBuffer { |
+ StagingBuffer(const gfx::Size& size, ResourceFormat format); |
+ ~StagingBuffer(); |
+ |
+ void DestroyGLResources(gpu::gles2::GLES2Interface* gl); |
+ void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, |
+ ResourceFormat format, |
+ bool is_free) const; |
+ |
+ const gfx::Size size; |
+ const ResourceFormat format; |
+ scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; |
+ base::TimeTicks last_usage; |
+ unsigned texture_id; |
+ unsigned image_id; |
+ unsigned query_id; |
+ uint64_t content_id; |
+}; |
+ |
+class CC_EXPORT StagingBufferPool |
+ : public base::trace_event::MemoryDumpProvider { |
+ public: |
+ ~StagingBufferPool() final; |
+ |
+ static scoped_ptr<StagingBufferPool> Create( |
+ base::SequencedTaskRunner* task_runner, |
+ ResourceProvider* resource_provider, |
+ bool use_partial_raster, |
+ int max_staging_buffer_usage_in_bytes); |
+ void Shutdown(); |
+ |
+ // Overridden from base::trace_event::MemoryDumpProvider: |
+ bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, |
+ base::trace_event::ProcessMemoryDump* pmd) override; |
+ |
+ scoped_ptr<StagingBuffer> AcquireStagingBuffer(const Resource* resource, |
+ uint64_t previous_content_id); |
+ void ReleaseStagingBuffer(scoped_ptr<StagingBuffer> staging_buffer); |
+ |
+ private: |
+ StagingBufferPool(base::SequencedTaskRunner* task_runner, |
+ ResourceProvider* resource_provider, |
+ bool use_partial_raster, |
+ int max_staging_buffer_usage_in_bytes); |
+ |
+ void AddStagingBuffer(const StagingBuffer* staging_buffer, |
+ ResourceFormat format); |
+ void RemoveStagingBuffer(const StagingBuffer* staging_buffer); |
+ void MarkStagingBufferAsFree(const StagingBuffer* staging_buffer); |
+ void MarkStagingBufferAsBusy(const StagingBuffer* staging_buffer); |
+ |
+ base::TimeTicks GetUsageTimeForLRUBuffer(); |
+ void ScheduleReduceMemoryUsage(); |
+ void ReduceMemoryUsage(); |
+ void ReleaseBuffersNotUsedSince(base::TimeTicks time); |
+ |
+ scoped_ptr<base::trace_event::ConvertableToTraceFormat> StateAsValue() const; |
+ void StagingStateAsValueInto( |
+ base::trace_event::TracedValue* staging_state) const; |
+ |
+ scoped_refptr<base::SequencedTaskRunner> task_runner_; |
+ ResourceProvider* const resource_provider_; |
+ const bool use_partial_raster_; |
+ |
+ mutable base::Lock lock_; |
+ // |lock_| must be acquired when accessing the following members. |
+ using StagingBufferSet = std::set<const StagingBuffer*>; |
+ StagingBufferSet buffers_; |
+ using StagingBufferDeque = std::deque<scoped_ptr<StagingBuffer>>; |
+ StagingBufferDeque free_buffers_; |
+ StagingBufferDeque busy_buffers_; |
+ const int max_staging_buffer_usage_in_bytes_; |
+ int staging_buffer_usage_in_bytes_; |
+ int free_staging_buffer_usage_in_bytes_; |
+ const base::TimeDelta staging_buffer_expiration_delay_; |
+ bool reduce_memory_usage_pending_; |
+ base::Closure reduce_memory_usage_callback_; |
+ |
+ base::WeakPtrFactory<StagingBufferPool> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(StagingBufferPool); |
+}; |
+ |
+} // namespace cc |
+ |
+#endif // CC_RASTER_STAGING_BUFFER_POOL_H_ |