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

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

Issue 1910213005: cc: Refactor TileTaskWorkerPool. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@task_states
Patch Set: feedback Created 4 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
« no previous file with comments | « cc/raster/tile_task_worker_pool.h ('k') | cc/raster/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "cc/raster/tile_task_worker_pool.h"
6
7 #include <stddef.h>
8
9 #include "base/trace_event/trace_event.h"
10 #include "cc/playback/raster_source.h"
11 #include "cc/raster/texture_compressor.h"
12 #include "cc/resources/platform_color.h"
13 #include "third_party/skia/include/core/SkCanvas.h"
14 #include "third_party/skia/include/core/SkSurface.h"
15
16 namespace cc {
17
18 TileTaskWorkerPool::TileTaskWorkerPool() {}
19
20 TileTaskWorkerPool::~TileTaskWorkerPool() {}
21
22 // static
23 void TileTaskWorkerPool::ScheduleTasksOnOriginThread(
24 RasterBufferProvider* provider,
25 TaskGraph* graph) {
26 TRACE_EVENT0("cc", "TileTaskWorkerPool::ScheduleTasksOnOriginThread");
27
28 for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
29 it != graph->nodes.end(); ++it) {
30 TaskGraph::Node& node = *it;
31 TileTask* task = static_cast<TileTask*>(node.task);
32
33 if (!task->HasBeenScheduled()) {
34 task->WillSchedule();
35 task->ScheduleOnOriginThread(provider);
36 task->DidSchedule();
37 }
38 }
39 }
40
41 namespace {
42
43 bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) {
44 switch (format) {
45 case RGBA_4444:
46 case RGBA_8888:
47 case BGRA_8888:
48 case ETC1:
49 return true;
50 case ALPHA_8:
51 case LUMINANCE_8:
52 case RGB_565:
53 case RED_8:
54 case LUMINANCE_F16:
55 return false;
56 }
57 NOTREACHED();
58 return false;
59 }
60
61 } // anonymous namespace
62
63 // static
64 void TileTaskWorkerPool::PlaybackToMemory(
65 void* memory,
66 ResourceFormat format,
67 const gfx::Size& size,
68 size_t stride,
69 const RasterSource* raster_source,
70 const gfx::Rect& canvas_bitmap_rect,
71 const gfx::Rect& canvas_playback_rect,
72 float scale,
73 const RasterSource::PlaybackSettings& playback_settings) {
74 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory");
75
76 DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format;
77
78 // Uses kPremul_SkAlphaType since the result is not known to be opaque.
79 SkImageInfo info =
80 SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType);
81
82 // Use unknown pixel geometry to disable LCD text.
83 SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry);
84 if (raster_source->CanUseLCDText()) {
85 // LegacyFontHost will get LCD text and skia figures out what type to use.
86 surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType);
87 }
88
89 if (!stride)
90 stride = info.minRowBytes();
91 DCHECK_GT(stride, 0u);
92
93 switch (format) {
94 case RGBA_8888:
95 case BGRA_8888: {
96 sk_sp<SkSurface> surface =
97 SkSurface::MakeRasterDirect(info, memory, stride, &surface_props);
98 raster_source->PlaybackToCanvas(surface->getCanvas(), canvas_bitmap_rect,
99 canvas_playback_rect, scale,
100 playback_settings);
101 return;
102 }
103 case RGBA_4444:
104 case ETC1: {
105 sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &surface_props);
106 // TODO(reveman): Improve partial raster support by reducing the size of
107 // playback rect passed to PlaybackToCanvas. crbug.com/519070
108 raster_source->PlaybackToCanvas(surface->getCanvas(), canvas_bitmap_rect,
109 canvas_bitmap_rect, scale,
110 playback_settings);
111
112 if (format == ETC1) {
113 TRACE_EVENT0("cc",
114 "TileTaskWorkerPool::PlaybackToMemory::CompressETC1");
115 DCHECK_EQ(size.width() % 4, 0);
116 DCHECK_EQ(size.height() % 4, 0);
117 std::unique_ptr<TextureCompressor> texture_compressor =
118 TextureCompressor::Create(TextureCompressor::kFormatETC1);
119 SkPixmap pixmap;
120 surface->peekPixels(&pixmap);
121 texture_compressor->Compress(
122 reinterpret_cast<const uint8_t*>(pixmap.addr()),
123 reinterpret_cast<uint8_t*>(memory), size.width(), size.height(),
124 TextureCompressor::kQualityHigh);
125 } else {
126 TRACE_EVENT0("cc",
127 "TileTaskWorkerPool::PlaybackToMemory::ConvertRGBA4444");
128 SkImageInfo dst_info =
129 SkImageInfo::Make(info.width(), info.height(),
130 ResourceFormatToClosestSkColorType(format),
131 info.alphaType(), info.profileType());
132 bool rv = surface->readPixels(dst_info, memory, stride, 0, 0);
133 DCHECK(rv);
134 }
135 return;
136 }
137 case ALPHA_8:
138 case LUMINANCE_8:
139 case RGB_565:
140 case RED_8:
141 case LUMINANCE_F16:
142 NOTREACHED();
143 return;
144 }
145
146 NOTREACHED();
147 }
148
149 bool TileTaskWorkerPool::ResourceFormatRequiresSwizzle(ResourceFormat format) {
150 switch (format) {
151 case RGBA_8888:
152 case BGRA_8888:
153 // Initialize resource using the preferred PlatformColor component
154 // order and swizzle in the shader instead of in software.
155 return !PlatformColor::SameComponentOrder(format);
156 case RGBA_4444:
157 case ETC1:
158 case ALPHA_8:
159 case LUMINANCE_8:
160 case RGB_565:
161 case RED_8:
162 case LUMINANCE_F16:
163 return false;
164 }
165 NOTREACHED();
166 return false;
167 }
168
169 } // namespace cc
OLDNEW
« no previous file with comments | « cc/raster/tile_task_worker_pool.h ('k') | cc/raster/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698