Index: cc/raster/one_copy_tile_task_worker_pool.cc |
diff --git a/cc/raster/one_copy_tile_task_worker_pool.cc b/cc/raster/one_copy_tile_task_worker_pool.cc |
index dd8937c483d2cb6b778c6dd03e6b674cbb0b64ec..71cc4c119d995442bb2b1a82fcc65b0dd32fa04e 100644 |
--- a/cc/raster/one_copy_tile_task_worker_pool.cc |
+++ b/cc/raster/one_copy_tile_task_worker_pool.cc |
@@ -33,8 +33,7 @@ class RasterBufferImpl : public RasterBuffer { |
resource_provider_(resource_provider), |
resource_pool_(resource_pool), |
output_resource_(output_resource), |
- raster_content_id_(0), |
- sequence_(0) { |
+ raster_content_id_(0) { |
if (worker_pool->have_persistent_gpu_memory_buffers() && |
previous_content_id) { |
raster_resource_ = |
@@ -58,11 +57,6 @@ class RasterBufferImpl : public RasterBuffer { |
// Release write lock in case a copy was never scheduled. |
lock_.reset(); |
- // Make sure any scheduled copy operations are issued before we release the |
- // raster resource. |
- if (sequence_) |
- worker_pool_->AdvanceLastIssuedCopyTo(sequence_); |
- |
// Return resources to pool so they can be used by another RasterBuffer |
// instance. |
resource_pool_->ReleaseResource(raster_resource_.Pass(), |
@@ -78,7 +72,7 @@ class RasterBufferImpl : public RasterBuffer { |
// If there's a raster_content_id_, we are reusing a resource with that |
// content id. |
bool reusing_raster_resource = raster_content_id_ != 0; |
- sequence_ = worker_pool_->PlaybackAndScheduleCopyOnWorkerThread( |
+ worker_pool_->PlaybackAndCopyOnWorkerThread( |
reusing_raster_resource, lock_.Pass(), raster_resource_.get(), |
output_resource_, raster_source, raster_full_rect, raster_dirty_rect, |
scale); |
@@ -94,21 +88,10 @@ class RasterBufferImpl : public RasterBuffer { |
uint64_t raster_content_id_; |
scoped_ptr<ScopedResource> raster_resource_; |
scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> lock_; |
- CopySequenceNumber sequence_; |
DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
}; |
-// Number of in-flight copy operations to allow. |
-const int kMaxCopyOperations = 32; |
reveman
2015/06/09 13:30:55
we still need this
sohanjg
2015/06/09 15:59:23
i cant find it being used in this file, now that w
reveman
2015/06/09 18:00:30
We still want to limit the number of copy operatio
sohanjg
2015/06/11 13:32:25
Acknowledged.
|
- |
-// Delay been checking for copy operations to complete. |
-const int kCheckForCompletedCopyOperationsTickRateMs = 1; |
- |
-// Number of failed attempts to allow before we perform a check that will |
-// wait for copy operations to complete if needed. |
-const int kFailedAttemptsBeforeWaitIfNeeded = 256; |
- |
} // namespace |
OneCopyTileTaskWorkerPool::CopyOperation::CopyOperation( |
@@ -153,14 +136,7 @@ OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( |
resource_pool_(resource_pool), |
max_bytes_per_copy_operation_(max_bytes_per_copy_operation), |
have_persistent_gpu_memory_buffers_(have_persistent_gpu_memory_buffers), |
- last_issued_copy_operation_(0), |
- last_flushed_copy_operation_(0), |
lock_(), |
- copy_operation_count_cv_(&lock_), |
- bytes_scheduled_since_last_flush_(0), |
- issued_copy_operation_count_(0), |
- next_copy_operation_sequence_(1), |
- check_for_completed_copy_operations_pending_(false), |
shutdown_(false), |
weak_ptr_factory_(this), |
task_set_finished_weak_ptr_factory_(this) { |
@@ -186,7 +162,6 @@ void OneCopyTileTaskWorkerPool::Shutdown() { |
base::AutoLock lock(lock_); |
shutdown_ = true; |
- copy_operation_count_cv_.Signal(); |
} |
TaskGraph empty; |
@@ -309,8 +284,7 @@ void OneCopyTileTaskWorkerPool::ReleaseBufferForRaster( |
// Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
} |
-CopySequenceNumber |
-OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread( |
+void OneCopyTileTaskWorkerPool::PlaybackAndCopyOnWorkerThread( |
bool reusing_raster_resource, |
scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> |
raster_resource_write_lock, |
@@ -344,9 +318,6 @@ OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread( |
gpu_memory_buffer->Unmap(); |
} |
- base::AutoLock lock(lock_); |
- |
- CopySequenceNumber sequence = 0; |
int bytes_per_row = (BitsPerPixel(raster_resource->format()) * |
raster_resource->size().width()) / |
8; |
@@ -356,87 +327,21 @@ OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread( |
chunk_size_in_rows = MathUtil::RoundUp(chunk_size_in_rows, 4); |
int y = 0; |
int height = raster_resource->size().height(); |
+ ContextProvider* context_provider = |
+ resource_provider_->output_surface()->worker_context_provider(); |
while (y < height) { |
- int failed_attempts = 0; |
- while ((pending_copy_operations_.size() + issued_copy_operation_count_) >= |
- kMaxCopyOperations) { |
- // Ignore limit when shutdown is set. |
- if (shutdown_) |
- break; |
- |
- ++failed_attempts; |
- |
- // Schedule a check that will also wait for operations to complete |
- // after too many failed attempts. |
- bool wait_if_needed = failed_attempts > kFailedAttemptsBeforeWaitIfNeeded; |
- |
- // Schedule a check for completed copy operations if too many operations |
- // are currently in-flight. |
- ScheduleCheckForCompletedCopyOperationsWithLockAcquired(wait_if_needed); |
- |
- { |
- TRACE_EVENT0("cc", "WaitingForCopyOperationsToComplete"); |
- |
- // Wait for in-flight copy operations to drop below limit. |
- copy_operation_count_cv_.Wait(); |
- } |
- } |
- |
- // There may be more work available, so wake up another worker thread. |
- copy_operation_count_cv_.Signal(); |
- |
+ base::AutoLock context_lock(*context_provider->GetLock()); |
+ context_provider->DetachFromThread(); |
// Copy at most |chunk_size_in_rows|. |
int rows_to_copy = std::min(chunk_size_in_rows, height - y); |
DCHECK_GT(rows_to_copy, 0); |
- |
- // |raster_resource_write_lock| is passed to the first copy operation as it |
- // needs to be released before we can issue a copy. |
- pending_copy_operations_.push_back(make_scoped_ptr(new CopyOperation( |
+ IssueCopyOperations(new CopyOperation( |
reveman
2015/06/09 13:30:55
This is leaking a CopyOperations instance. IssueCo
sohanjg
2015/06/09 15:59:23
Done.
|
raster_resource_write_lock.Pass(), raster_resource, output_resource, |
- gfx::Rect(0, y, raster_resource->size().width(), rows_to_copy)))); |
+ gfx::Rect(0, y, raster_resource->size().width(), rows_to_copy))); |
y += rows_to_copy; |
- |
- // Acquire a sequence number for this copy operation. |
- sequence = next_copy_operation_sequence_++; |
- |
- // Increment |bytes_scheduled_since_last_flush_| by the amount of memory |
- // used for this copy operation. |
- bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; |
- |
- // Post task that will advance last flushed copy operation to |sequence| |
- // when |bytes_scheduled_since_last_flush_| has reached |
- // |max_bytes_per_copy_operation_|. |
- if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) { |
- task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&OneCopyTileTaskWorkerPool::AdvanceLastFlushedCopyTo, |
- weak_ptr_factory_.GetWeakPtr(), sequence)); |
- bytes_scheduled_since_last_flush_ = 0; |
- } |
+ context_provider->ContextGL()->OrderingBarrierCHROMIUM(); |
reveman
2015/06/09 13:30:55
please add comment explaining this ordering barrie
sohanjg
2015/06/09 15:59:23
Done.
|
+ context_provider->DetachFromThread(); |
} |
- |
- return sequence; |
-} |
- |
-void OneCopyTileTaskWorkerPool::AdvanceLastIssuedCopyTo( |
- CopySequenceNumber sequence) { |
- if (last_issued_copy_operation_ >= sequence) |
- return; |
- |
- IssueCopyOperations(sequence - last_issued_copy_operation_); |
- last_issued_copy_operation_ = sequence; |
-} |
- |
-void OneCopyTileTaskWorkerPool::AdvanceLastFlushedCopyTo( |
- CopySequenceNumber sequence) { |
- if (last_flushed_copy_operation_ >= sequence) |
- return; |
- |
- AdvanceLastIssuedCopyTo(sequence); |
- |
- // Flush all issued copy operations. |
- context_provider_->ContextGL()->ShallowFlushCHROMIUM(); |
- last_flushed_copy_operation_ = last_issued_copy_operation_; |
} |
void OneCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
@@ -454,90 +359,15 @@ void OneCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
client_->DidFinishRunningTileTasks(task_set); |
} |
-void OneCopyTileTaskWorkerPool::IssueCopyOperations(int64 count) { |
- TRACE_EVENT1("cc", "OneCopyTileTaskWorkerPool::IssueCopyOperations", "count", |
- count); |
+void OneCopyTileTaskWorkerPool::IssueCopyOperations( |
+ CopyOperation* copy_operation) { |
+ TRACE_EVENT0("cc", "OneCopyTileTaskWorkerPool::IssueCopyOperations"); |
- CopyOperation::Deque copy_operations; |
- |
- { |
- base::AutoLock lock(lock_); |
- |
- for (int64 i = 0; i < count; ++i) { |
- DCHECK(!pending_copy_operations_.empty()); |
- copy_operations.push_back(pending_copy_operations_.take_front()); |
- } |
- |
- // Increment |issued_copy_operation_count_| to reflect the transition of |
- // copy operations from "pending" to "issued" state. |
- issued_copy_operation_count_ += copy_operations.size(); |
- } |
- |
- while (!copy_operations.empty()) { |
- scoped_ptr<CopyOperation> copy_operation = copy_operations.take_front(); |
- |
- // Remove the write lock. |
- copy_operation->src_write_lock.reset(); |
- |
- // Copy contents of source resource to destination resource. |
- resource_provider_->CopyResource(copy_operation->src->id(), |
- copy_operation->dst->id(), |
- copy_operation->rect); |
- } |
-} |
- |
-void OneCopyTileTaskWorkerPool:: |
- ScheduleCheckForCompletedCopyOperationsWithLockAcquired( |
- bool wait_if_needed) { |
- lock_.AssertAcquired(); |
- |
- if (check_for_completed_copy_operations_pending_) |
- return; |
- |
- base::TimeTicks now = base::TimeTicks::Now(); |
- |
- // Schedule a check for completed copy operations as soon as possible but |
- // don't allow two consecutive checks to be scheduled to run less than the |
- // tick rate apart. |
- base::TimeTicks next_check_for_completed_copy_operations_time = |
- std::max(last_check_for_completed_copy_operations_time_ + |
- base::TimeDelta::FromMilliseconds( |
- kCheckForCompletedCopyOperationsTickRateMs), |
- now); |
- |
- task_runner_->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations, |
- weak_ptr_factory_.GetWeakPtr(), wait_if_needed), |
- next_check_for_completed_copy_operations_time - now); |
- |
- last_check_for_completed_copy_operations_time_ = |
- next_check_for_completed_copy_operations_time; |
- check_for_completed_copy_operations_pending_ = true; |
-} |
- |
-void OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations( |
- bool wait_if_needed) { |
- TRACE_EVENT1("cc", |
- "OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations", |
- "wait_if_needed", wait_if_needed); |
- |
- resource_pool_->CheckBusyResources(wait_if_needed); |
- |
- { |
- base::AutoLock lock(lock_); |
- |
- DCHECK(check_for_completed_copy_operations_pending_); |
- check_for_completed_copy_operations_pending_ = false; |
- |
- // The number of busy resources in the pool reflects the number of issued |
- // copy operations that have not yet completed. |
- issued_copy_operation_count_ = resource_pool_->busy_resource_count(); |
- |
- // There may be work blocked on too many in-flight copy operations, so wake |
- // up a worker thread. |
- copy_operation_count_cv_.Signal(); |
- } |
+ copy_operation->src_write_lock.reset(); |
+ // Copy contents of source resource to destination resource. |
+ resource_provider_->CopyResource(copy_operation->src->id(), |
reveman
2015/06/09 13:30:55
We can't use ResourceProvider on this thread.
sohanjg
2015/06/09 15:59:23
Done.
|
+ copy_operation->dst->id(), |
+ copy_operation->rect); |
} |
scoped_refptr<base::trace_event::ConvertableToTraceFormat> |