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

Side by Side Diff: cc/resources/pixel_buffer_raster_worker_pool.cc

Issue 562833004: cc: Move RasterBuffer implementations from ResourceProvider to RasterWorkerPool implementations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move NullCanvas change to separate patch Created 6 years, 3 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/resources/pixel_buffer_raster_worker_pool.h" 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/containers/stack_container.h" 9 #include "base/containers/stack_container.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
11 #include "base/debug/trace_event_argument.h" 11 #include "base/debug/trace_event_argument.h"
12 #include "cc/debug/traced_value.h" 12 #include "cc/debug/traced_value.h"
13 #include "cc/resources/raster_buffer.h"
13 #include "cc/resources/resource.h" 14 #include "cc/resources/resource.h"
14 #include "gpu/command_buffer/client/gles2_interface.h" 15 #include "gpu/command_buffer/client/gles2_interface.h"
16 #include "third_party/skia/include/utils/SkNullCanvas.h"
15 17
16 namespace cc { 18 namespace cc {
17 namespace { 19 namespace {
18 20
21 class RasterBufferImpl : public RasterBuffer {
22 public:
23 RasterBufferImpl(ResourceProvider* resource_provider,
24 const Resource* resource)
25 : resource_provider_(resource_provider),
26 resource_(resource),
27 buffer_(NULL),
28 stride_(0) {
29 resource_provider_->AcquirePixelBuffer(resource_->id());
30 buffer_ = resource_provider_->MapPixelBuffer(resource_->id(), &stride_);
31 }
32
33 virtual ~RasterBufferImpl() {
34 resource_provider_->ReleasePixelBuffer(resource_->id());
35 }
36
37 // Overridden from RasterBuffer:
38 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE {
39 if (!buffer_)
40 return skia::AdoptRef(SkCreateNullCanvas());
41
42 RasterWorkerPool::AcquireBitmapForBuffer(
43 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_);
44 return skia::AdoptRef(new SkCanvas(bitmap_));
45 }
46 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE {
47 if (!buffer_)
48 return;
49
50 RasterWorkerPool::ReleaseBitmapForBuffer(
51 &bitmap_, buffer_, resource_->format());
52 }
53
54 private:
55 ResourceProvider* resource_provider_;
56 const Resource* resource_;
57 uint8_t* buffer_;
58 int stride_;
59 SkBitmap bitmap_;
60
61 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
62 };
63
19 const int kCheckForCompletedRasterTasksDelayMs = 6; 64 const int kCheckForCompletedRasterTasksDelayMs = 6;
20 65
21 const size_t kMaxScheduledRasterTasks = 48; 66 const size_t kMaxScheduledRasterTasks = 48;
22 67
23 typedef base::StackVector<RasterTask*, kMaxScheduledRasterTasks> 68 typedef base::StackVector<RasterTask*, kMaxScheduledRasterTasks>
24 RasterTaskVector; 69 RasterTaskVector;
25 70
26 } // namespace 71 } // namespace
27 72
28 // static 73 // static
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 DCHECK_EQ(RasterTaskState::COMPLETED, state_it->type); 293 DCHECK_EQ(RasterTaskState::COMPLETED, state_it->type);
249 294
250 std::swap(*state_it, raster_task_states_.back()); 295 std::swap(*state_it, raster_task_states_.back());
251 raster_task_states_.pop_back(); 296 raster_task_states_.pop_back();
252 297
253 task->RunReplyOnOriginThread(); 298 task->RunReplyOnOriginThread();
254 } 299 }
255 completed_raster_tasks_.clear(); 300 completed_raster_tasks_.clear();
256 } 301 }
257 302
258 RasterBuffer* PixelBufferRasterWorkerPool::AcquireBufferForRaster( 303 scoped_ptr<RasterBuffer> PixelBufferRasterWorkerPool::AcquireBufferForRaster(
259 RasterTask* task) { 304 const Resource* resource) {
260 DCHECK(std::find_if(raster_task_states_.begin(), 305 return make_scoped_ptr<RasterBuffer>(
261 raster_task_states_.end(), 306 new RasterBufferImpl(resource_provider_, resource));
262 RasterTaskState::TaskComparator(task)) !=
263 raster_task_states_.end());
264 return resource_provider_->AcquirePixelRasterBuffer(task->resource()->id());
265 } 307 }
266 308
267 void PixelBufferRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 309 void PixelBufferRasterWorkerPool::ReleaseBufferForRaster(
268 DCHECK(std::find_if(raster_task_states_.begin(), 310 scoped_ptr<RasterBuffer> buffer) {
269 raster_task_states_.end(), 311 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
270 RasterTaskState::TaskComparator(task)) !=
271 raster_task_states_.end());
272 resource_provider_->ReleasePixelRasterBuffer(task->resource()->id());
273 } 312 }
274 313
275 void PixelBufferRasterWorkerPool::OnRasterFinished() { 314 void PixelBufferRasterWorkerPool::OnRasterFinished() {
276 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::OnRasterFinished"); 315 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::OnRasterFinished");
277 316
278 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as 317 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as
279 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to 318 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to
280 // perform another check in that case as we've already notified the client. 319 // perform another check in that case as we've already notified the client.
281 if (!should_notify_client_if_no_tasks_are_pending_) 320 if (!should_notify_client_if_no_tasks_are_pending_)
282 return; 321 return;
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 711
673 RasterTaskState::Vector::iterator state_it = 712 RasterTaskState::Vector::iterator state_it =
674 std::find_if(raster_task_states_.begin(), 713 std::find_if(raster_task_states_.begin(),
675 raster_task_states_.end(), 714 raster_task_states_.end(),
676 RasterTaskState::TaskComparator(raster_task)); 715 RasterTaskState::TaskComparator(raster_task));
677 DCHECK(state_it != raster_task_states_.end()); 716 DCHECK(state_it != raster_task_states_.end());
678 717
679 RasterTaskState& state = *state_it; 718 RasterTaskState& state = *state_it;
680 DCHECK_EQ(RasterTaskState::SCHEDULED, state.type); 719 DCHECK_EQ(RasterTaskState::SCHEDULED, state.type);
681 720
721 resource_provider_->UnmapPixelBuffer(raster_task->resource()->id());
722
682 if (!raster_task->HasFinishedRunning()) { 723 if (!raster_task->HasFinishedRunning()) {
683 // When priorites change, a raster task can be canceled as a result of 724 // When priorites change, a raster task can be canceled as a result of
684 // no longer being of high enough priority to fit in our throttled 725 // no longer being of high enough priority to fit in our throttled
685 // raster task budget. The task has not yet completed in this case. 726 // raster task budget. The task has not yet completed in this case.
686 raster_task->WillComplete(); 727 raster_task->WillComplete();
687 raster_task->CompleteOnOriginThread(this); 728 raster_task->CompleteOnOriginThread(this);
688 raster_task->DidComplete(); 729 raster_task->DidComplete();
689 730
690 RasterTaskQueue::Item::Vector::const_iterator item_it = 731 RasterTaskQueue::Item::Vector::const_iterator item_it =
691 std::find_if(raster_tasks_.items.begin(), 732 std::find_if(raster_tasks_.items.begin(),
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 void PixelBufferRasterWorkerPool::ThrottleStateAsValueInto( 778 void PixelBufferRasterWorkerPool::ThrottleStateAsValueInto(
738 base::debug::TracedValue* throttle_state) const { 779 base::debug::TracedValue* throttle_state) const {
739 throttle_state->SetInteger("bytes_available_for_upload", 780 throttle_state->SetInteger("bytes_available_for_upload",
740 max_bytes_pending_upload_ - bytes_pending_upload_); 781 max_bytes_pending_upload_ - bytes_pending_upload_);
741 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 782 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
742 throttle_state->SetInteger("scheduled_raster_task_count", 783 throttle_state->SetInteger("scheduled_raster_task_count",
743 scheduled_raster_task_count_); 784 scheduled_raster_task_count_);
744 } 785 }
745 786
746 } // namespace cc 787 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698