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

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

Issue 839143002: Roll Chrome into Mojo. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rebase Created 5 years, 11 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
« no previous file with comments | « cc/resources/gpu_tile_task_worker_pool.h ('k') | cc/resources/picture.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/resources/gpu_tile_task_worker_pool.h" 5 #include "cc/resources/gpu_tile_task_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "cc/output/context_provider.h"
11 #include "cc/resources/raster_buffer.h" 10 #include "cc/resources/raster_buffer.h"
12 #include "cc/resources/raster_source.h" 11 #include "cc/resources/raster_source.h"
13 #include "cc/resources/resource.h" 12 #include "cc/resources/resource.h"
14 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/scoped_gpu_raster.h" 13 #include "cc/resources/scoped_gpu_raster.h"
16 #include "gpu/command_buffer/client/gles2_interface.h" 14 #include "gpu/command_buffer/client/gles2_interface.h"
17 #include "third_party/skia/include/core/SkMultiPictureDraw.h" 15 #include "third_party/skia/include/core/SkMultiPictureDraw.h"
18 #include "third_party/skia/include/core/SkPictureRecorder.h" 16 #include "third_party/skia/include/core/SkPictureRecorder.h"
19 #include "third_party/skia/include/core/SkSurface.h" 17 #include "third_party/skia/include/core/SkSurface.h"
20 #include "third_party/skia/include/gpu/GrContext.h" 18 #include "third_party/skia/include/gpu/GrContext.h"
21 19
22 namespace cc { 20 namespace cc {
23 namespace { 21 namespace {
24 22
25 class RasterBufferImpl : public RasterBuffer { 23 class RasterBufferImpl : public RasterBuffer {
26 public: 24 public:
27 RasterBufferImpl(ResourceProvider* resource_provider, 25 RasterBufferImpl() {}
28 const Resource* resource,
29 SkMultiPictureDraw* multi_picture_draw,
30 bool use_distance_field_text)
31 : lock_(resource_provider, resource->id()),
32 resource_(resource),
33 multi_picture_draw_(multi_picture_draw),
34 use_distance_field_text_(use_distance_field_text) {}
35 26
36 // Overridden from RasterBuffer: 27 // Overridden from RasterBuffer:
37 void Playback(const RasterSource* raster_source, 28 void Playback(const RasterSource* raster_source,
38 const gfx::Rect& rect, 29 const gfx::Rect& rect,
39 float scale) override { 30 float scale) override {
40 // Turn on distance fields for layers that have ever animated. 31 // Don't do anything.
41 bool use_distance_field_text =
42 use_distance_field_text_ ||
43 raster_source->ShouldAttemptToUseDistanceFieldText();
44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text,
45 raster_source->CanUseLCDText());
46
47 if (!sk_surface)
48 return;
49
50 SkPictureRecorder recorder;
51 gfx::Size size = resource_->size();
52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag;
53 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(
54 recorder.beginRecording(size.width(), size.height(), NULL, flags));
55
56 canvas->save();
57 raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
58 canvas->restore();
59
60 // Add the canvas and recorded picture to |multi_picture_draw_|.
61 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording());
62 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get());
63 } 32 }
64 33
65 private: 34 private:
66 ResourceProvider::ScopedWriteLockGr lock_;
67 const Resource* resource_;
68 SkMultiPictureDraw* multi_picture_draw_;
69 bool use_distance_field_text_;
70
71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); 35 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
72 }; 36 };
73 37
74 } // namespace 38 } // namespace
75
76 // static 39 // static
77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( 40 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create(
78 base::SequencedTaskRunner* task_runner, 41 base::SequencedTaskRunner* task_runner,
79 ContextProvider* context_provider, 42 TaskGraphRunner* task_graph_runner) {
80 ResourceProvider* resource_provider,
81 bool use_distance_field_text) {
82 return make_scoped_ptr<TileTaskWorkerPool>( 43 return make_scoped_ptr<TileTaskWorkerPool>(
83 new GpuTileTaskWorkerPool(task_runner, context_provider, 44 new GpuTileTaskWorkerPool(task_runner, task_graph_runner));
84 resource_provider, use_distance_field_text));
85 } 45 }
86 46
47 // TODO(hendrikw): This class should be removed. See crbug.com/444938.
87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( 48 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool(
88 base::SequencedTaskRunner* task_runner, 49 base::SequencedTaskRunner* task_runner,
89 ContextProvider* context_provider, 50 TaskGraphRunner* task_graph_runner)
90 ResourceProvider* resource_provider,
91 bool use_distance_field_text)
92 : task_runner_(task_runner), 51 : task_runner_(task_runner),
93 task_graph_runner_(new TaskGraphRunner), 52 task_graph_runner_(task_graph_runner),
94 namespace_token_(task_graph_runner_->GetNamespaceToken()), 53 namespace_token_(task_graph_runner_->GetNamespaceToken()),
95 context_provider_(context_provider),
96 resource_provider_(resource_provider),
97 run_tasks_on_origin_thread_pending_(false), 54 run_tasks_on_origin_thread_pending_(false),
98 use_distance_field_text_(use_distance_field_text),
99 task_set_finished_weak_ptr_factory_(this), 55 task_set_finished_weak_ptr_factory_(this),
100 weak_ptr_factory_(this) { 56 weak_ptr_factory_(this) {
101 DCHECK(context_provider_);
102 } 57 }
103 58
104 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() { 59 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() {
105 DCHECK_EQ(0u, completed_tasks_.size()); 60 DCHECK_EQ(0u, completed_tasks_.size());
106 } 61 }
107 62
108 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() { 63 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() {
109 return this; 64 return this;
110 } 65 }
111 66
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 120 }
166 121
167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { 122 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), 123 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
169 kTaskSetFinishedTaskPriority, task_count[task_set]); 124 kTaskSetFinishedTaskPriority, task_count[task_set]);
170 } 125 }
171 126
172 ScheduleTasksOnOriginThread(this, &graph_); 127 ScheduleTasksOnOriginThread(this, &graph_);
173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 128 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
174 129
175 ScheduleRunTasksOnOriginThread();
176
177 std::copy(new_task_set_finished_tasks, 130 std::copy(new_task_set_finished_tasks,
178 new_task_set_finished_tasks + kNumberOfTaskSets, 131 new_task_set_finished_tasks + kNumberOfTaskSets,
179 task_set_finished_tasks_); 132 task_set_finished_tasks_);
180 } 133 }
181 134
182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { 135 void GpuTileTaskWorkerPool::CheckForCompletedTasks() {
183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); 136 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks");
184 137
185 task_graph_runner_->CollectCompletedTasks(namespace_token_, 138 task_graph_runner_->CollectCompletedTasks(namespace_token_,
186 &completed_tasks_); 139 &completed_tasks_);
187 for (Task::Vector::const_iterator it = completed_tasks_.begin(); 140 CompleteTasks(completed_tasks_);
188 it != completed_tasks_.end(); ++it) { 141 completed_tasks_.clear();
189 TileTask* task = static_cast<TileTask*>(it->get()); 142 }
190 143
191 task->WillComplete(); 144 void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) {
192 task->CompleteOnOriginThread(this); 145 for (auto& task : tasks) {
193 task->DidComplete(); 146 RasterTask* raster_task = static_cast<RasterTask*>(task.get());
194 147
195 task->RunReplyOnOriginThread(); 148 raster_task->WillComplete();
149 raster_task->CompleteOnOriginThread(this);
150 raster_task->DidComplete();
151
152 raster_task->RunReplyOnOriginThread();
196 } 153 }
197 completed_tasks_.clear(); 154 completed_tasks_.clear();
198 } 155 }
199 156
200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( 157 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster(
201 const Resource* resource) { 158 const Resource* resource) {
202 return make_scoped_ptr<RasterBuffer>( 159 return make_scoped_ptr<RasterBuffer>(new RasterBufferImpl());
203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_,
204 use_distance_field_text_));
205 } 160 }
206 161
207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( 162 void GpuTileTaskWorkerPool::ReleaseBufferForRaster(
208 scoped_ptr<RasterBuffer> buffer) { 163 scoped_ptr<RasterBuffer> buffer) {
209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. 164 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
210 } 165 }
211 166
212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { 167 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", 168 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set",
214 task_set); 169 task_set);
215 170
216 DCHECK(tasks_pending_[task_set]); 171 DCHECK(tasks_pending_[task_set]);
217 tasks_pending_[task_set] = false; 172 tasks_pending_[task_set] = false;
218 client_->DidFinishRunningTileTasks(task_set); 173 client_->DidFinishRunningTileTasks(task_set);
219 } 174 }
220 175
221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() {
222 if (run_tasks_on_origin_thread_pending_)
223 return;
224
225 task_runner_->PostTask(
226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread,
227 weak_ptr_factory_.GetWeakPtr()));
228 run_tasks_on_origin_thread_pending_ = true;
229 }
230
231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() {
232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread");
233
234 DCHECK(run_tasks_on_origin_thread_pending_);
235 run_tasks_on_origin_thread_pending_ = false;
236
237 ScopedGpuRaster gpu_raster(context_provider_);
238 task_graph_runner_->RunUntilIdle();
239
240 // Draw each all of the pictures that were collected. This will also clear
241 // the pictures and canvases added to |multi_picture_draw_|
242 multi_picture_draw_.draw();
243 }
244
245 } // namespace cc 176 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/gpu_tile_task_worker_pool.h ('k') | cc/resources/picture.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698