[go: nahoru, domu]

blob: 95bf983ae2ae4016725f6469b26c0a0ede457d06 [file] [log] [blame]
reveman@chromium.orgb5641b92014-02-15 14:21:581// Copyright 2014 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
prashant.nb4d4f492016-04-29 12:51:285#include "cc/raster/gpu_raster_buffer_provider.h"
reveman@chromium.orgb5641b92014-02-15 14:21:586
avi02a4d172015-12-21 06:14:367#include <stdint.h>
8
ernstm69fedbd2014-09-18 01:23:419#include <algorithm>
10
avi02a4d172015-12-21 06:14:3611#include "base/macros.h"
danakj60bc3bc2016-04-09 00:24:4812#include "base/memory/ptr_util.h"
ssid904ce3b2015-01-27 15:20:1613#include "base/trace_event/trace_event.h"
vmpstr41d68f82016-03-30 01:20:2314#include "cc/playback/raster_source.h"
danakj920156852015-05-18 20:22:2915#include "cc/raster/gpu_rasterizer.h"
danakj920156852015-05-18 20:22:2916#include "cc/raster/scoped_gpu_raster.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5817#include "cc/resources/resource.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5818#include "gpu/command_buffer/client/gles2_interface.h"
hendrikw04cea972014-09-23 20:50:5319#include "third_party/skia/include/core/SkMultiPictureDraw.h"
20#include "third_party/skia/include/core/SkPictureRecorder.h"
reveman47560ab2014-09-18 19:39:2121#include "third_party/skia/include/core/SkSurface.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5822#include "third_party/skia/include/gpu/GrContext.h"
23
24namespace cc {
reveman47560ab2014-09-18 19:39:2125namespace {
26
27class RasterBufferImpl : public RasterBuffer {
28 public:
danakj05d69002015-06-02 01:42:2029 RasterBufferImpl(GpuRasterizer* rasterizer,
30 const Resource* resource,
31 uint64_t resource_content_id,
32 uint64_t previous_content_id)
vmiura78b69282015-02-14 00:01:1733 : rasterizer_(rasterizer),
34 lock_(rasterizer->resource_provider(), resource->id()),
danakj05d69002015-06-02 01:42:2035 resource_has_previous_content_(
36 resource_content_id && resource_content_id == previous_content_id) {
37 }
reveman47560ab2014-09-18 19:39:2138
39 // Overridden from RasterBuffer:
vmpstr3f9000d42016-04-01 20:33:2740 void Playback(
41 const RasterSource* raster_source,
42 const gfx::Rect& raster_full_rect,
43 const gfx::Rect& raster_dirty_rect,
44 uint64_t new_content_id,
45 float scale,
46 const RasterSource::PlaybackSettings& playback_settings) override {
vmiura78b69282015-02-14 00:01:1747 TRACE_EVENT0("cc", "RasterBufferImpl::Playback");
danakjdc1dfb42015-08-06 00:25:4048 // GPU raster doesn't do low res tiles, so should always include images.
vmpstr3f9000d42016-04-01 20:33:2749 DCHECK(!playback_settings.skip_images);
vmiura78b69282015-02-14 00:01:1750
danakj0de0c95a2016-05-25 01:42:4951 ContextProvider::ScopedContextLock scoped_context(
52 rasterizer_->worker_context_provider());
vmiura78b69282015-02-14 00:01:1753
danakj05d69002015-06-02 01:42:2054 gfx::Rect playback_rect = raster_full_rect;
55 if (resource_has_previous_content_) {
56 playback_rect.Intersect(raster_dirty_rect);
57 }
58 DCHECK(!playback_rect.IsEmpty())
59 << "Why are we rastering a tile that's not dirty?";
60
danakje0b54782015-05-29 22:47:5261 // TODO(danakj): Implement partial raster with raster_dirty_rect.
vmiura78b69282015-02-14 00:01:1762 // Rasterize source into resource.
danakje0b54782015-05-29 22:47:5263 rasterizer_->RasterizeSource(&lock_, raster_source, raster_full_rect,
vmpstr3f9000d42016-04-01 20:33:2764 playback_rect, scale, playback_settings);
vmiura78b69282015-02-14 00:01:1765
dyen41651cd2016-02-06 00:08:4766 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
67 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
68
vmiura78b69282015-02-14 00:01:1769 // Barrier to sync worker context output to cc context.
dyen41651cd2016-02-06 00:08:4770 gl->OrderingBarrierCHROMIUM();
71
72 // Generate sync token after the barrier for cross context synchronization.
73 gpu::SyncToken sync_token;
74 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
75 lock_.UpdateResourceSyncToken(sync_token);
reveman47560ab2014-09-18 19:39:2176 }
77
78 private:
vmiura78b69282015-02-14 00:01:1779 GpuRasterizer* rasterizer_;
80 ResourceProvider::ScopedWriteLockGr lock_;
danakj05d69002015-06-02 01:42:2081 bool resource_has_previous_content_;
vmiura78b69282015-02-14 00:01:1782
reveman47560ab2014-09-18 19:39:2183 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
84};
85
86} // namespace
vmiura78b69282015-02-14 00:01:1787
prashant.nb4d4f492016-04-29 12:51:2888GpuRasterBufferProvider::GpuRasterBufferProvider(
danakj0de0c95a2016-05-25 01:42:4989 ContextProvider* compositor_context_provider,
90 ContextProvider* worker_context_provider,
hendrikw59d449482015-04-04 00:44:3291 ResourceProvider* resource_provider,
92 bool use_distance_field_text,
93 int gpu_rasterization_msaa_sample_count)
danakj0de0c95a2016-05-25 01:42:4994 : compositor_context_provider_(compositor_context_provider),
95 rasterizer_(new GpuRasterizer(worker_context_provider,
hendrikw59d449482015-04-04 00:44:3296 resource_provider,
97 use_distance_field_text,
danakj0de0c95a2016-05-25 01:42:4998 gpu_rasterization_msaa_sample_count)) {
99 DCHECK(compositor_context_provider_);
100}
reveman@chromium.orgb5641b92014-02-15 14:21:58101
prashant.nb4d4f492016-04-29 12:51:28102GpuRasterBufferProvider::~GpuRasterBufferProvider() {}
reveman@chromium.orgec7541d2014-04-09 01:23:53103
prashant.nb4d4f492016-04-29 12:51:28104std::unique_ptr<RasterBuffer> GpuRasterBufferProvider::AcquireBufferForRaster(
danakje0b54782015-05-29 22:47:52105 const Resource* resource,
danakj510822aa2015-06-01 20:23:02106 uint64_t resource_content_id,
danakje0b54782015-05-29 22:47:52107 uint64_t previous_content_id) {
danakj60bc3bc2016-04-09 00:24:48108 return std::unique_ptr<RasterBuffer>(new RasterBufferImpl(
danakj05d69002015-06-02 01:42:20109 rasterizer_.get(), resource, resource_content_id, previous_content_id));
reveman@chromium.orgb5641b92014-02-15 14:21:58110}
111
prashant.nb4d4f492016-04-29 12:51:28112void GpuRasterBufferProvider::ReleaseBufferForRaster(
danakj60bc3bc2016-04-09 00:24:48113 std::unique_ptr<RasterBuffer> buffer) {
reveman47560ab2014-09-18 19:39:21114 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
reveman@chromium.orgb5641b92014-02-15 14:21:58115}
116
prashant.nb4d4f492016-04-29 12:51:28117void GpuRasterBufferProvider::OrderingBarrier() {
118 TRACE_EVENT0("cc", "GpuRasterBufferProvider::OrderingBarrier");
danakj0de0c95a2016-05-25 01:42:49119 compositor_context_provider_->ContextGL()->OrderingBarrierCHROMIUM();
prashant.nb4d4f492016-04-29 12:51:28120}
121
122ResourceFormat GpuRasterBufferProvider::GetResourceFormat(
123 bool must_support_alpha) const {
124 return rasterizer_->resource_provider()->best_render_buffer_format();
125}
126
127bool GpuRasterBufferProvider::GetResourceRequiresSwizzle(
128 bool must_support_alpha) const {
129 // This doesn't require a swizzle because we rasterize to the correct format.
130 return false;
131}
132
133void GpuRasterBufferProvider::Shutdown() {}
134
reveman@chromium.orgb5641b92014-02-15 14:21:58135} // namespace cc