1 // Copyright 2015 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.
5 #include "cc/raster/gpu_rasterizer.h"
10 #include "base/metrics/histogram.h"
11 #include "base/trace_event/trace_event.h"
12 #include "cc/debug/devtools_instrumentation.h"
13 #include "cc/debug/frame_viewer_instrumentation.h"
14 #include "cc/output/context_provider.h"
15 #include "cc/playback/raster_source.h"
16 #include "cc/raster/raster_buffer.h"
17 #include "cc/raster/scoped_gpu_raster.h"
18 #include "cc/resources/resource.h"
19 #include "cc/resources/resource_provider.h"
20 #include "cc/tiles/tile_manager.h"
21 #include "gpu/command_buffer/client/gles2_interface.h"
22 #include "third_party/skia/include/core/SkMultiPictureDraw.h"
23 #include "third_party/skia/include/core/SkPictureRecorder.h"
24 #include "third_party/skia/include/core/SkSurface.h"
25 #include "third_party/skia/include/gpu/GrContext.h"
29 GpuRasterizer::GpuRasterizer(ContextProvider
* context_provider
,
30 ResourceProvider
* resource_provider
,
31 bool use_distance_field_text
,
32 int msaa_sample_count
)
33 : resource_provider_(resource_provider
),
34 use_distance_field_text_(use_distance_field_text
),
35 msaa_sample_count_(msaa_sample_count
) {
38 GpuRasterizer::~GpuRasterizer() {
41 void GpuRasterizer::RasterizeSource(
42 ResourceProvider::ScopedWriteLockGr
* write_lock
,
43 const RasterSource
* raster_source
,
44 const gfx::Rect
& raster_full_rect
,
45 const gfx::Rect
& playback_rect
,
47 // Play back raster_source into temp SkPicture.
48 SkPictureRecorder recorder
;
49 gfx::Size size
= write_lock
->resource()->size
;
50 const int flags
= SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag
;
51 skia::RefPtr
<SkCanvas
> canvas
= skia::SharePtr(
52 recorder
.beginRecording(size
.width(), size
.height(), NULL
, flags
));
54 raster_source
->PlaybackToCanvas(canvas
.get(), raster_full_rect
, playback_rect
,
57 skia::RefPtr
<SkPicture
> picture
=
58 skia::AdoptRef(recorder
.endRecordingAsPicture());
60 // Turn on distance fields for layers that have ever animated.
61 bool use_distance_field_text
=
62 use_distance_field_text_
||
63 raster_source
->ShouldAttemptToUseDistanceFieldText();
65 // Playback picture into resource.
67 ScopedGpuRaster
gpu_raster(
68 resource_provider_
->output_surface()->worker_context_provider());
69 write_lock
->InitSkSurface(use_distance_field_text
,
70 raster_source
->CanUseLCDText(),
73 SkSurface
* sk_surface
= write_lock
->sk_surface();
75 // Allocating an SkSurface will fail after a lost context. Pretend we
76 // rasterized, as the contents of the resource don't matter anymore.
80 SkMultiPictureDraw multi_picture_draw
;
81 multi_picture_draw
.add(sk_surface
->getCanvas(), picture
.get());
82 multi_picture_draw
.draw(msaa_sample_count_
> 0);
83 write_lock
->ReleaseSkSurface();