diff options
Diffstat (limited to 'cc/raster/one_copy_tile_task_worker_pool.h')
-rw-r--r-- | cc/raster/one_copy_tile_task_worker_pool.h | 127 |
1 files changed, 62 insertions, 65 deletions
diff --git a/cc/raster/one_copy_tile_task_worker_pool.h b/cc/raster/one_copy_tile_task_worker_pool.h index 851f1b4..4e050b4 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.h +++ b/cc/raster/one_copy_tile_task_worker_pool.h @@ -5,12 +5,8 @@ #ifndef CC_RASTER_ONE_COPY_TILE_TASK_WORKER_POOL_H_ #define CC_RASTER_ONE_COPY_TILE_TASK_WORKER_POOL_H_ -#include <set> - #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 "base/values.h" #include "cc/base/scoped_ptr_deque.h" #include "cc/output/context_provider.h" @@ -25,20 +21,15 @@ class TracedValue; } } -namespace gpu { -namespace gles2 { -class GLES2Interface; -} -} - namespace cc { class ResourcePool; +class ScopedResource; + +typedef int64 CopySequenceNumber; -class CC_EXPORT OneCopyTileTaskWorkerPool - : public TileTaskWorkerPool, - public TileTaskRunner, - public TileTaskClient, - public base::trace_event::MemoryDumpProvider { +class CC_EXPORT OneCopyTileTaskWorkerPool : public TileTaskWorkerPool, + public TileTaskRunner, + public TileTaskClient { public: ~OneCopyTileTaskWorkerPool() override; @@ -47,9 +38,9 @@ class CC_EXPORT OneCopyTileTaskWorkerPool TaskGraphRunner* task_graph_runner, ContextProvider* context_provider, ResourceProvider* resource_provider, + ResourcePool* resource_pool, int max_copy_texture_chromium_size, - bool use_persistent_gpu_memory_buffers, - int max_staging_buffers); + bool have_persistent_gpu_memory_buffers); // Overridden from TileTaskWorkerPool: TileTaskRunner* AsTileTaskRunner() override; @@ -69,57 +60,61 @@ class CC_EXPORT OneCopyTileTaskWorkerPool uint64_t previous_content_id) override; void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override; - // Overridden from base::trace_event::MemoryDumpProvider: - bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, - base::trace_event::ProcessMemoryDump* pmd) override; - - // Playback raster source and copy result into |resource|. - void PlaybackAndCopyOnWorkerThread( - const Resource* resource, - const ResourceProvider::ScopedWriteLockGL* resource_lock, + // Playback raster source and schedule copy of |raster_resource| resource to + // |output_resource|. Returns a non-zero sequence number for this copy + // operation. + CopySequenceNumber PlaybackAndScheduleCopyOnWorkerThread( + bool reusing_raster_resource, + scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> + raster_resource_write_lock, + const Resource* raster_resource, + const Resource* output_resource, const RasterSource* raster_source, const gfx::Rect& raster_full_rect, const gfx::Rect& raster_dirty_rect, float scale, - bool include_images, - uint64_t resource_content_id, - uint64_t previous_content_id); + bool include_images); + + // Issues copy operations until |sequence| has been processed. This will + // return immediately if |sequence| has already been processed. + void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence); + + bool have_persistent_gpu_memory_buffers() const { + return have_persistent_gpu_memory_buffers_; + } protected: OneCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, + ContextProvider* context_provider, ResourceProvider* resource_provider, + ResourcePool* resource_pool, int max_copy_texture_chromium_size, - bool use_persistent_gpu_memory_buffers, - int max_staging_buffers); + bool have_persistent_gpu_memory_buffers); private: - struct StagingBuffer { - explicit StagingBuffer(const gfx::Size& size); - ~StagingBuffer(); - - void DestroyGLResources(gpu::gles2::GLES2Interface* gl); - void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, - ResourceFormat format, - bool is_free) const; - - const gfx::Size size; - scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; - base::TimeTicks last_usage; - unsigned texture_id; - unsigned image_id; - unsigned query_id; - uint64_t content_id; + struct CopyOperation { + typedef ScopedPtrDeque<CopyOperation> Deque; + + CopyOperation(scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> + src_write_lock, + const Resource* src, + const Resource* dst, + const gfx::Rect& rect); + ~CopyOperation(); + + scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> src_write_lock; + const Resource* src; + const Resource* dst; + const gfx::Rect rect; }; - scoped_ptr<StagingBuffer> AcquireStagingBuffer(const Resource* resource, - uint64_t previous_content_id); - base::TimeTicks GetUsageTimeForLRUBuffer(); - void ScheduleReduceMemoryUsage(); - void ReduceMemoryUsage(); - void ReleaseBuffersNotUsedSince(base::TimeTicks time); - void OnTaskSetFinished(TaskSet task_set); + void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence); + void IssueCopyOperations(int64 count); + void ScheduleCheckForCompletedCopyOperationsWithLockAcquired( + bool wait_if_needed); + void CheckForCompletedCopyOperations(bool wait_if_needed); scoped_refptr<base::trace_event::ConvertableToTraceFormat> StateAsValue() const; void StagingStateAsValueInto( @@ -129,29 +124,31 @@ class CC_EXPORT OneCopyTileTaskWorkerPool TaskGraphRunner* task_graph_runner_; const NamespaceToken namespace_token_; TileTaskRunnerClient* client_; - ResourceProvider* const resource_provider_; + ContextProvider* context_provider_; + ResourceProvider* resource_provider_; + ResourcePool* resource_pool_; const int max_bytes_per_copy_operation_; - const bool use_persistent_gpu_memory_buffers_; + const bool have_persistent_gpu_memory_buffers_; TaskSetCollection tasks_pending_; scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets]; + CopySequenceNumber last_issued_copy_operation_; + CopySequenceNumber last_flushed_copy_operation_; // Task graph used when scheduling tasks and vector used to gather // completed tasks. TaskGraph graph_; Task::Vector completed_tasks_; - mutable base::Lock lock_; + base::Lock lock_; // |lock_| must be acquired when accessing the following members. - using StagingBufferSet = std::set<StagingBuffer*>; - StagingBufferSet buffers_; - using StagingBufferDeque = ScopedPtrDeque<StagingBuffer>; - StagingBufferDeque free_buffers_; - StagingBufferDeque busy_buffers_; + base::ConditionVariable copy_operation_count_cv_; int bytes_scheduled_since_last_flush_; - size_t max_staging_buffers_; - const base::TimeDelta staging_buffer_expiration_delay_; - bool reduce_memory_usage_pending_; - base::Closure reduce_memory_usage_callback_; + size_t issued_copy_operation_count_; + CopyOperation::Deque pending_copy_operations_; + CopySequenceNumber next_copy_operation_sequence_; + bool check_for_completed_copy_operations_pending_; + base::TimeTicks last_check_for_completed_copy_operations_time_; + bool shutdown_; base::WeakPtrFactory<OneCopyTileTaskWorkerPool> weak_ptr_factory_; // "raster finished" tasks need their own factory as they need to be |