OLD | NEW |
| (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 | |
OLD | NEW |