Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: cc/raster/one_copy_tile_task_worker_pool.cc

Issue 1139063002: cc: Partial tile update for one-copy raster. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: monocle: slightlylessstruct Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/one_copy_tile_task_worker_pool.h" 5 #include "cc/raster/one_copy_tile_task_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "base/trace_event/trace_event_argument.h" 12 #include "base/trace_event/trace_event_argument.h"
13 #include "cc/debug/traced_value.h" 13 #include "cc/debug/traced_value.h"
14 #include "cc/raster/raster_buffer.h" 14 #include "cc/raster/raster_buffer.h"
15 #include "cc/resources/resource_pool.h" 15 #include "cc/resources/resource_pool.h"
16 #include "cc/resources/scoped_resource.h" 16 #include "cc/resources/scoped_resource.h"
17 #include "gpu/command_buffer/client/gles2_interface.h" 17 #include "gpu/command_buffer/client/gles2_interface.h"
18 #include "ui/gfx/gpu_memory_buffer.h" 18 #include "ui/gfx/gpu_memory_buffer.h"
19 19
20 namespace cc { 20 namespace cc {
21 namespace { 21 namespace {
22 22
23 class RasterBufferImpl : public RasterBuffer { 23 class RasterBufferImpl : public RasterBuffer {
24 public: 24 public:
25 RasterBufferImpl(OneCopyTileTaskWorkerPool* worker_pool, 25 RasterBufferImpl(OneCopyTileTaskWorkerPool* worker_pool,
26 ResourceProvider* resource_provider, 26 ResourceProvider* resource_provider,
27 ResourcePool* resource_pool, 27 ResourcePool* resource_pool,
28 ResourceFormat resource_format, 28 ResourceFormat resource_format,
29 const Resource* resource) 29 const Resource* upload_resource,
30 uint64_t new_content_id,
31 uint64_t previous_content_id)
30 : worker_pool_(worker_pool), 32 : worker_pool_(worker_pool),
31 resource_provider_(resource_provider), 33 resource_provider_(resource_provider),
32 resource_pool_(resource_pool), 34 resource_pool_(resource_pool),
33 resource_(resource), 35 upload_resource_(upload_resource),
34 raster_resource_( 36 new_content_id_(new_content_id),
35 resource_pool->AcquireResource(resource->size(), resource_format)), 37 reusing_raster_resource_(true),
36 lock_(new ResourceProvider::ScopedWriteLockGpuMemoryBuffer( 38 sequence_(0) {
37 resource_provider_, 39 if (worker_pool->have_persistent_gpu_memory_buffers() &&
38 raster_resource_->id())), 40 previous_content_id) {
39 sequence_(0) {} 41 raster_resource_ = resource_pool->TryAcquireResourceWithContentId(
42 upload_resource->size(), resource_format, previous_content_id);
43 }
44 if (!raster_resource_) {
45 raster_resource_ = resource_pool->AcquireResource(upload_resource->size(),
46 resource_format);
47 reusing_raster_resource_ = false;
48 }
49
50 lock_.reset(new ResourceProvider::ScopedWriteLockGpuMemoryBuffer(
51 resource_provider_, raster_resource_->id()));
52 }
40 53
41 ~RasterBufferImpl() override { 54 ~RasterBufferImpl() override {
55 bool did_playback = !lock_;
reveman 2015/05/28 05:07:24 you can use |sequence_| to determine if raster_res
danakj 2015/05/28 18:54:46 Done.
42 // Release write lock in case a copy was never scheduled. 56 // Release write lock in case a copy was never scheduled.
43 lock_.reset(); 57 lock_.reset();
44 58
45 // Make sure any scheduled copy operations are issued before we release the 59 // Make sure any scheduled copy operations are issued before we release the
46 // raster resource. 60 // raster resource.
47 if (sequence_) 61 if (sequence_)
48 worker_pool_->AdvanceLastIssuedCopyTo(sequence_); 62 worker_pool_->AdvanceLastIssuedCopyTo(sequence_);
49 63
50 // Return raster resource to pool so it can be used by another RasterBuffer 64 // Return resources to pool so they can be used by another RasterBuffer
51 // instance. 65 // instance.
52 if (raster_resource_) 66 uint64_t id(did_playback ? new_content_id_ : 0);
reveman 2015/05/28 05:07:24 I guess the removal of this is just a leftover fro
danakj 2015/05/28 18:54:46 Yep
53 resource_pool_->ReleaseResource(raster_resource_.Pass()); 67 resource_pool_->ReleaseResource(raster_resource_.Pass(), id);
54 } 68 }
55 69
56 // Overridden from RasterBuffer: 70 // Overridden from RasterBuffer:
57 void Playback(const RasterSource* raster_source, 71 void Playback(const RasterSource* raster_source,
58 const gfx::Rect& rect, 72 const gfx::Rect& raster_full_rect,
73 const gfx::Rect& raster_dirty_rect,
59 float scale) override { 74 float scale) override {
60 sequence_ = worker_pool_->PlaybackAndScheduleCopyOnWorkerThread( 75 sequence_ = worker_pool_->PlaybackAndScheduleCopyOnWorkerThread(
61 lock_.Pass(), raster_resource_.get(), resource_, raster_source, rect, 76 reusing_raster_resource_, lock_.Pass(), raster_resource_.get(),
77 upload_resource_, raster_source, raster_full_rect, raster_dirty_rect,
62 scale); 78 scale);
63 } 79 }
64 80
65 private: 81 private:
66 OneCopyTileTaskWorkerPool* worker_pool_; 82 OneCopyTileTaskWorkerPool* worker_pool_;
67 ResourceProvider* resource_provider_; 83 ResourceProvider* resource_provider_;
68 ResourcePool* resource_pool_; 84 ResourcePool* resource_pool_;
69 const Resource* resource_; 85 const Resource* upload_resource_;
86 uint64_t new_content_id_;
87 bool reusing_raster_resource_;
70 scoped_ptr<ScopedResource> raster_resource_; 88 scoped_ptr<ScopedResource> raster_resource_;
71 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> lock_; 89 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> lock_;
72 CopySequenceNumber sequence_; 90 CopySequenceNumber sequence_;
73 91
74 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); 92 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
75 }; 93 };
76 94
77 // Flush interval when performing copy operations. 95 // Flush interval when performing copy operations.
78 const int kCopyFlushPeriod = 4; 96 const int kCopyFlushPeriod = 4;
79 97
80 // Number of in-flight copy operations to allow. 98 // Number of in-flight copy operations to allow.
81 const int kMaxCopyOperations = 32; 99 const int kMaxCopyOperations = 32;
82 100
83 // Minimum number of rows per copy operation. 4 or greater is required to 101 // Minimum number of rows per copy operation. 4 or greater is required to
84 // support compressed texture formats. 102 // support compressed texture formats.
85 const size_t kMinRowsPerCopyOperation = 4; 103 const size_t kMinRowsPerCopyOperation = 4;
86 104
87 // Delay been checking for copy operations to complete. 105 // Delay been checking for copy operations to complete.
88 const int kCheckForCompletedCopyOperationsTickRateMs = 1; 106 const int kCheckForCompletedCopyOperationsTickRateMs = 1;
89 107
90 // Number of failed attempts to allow before we perform a check that will 108 // Number of failed attempts to allow before we perform a check that will
91 // wait for copy operations to complete if needed. 109 // wait for copy operations to complete if needed.
92 const int kFailedAttemptsBeforeWaitIfNeeded = 256; 110 const int kFailedAttemptsBeforeWaitIfNeeded = 256;
93 111
94 } // namespace 112 } // namespace
95 113
96 OneCopyTileTaskWorkerPool::CopyOperation::CopyOperation( 114 OneCopyTileTaskWorkerPool::CopyOperation::CopyOperation(
97 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, 115 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> src_write_lock,
98 const Resource* src, 116 const Resource* src,
99 const Resource* dst, 117 const Resource* dst,
100 const gfx::Rect& rect) 118 const gfx::Rect& rect)
101 : write_lock(write_lock.Pass()), src(src), dst(dst), rect(rect) { 119 : src_write_lock(src_write_lock.Pass()), src(src), dst(dst), rect(rect) {
102 } 120 }
103 121
104 OneCopyTileTaskWorkerPool::CopyOperation::~CopyOperation() { 122 OneCopyTileTaskWorkerPool::CopyOperation::~CopyOperation() {
105 } 123 }
106 124
107 // static 125 // static
108 scoped_ptr<TileTaskWorkerPool> OneCopyTileTaskWorkerPool::Create( 126 scoped_ptr<TileTaskWorkerPool> OneCopyTileTaskWorkerPool::Create(
109 base::SequencedTaskRunner* task_runner, 127 base::SequencedTaskRunner* task_runner,
110 TaskGraphRunner* task_graph_runner, 128 TaskGraphRunner* task_graph_runner,
111 ContextProvider* context_provider, 129 ContextProvider* context_provider,
112 ResourceProvider* resource_provider, 130 ResourceProvider* resource_provider,
113 ResourcePool* resource_pool, 131 ResourcePool* resource_pool,
114 size_t max_bytes_per_copy_operation) { 132 size_t max_bytes_per_copy_operation,
133 bool have_persistent_gpu_memory_buffers) {
115 return make_scoped_ptr<TileTaskWorkerPool>(new OneCopyTileTaskWorkerPool( 134 return make_scoped_ptr<TileTaskWorkerPool>(new OneCopyTileTaskWorkerPool(
116 task_runner, task_graph_runner, context_provider, resource_provider, 135 task_runner, task_graph_runner, context_provider, resource_provider,
117 resource_pool, max_bytes_per_copy_operation)); 136 resource_pool, max_bytes_per_copy_operation,
137 have_persistent_gpu_memory_buffers));
118 } 138 }
119 139
120 OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( 140 OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool(
121 base::SequencedTaskRunner* task_runner, 141 base::SequencedTaskRunner* task_runner,
122 TaskGraphRunner* task_graph_runner, 142 TaskGraphRunner* task_graph_runner,
123 ContextProvider* context_provider, 143 ContextProvider* context_provider,
124 ResourceProvider* resource_provider, 144 ResourceProvider* resource_provider,
125 ResourcePool* resource_pool, 145 ResourcePool* resource_pool,
126 size_t max_bytes_per_copy_operation) 146 size_t max_bytes_per_copy_operation,
147 bool have_persistent_gpu_memory_buffers)
127 : task_runner_(task_runner), 148 : task_runner_(task_runner),
128 task_graph_runner_(task_graph_runner), 149 task_graph_runner_(task_graph_runner),
129 namespace_token_(task_graph_runner->GetNamespaceToken()), 150 namespace_token_(task_graph_runner->GetNamespaceToken()),
130 context_provider_(context_provider), 151 context_provider_(context_provider),
131 resource_provider_(resource_provider), 152 resource_provider_(resource_provider),
132 resource_pool_(resource_pool), 153 resource_pool_(resource_pool),
133 max_bytes_per_copy_operation_(max_bytes_per_copy_operation), 154 max_bytes_per_copy_operation_(max_bytes_per_copy_operation),
155 have_persistent_gpu_memory_buffers_(have_persistent_gpu_memory_buffers),
134 last_issued_copy_operation_(0), 156 last_issued_copy_operation_(0),
135 last_flushed_copy_operation_(0), 157 last_flushed_copy_operation_(0),
136 lock_(), 158 lock_(),
137 copy_operation_count_cv_(&lock_), 159 copy_operation_count_cv_(&lock_),
138 issued_copy_operation_count_(0), 160 issued_copy_operation_count_(0),
139 next_copy_operation_sequence_(1), 161 next_copy_operation_sequence_(1),
140 check_for_completed_copy_operations_pending_(false), 162 check_for_completed_copy_operations_pending_(false),
141 shutdown_(false), 163 shutdown_(false),
142 weak_ptr_factory_(this), 164 weak_ptr_factory_(this),
143 task_set_finished_weak_ptr_factory_(this) { 165 task_set_finished_weak_ptr_factory_(this) {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 task->RunReplyOnOriginThread(); 284 task->RunReplyOnOriginThread();
263 } 285 }
264 completed_tasks_.clear(); 286 completed_tasks_.clear();
265 } 287 }
266 288
267 ResourceFormat OneCopyTileTaskWorkerPool::GetResourceFormat() { 289 ResourceFormat OneCopyTileTaskWorkerPool::GetResourceFormat() {
268 return resource_provider_->best_texture_format(); 290 return resource_provider_->best_texture_format();
269 } 291 }
270 292
271 scoped_ptr<RasterBuffer> OneCopyTileTaskWorkerPool::AcquireBufferForRaster( 293 scoped_ptr<RasterBuffer> OneCopyTileTaskWorkerPool::AcquireBufferForRaster(
272 const Resource* resource) { 294 const TileTaskData& data) {
273 DCHECK_EQ(resource->format(), resource_provider_->best_texture_format()); 295 DCHECK_EQ(data.resource->format(), resource_provider_->best_texture_format());
274 return make_scoped_ptr<RasterBuffer>( 296 return make_scoped_ptr<RasterBuffer>(new RasterBufferImpl(
275 new RasterBufferImpl(this, resource_provider_, resource_pool_, 297 this, resource_provider_, resource_pool_,
276 resource_provider_->best_texture_format(), 298 resource_provider_->best_texture_format(), data.resource,
277 resource)); 299 data.new_content_id, data.previous_content_id));
278 } 300 }
279 301
280 void OneCopyTileTaskWorkerPool::ReleaseBufferForRaster( 302 void OneCopyTileTaskWorkerPool::ReleaseBufferForRaster(
281 scoped_ptr<RasterBuffer> buffer) { 303 scoped_ptr<RasterBuffer> buffer) {
282 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. 304 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
283 } 305 }
284 306
285 CopySequenceNumber 307 CopySequenceNumber
286 OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread( 308 OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread(
287 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, 309 bool reusing_raster_resource,
288 const Resource* src, 310 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer>
289 const Resource* dst, 311 raster_resource_write_lock,
312 const Resource* raster_resource,
313 const Resource* upload_resource,
290 const RasterSource* raster_source, 314 const RasterSource* raster_source,
291 const gfx::Rect& rect, 315 const gfx::Rect& raster_full_rect,
316 const gfx::Rect& raster_dirty_rect,
292 float scale) { 317 float scale) {
293 gfx::GpuMemoryBuffer* gpu_memory_buffer = write_lock->GetGpuMemoryBuffer(); 318 gfx::GpuMemoryBuffer* gpu_memory_buffer =
319 raster_resource_write_lock->GetGpuMemoryBuffer();
294 if (gpu_memory_buffer) { 320 if (gpu_memory_buffer) {
295 void* data = NULL; 321 void* data = NULL;
296 bool rv = gpu_memory_buffer->Map(&data); 322 bool rv = gpu_memory_buffer->Map(&data);
297 DCHECK(rv); 323 DCHECK(rv);
298 int stride; 324 int stride;
299 gpu_memory_buffer->GetStride(&stride); 325 gpu_memory_buffer->GetStride(&stride);
300 TileTaskWorkerPool::PlaybackToMemory(data, src->format(), src->size(), 326
301 stride, raster_source, rect, scale); 327 gfx::Rect playback_rect = raster_full_rect;
328 if (reusing_raster_resource) {
329 playback_rect.Intersect(raster_dirty_rect);
330 }
331 DCHECK(!playback_rect.IsEmpty())
332 << "Why are we rastering a tile that's not dirty?";
333 TileTaskWorkerPool::PlaybackToMemory(
334 data, raster_resource->format(), raster_resource->size(), stride,
335 raster_source, raster_full_rect, playback_rect, scale);
302 gpu_memory_buffer->Unmap(); 336 gpu_memory_buffer->Unmap();
303 } 337 }
304 338
305 base::AutoLock lock(lock_); 339 base::AutoLock lock(lock_);
306 340
307 CopySequenceNumber sequence = 0; 341 CopySequenceNumber sequence = 0;
308 size_t bytes_per_row = 342 size_t bytes_per_row = (BitsPerPixel(raster_resource->format()) *
309 (BitsPerPixel(src->format()) * src->size().width()) / 8; 343 raster_resource->size().width()) /
344 8;
310 size_t chunk_size_in_rows = std::max( 345 size_t chunk_size_in_rows = std::max(
311 kMinRowsPerCopyOperation, max_bytes_per_copy_operation_ / bytes_per_row); 346 kMinRowsPerCopyOperation, max_bytes_per_copy_operation_ / bytes_per_row);
312 size_t y = 0; 347 size_t y = 0;
313 size_t height = src->size().height(); 348 size_t height = raster_resource->size().height();
314 while (y < height) { 349 while (y < height) {
315 int failed_attempts = 0; 350 int failed_attempts = 0;
316 while ((pending_copy_operations_.size() + issued_copy_operation_count_) >= 351 while ((pending_copy_operations_.size() + issued_copy_operation_count_) >=
317 kMaxCopyOperations) { 352 kMaxCopyOperations) {
318 // Ignore limit when shutdown is set. 353 // Ignore limit when shutdown is set.
319 if (shutdown_) 354 if (shutdown_)
320 break; 355 break;
321 356
322 ++failed_attempts; 357 ++failed_attempts;
323 358
(...skipping 14 matching lines...) Expand all
338 } 373 }
339 374
340 // There may be more work available, so wake up another worker thread. 375 // There may be more work available, so wake up another worker thread.
341 copy_operation_count_cv_.Signal(); 376 copy_operation_count_cv_.Signal();
342 377
343 // Copy at most |chunk_size_in_rows|. 378 // Copy at most |chunk_size_in_rows|.
344 size_t rows_to_copy = std::min(chunk_size_in_rows, height - y); 379 size_t rows_to_copy = std::min(chunk_size_in_rows, height - y);
345 380
346 // |write_lock| is passed to the first copy operation as it needs to be 381 // |write_lock| is passed to the first copy operation as it needs to be
347 // released before we can issue a copy. 382 // released before we can issue a copy.
348 pending_copy_operations_.push_back(make_scoped_ptr( 383 pending_copy_operations_.push_back(make_scoped_ptr(new CopyOperation(
349 new CopyOperation(write_lock.Pass(), src, dst, 384 raster_resource_write_lock.Pass(), raster_resource, upload_resource,
350 gfx::Rect(0, y, src->size().width(), rows_to_copy)))); 385 gfx::Rect(0, y, raster_resource->size().width(), rows_to_copy))));
reveman 2015/05/28 05:07:24 hard to see if this code was changed. looks like i
danakj 2015/05/28 18:54:46 this is just renaming, to make it clear what resou
reveman 2015/05/29 14:50:26 OK, I see, just some renaming that makes sense ind
351
352 y += rows_to_copy; 386 y += rows_to_copy;
353 387
354 // Acquire a sequence number for this copy operation. 388 // Acquire a sequence number for this copy operation.
355 sequence = next_copy_operation_sequence_++; 389 sequence = next_copy_operation_sequence_++;
356 390
357 // Post task that will advance last flushed copy operation to |sequence| 391 // Post task that will advance last flushed copy operation to |sequence|
358 // if we have reached the flush period. 392 // if we have reached the flush period.
359 if ((sequence % kCopyFlushPeriod) == 0) { 393 if ((sequence % kCopyFlushPeriod) == 0) {
360 task_runner_->PostTask( 394 task_runner_->PostTask(
361 FROM_HERE, 395 FROM_HERE,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 453
420 // Increment |issued_copy_operation_count_| to reflect the transition of 454 // Increment |issued_copy_operation_count_| to reflect the transition of
421 // copy operations from "pending" to "issued" state. 455 // copy operations from "pending" to "issued" state.
422 issued_copy_operation_count_ += copy_operations.size(); 456 issued_copy_operation_count_ += copy_operations.size();
423 } 457 }
424 458
425 while (!copy_operations.empty()) { 459 while (!copy_operations.empty()) {
426 scoped_ptr<CopyOperation> copy_operation = copy_operations.take_front(); 460 scoped_ptr<CopyOperation> copy_operation = copy_operations.take_front();
427 461
428 // Remove the write lock. 462 // Remove the write lock.
429 copy_operation->write_lock.reset(); 463 copy_operation->src_write_lock.reset();
430 464
431 // Copy contents of source resource to destination resource. 465 // Copy contents of source resource to destination resource.
432 resource_provider_->CopyResource(copy_operation->src->id(), 466 resource_provider_->CopyResource(copy_operation->src->id(),
433 copy_operation->dst->id(), 467 copy_operation->dst->id(),
434 copy_operation->rect); 468 copy_operation->rect);
435 } 469 }
436 } 470 }
437 471
438 void OneCopyTileTaskWorkerPool:: 472 void OneCopyTileTaskWorkerPool::
439 ScheduleCheckForCompletedCopyOperationsWithLockAcquired( 473 ScheduleCheckForCompletedCopyOperationsWithLockAcquired(
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 resource_pool_->total_memory_usage_bytes()); 547 resource_pool_->total_memory_usage_bytes());
514 staging_state->SetInteger("pending_copy_count", 548 staging_state->SetInteger("pending_copy_count",
515 resource_pool_->total_resource_count() - 549 resource_pool_->total_resource_count() -
516 resource_pool_->acquired_resource_count()); 550 resource_pool_->acquired_resource_count());
517 staging_state->SetInteger("bytes_pending_copy", 551 staging_state->SetInteger("bytes_pending_copy",
518 resource_pool_->total_memory_usage_bytes() - 552 resource_pool_->total_memory_usage_bytes() -
519 resource_pool_->acquired_memory_usage_bytes()); 553 resource_pool_->acquired_memory_usage_bytes());
520 } 554 }
521 555
522 } // namespace cc 556 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698