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

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

Issue 1713503002: Reland Allow one-copy and zero-copy task tile worker pools to use compressed textures. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 10 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/raster/tile_task_worker_pool.h" 5 #include "cc/raster/tile_task_worker_pool.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "cc/playback/display_list_raster_source.h" 10 #include "cc/playback/display_list_raster_source.h"
11 #include "cc/raster/texture_compressor.h"
11 #include "skia/ext/refptr.h" 12 #include "skia/ext/refptr.h"
12 #include "third_party/skia/include/core/SkCanvas.h" 13 #include "third_party/skia/include/core/SkCanvas.h"
13 #include "third_party/skia/include/core/SkSurface.h" 14 #include "third_party/skia/include/core/SkSurface.h"
14 #include "third_party/skia/include/utils/SkPaintFilterCanvas.h" 15 #include "third_party/skia/include/utils/SkPaintFilterCanvas.h"
15 16
16 namespace cc { 17 namespace cc {
17 18
18 TileTaskWorkerPool::TileTaskWorkerPool() {} 19 TileTaskWorkerPool::TileTaskWorkerPool() {}
19 20
20 TileTaskWorkerPool::~TileTaskWorkerPool() {} 21 TileTaskWorkerPool::~TileTaskWorkerPool() {}
(...skipping 16 matching lines...) Expand all
37 } 38 }
38 } 39 }
39 40
40 namespace { 41 namespace {
41 42
42 bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { 43 bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) {
43 switch (format) { 44 switch (format) {
44 case RGBA_4444: 45 case RGBA_4444:
45 case RGBA_8888: 46 case RGBA_8888:
46 case BGRA_8888: 47 case BGRA_8888:
48 case ETC1:
47 return true; 49 return true;
48 case ALPHA_8: 50 case ALPHA_8:
49 case LUMINANCE_8: 51 case LUMINANCE_8:
50 case RGB_565: 52 case RGB_565:
51 case ETC1:
52 case RED_8: 53 case RED_8:
53 case LUMINANCE_F16: 54 case LUMINANCE_F16:
54 return false; 55 return false;
55 } 56 }
56 NOTREACHED(); 57 NOTREACHED();
57 return false; 58 return false;
58 } 59 }
59 60
60 class SkipImageCanvas : public SkPaintFilterCanvas { 61 class SkipImageCanvas : public SkPaintFilterCanvas {
61 public: 62 public:
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 const gfx::Rect& canvas_playback_rect, 110 const gfx::Rect& canvas_playback_rect,
110 float scale, 111 float scale,
111 bool include_images) { 112 bool include_images) {
112 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory"); 113 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory");
113 114
114 DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format; 115 DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format;
115 116
116 // Uses kPremul_SkAlphaType since the result is not known to be opaque. 117 // Uses kPremul_SkAlphaType since the result is not known to be opaque.
117 SkImageInfo info = 118 SkImageInfo info =
118 SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); 119 SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType);
119 SkColorType buffer_color_type = ResourceFormatToSkColorType(format);
120 bool needs_copy = buffer_color_type != info.colorType();
121 120
122 // Use unknown pixel geometry to disable LCD text. 121 // Use unknown pixel geometry to disable LCD text.
123 SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); 122 SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry);
124 if (raster_source->CanUseLCDText()) { 123 if (raster_source->CanUseLCDText()) {
125 // LegacyFontHost will get LCD text and skia figures out what type to use. 124 // LegacyFontHost will get LCD text and skia figures out what type to use.
126 surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType); 125 surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType);
127 } 126 }
128 127
129 if (!stride) 128 if (!stride)
130 stride = info.minRowBytes(); 129 stride = info.minRowBytes();
131 DCHECK_GT(stride, 0u); 130 DCHECK_GT(stride, 0u);
132 131
133 if (!needs_copy) {
134 skia::RefPtr<SkSurface> surface = skia::AdoptRef(
135 SkSurface::NewRasterDirect(info, memory, stride, &surface_props));
136 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images);
137 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect,
138 canvas_playback_rect, scale);
139 return;
140 }
141
142 skia::RefPtr<SkSurface> surface =
143 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props));
144 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images);
145 // TODO(reveman): Improve partial raster support by reducing the size of
146 // playback rect passed to PlaybackToCanvas. crbug.com/519070
147 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect,
148 canvas_bitmap_rect, scale);
149
150 { 132 {
151 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels"); 133 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels");
152 134
153 SkImageInfo dst_info = 135 switch (format) {
154 SkImageInfo::Make(info.width(), info.height(), buffer_color_type, 136 case RGBA_8888:
155 info.alphaType(), info.profileType()); 137 case BGRA_8888: {
156 bool rv = surface->getCanvas()->readPixels(dst_info, memory, stride, 0, 0); 138 skia::RefPtr<SkSurface> surface = skia::AdoptRef(
157 DCHECK(rv); 139 SkSurface::NewRasterDirect(info, memory, stride, &surface_props));
140 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images);
141 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect,
142 canvas_playback_rect, scale);
143 return;
144 }
145 case RGBA_4444:
146 case ETC1: {
147 skia::RefPtr<SkSurface> surface =
148 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props));
149 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images);
150 // TODO(reveman): Improve partial raster support by reducing the size of
151 // playback rect passed to PlaybackToCanvas. crbug.com/519070
152 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect,
153 canvas_bitmap_rect, scale);
154
155 if (format == ETC1) {
156 DCHECK_EQ(size.width() % 4, 0);
157 DCHECK_EQ(size.height() % 4, 0);
158 scoped_ptr<TextureCompressor> texture_compressor =
159 TextureCompressor::Create(TextureCompressor::kFormatETC1);
160 texture_compressor->Compress(
161 reinterpret_cast<const uint8_t*>(
162 surface->peekPixels(nullptr, nullptr)),
163 reinterpret_cast<uint8_t*>(memory), size.width(), size.height(),
164 TextureCompressor::kQualityHigh);
165 } else {
166 SkImageInfo dst_info = SkImageInfo::Make(
167 info.width(), info.height(), ResourceFormatToSkColorType(format),
168 info.alphaType(), info.profileType());
169 bool rv =
170 surface->getCanvas()->readPixels(dst_info, memory, stride, 0, 0);
171 DCHECK(rv);
172 }
173 return;
174 }
175 case ALPHA_8:
176 case LUMINANCE_8:
177 case RGB_565:
178 case RED_8:
179 case LUMINANCE_F16:
180 NOTREACHED();
181 return;
182 }
183
184 NOTREACHED();
158 } 185 }
159 } 186 }
160 187
161 } // namespace cc 188 } // namespace cc
OLDNEW
« no previous file with comments | « cc/raster/one_copy_tile_task_worker_pool.cc ('k') | cc/raster/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698