Index: cc/raster/gpu_rasterizer.cc |
diff --git a/cc/raster/gpu_rasterizer.cc b/cc/raster/gpu_rasterizer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..827235b2af8c490319448b5705608af270b276cd |
--- /dev/null |
+++ b/cc/raster/gpu_rasterizer.cc |
@@ -0,0 +1,87 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cc/raster/gpu_rasterizer.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/bind.h" |
+#include "base/metrics/histogram.h" |
+#include "base/trace_event/trace_event.h" |
+#include "cc/debug/devtools_instrumentation.h" |
+#include "cc/debug/frame_viewer_instrumentation.h" |
+#include "cc/output/context_provider.h" |
+#include "cc/playback/raster_source.h" |
+#include "cc/raster/raster_buffer.h" |
+#include "cc/raster/scoped_gpu_raster.h" |
+#include "cc/resources/resource.h" |
+#include "cc/tiles/tile_manager.h" |
+#include "gpu/command_buffer/client/gles2_interface.h" |
+#include "third_party/skia/include/core/SkMultiPictureDraw.h" |
+#include "third_party/skia/include/core/SkPictureRecorder.h" |
+#include "third_party/skia/include/core/SkSurface.h" |
+#include "third_party/skia/include/gpu/GrContext.h" |
+ |
+namespace cc { |
+ |
+GpuRasterizer::GpuRasterizer(ContextProvider* worker_context_provider, |
+ ResourceProvider* resource_provider, |
+ bool use_distance_field_text, |
+ int msaa_sample_count) |
+ : worker_context_provider_(worker_context_provider), |
+ resource_provider_(resource_provider), |
+ use_distance_field_text_(use_distance_field_text), |
+ msaa_sample_count_(msaa_sample_count) { |
+ DCHECK(worker_context_provider_); |
+} |
+ |
+GpuRasterizer::~GpuRasterizer() { |
+} |
+ |
+void GpuRasterizer::RasterizeSource( |
+ ResourceProvider::ScopedWriteLockGr* write_lock, |
+ const RasterSource* raster_source, |
+ const gfx::Rect& raster_full_rect, |
+ const gfx::Rect& playback_rect, |
+ float scale, |
+ const RasterSource::PlaybackSettings& playback_settings) { |
+ // Play back raster_source into temp SkPicture. |
+ SkPictureRecorder recorder; |
+ const gfx::Size size = write_lock->GetResourceSize(); |
+ const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; |
+ sk_sp<SkCanvas> canvas = sk_ref_sp( |
+ recorder.beginRecording(size.width(), size.height(), NULL, flags)); |
+ canvas->save(); |
+ raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect, |
+ scale, playback_settings); |
+ canvas->restore(); |
+ sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); |
+ |
+ // Turn on distance fields for layers that have ever animated. |
+ bool use_distance_field_text = |
+ use_distance_field_text_ || |
+ raster_source->ShouldAttemptToUseDistanceFieldText(); |
+ |
+ // Playback picture into resource. |
+ { |
+ ScopedGpuRaster gpu_raster(worker_context_provider_); |
+ write_lock->InitSkSurface( |
+ worker_context_provider_->GrContext(), use_distance_field_text, |
+ raster_source->CanUseLCDText(), msaa_sample_count_); |
+ |
+ SkSurface* sk_surface = write_lock->sk_surface(); |
+ |
+ // Allocating an SkSurface will fail after a lost context. Pretend we |
+ // rasterized, as the contents of the resource don't matter anymore. |
+ if (!sk_surface) |
+ return; |
+ |
+ SkMultiPictureDraw multi_picture_draw; |
+ multi_picture_draw.add(sk_surface->getCanvas(), picture.get()); |
+ multi_picture_draw.draw(false); |
+ write_lock->ReleaseSkSurface(); |
+ } |
+} |
+ |
+} // namespace cc |