| 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 |