[go: nahoru, domu]

blob: a4d02c65713be7215a883b8af470e1e5d9c22f2c [file] [log] [blame]
prashant.nb4d4f492016-04-29 12:51:281// 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/zero_copy_raster_buffer_provider.h"
6
7#include <stdint.h>
8
9#include <algorithm>
10
11#include "base/macros.h"
12#include "base/memory/ptr_util.h"
13#include "base/strings/stringprintf.h"
14#include "base/trace_event/trace_event.h"
15#include "base/trace_event/trace_event_argument.h"
16#include "cc/debug/traced_value.h"
17#include "cc/resources/platform_color.h"
18#include "cc/resources/resource.h"
19#include "ui/gfx/buffer_format_util.h"
20#include "ui/gfx/gpu_memory_buffer.h"
21
22namespace cc {
23namespace {
24
25class RasterBufferImpl : public RasterBuffer {
26 public:
27 RasterBufferImpl(ResourceProvider* resource_provider,
28 const Resource* resource)
29 : lock_(resource_provider, resource->id()), resource_(resource) {}
30
31 // Overridden from RasterBuffer:
32 void Playback(
33 const RasterSource* raster_source,
34 const gfx::Rect& raster_full_rect,
35 const gfx::Rect& raster_dirty_rect,
36 uint64_t new_content_id,
vmpstr69c12082017-01-13 01:52:4337 float scale,
prashant.nb4d4f492016-04-29 12:51:2838 const RasterSource::PlaybackSettings& playback_settings) override {
prashant.n60e135b02016-06-08 04:12:2339 TRACE_EVENT0("cc", "ZeroCopyRasterBuffer::Playback");
prashant.nb4d4f492016-04-29 12:51:2840 gfx::GpuMemoryBuffer* buffer = lock_.GetGpuMemoryBuffer();
41 if (!buffer)
42 return;
43
44 DCHECK_EQ(1u, gfx::NumberOfPlanesForBufferFormat(buffer->GetFormat()));
45 bool rv = buffer->Map();
46 DCHECK(rv);
47 DCHECK(buffer->memory(0));
48 // RasterBufferProvider::PlaybackToMemory only supports unsigned strides.
49 DCHECK_GE(buffer->stride(0), 0);
50
ccameronb7210d32016-11-30 11:02:4051 sk_sp<SkColorSpace> raster_color_space =
52 raster_source->HasImpliedColorSpace() ? nullptr
53 : lock_.sk_color_space();
54
prashant.nb4d4f492016-04-29 12:51:2855 // TODO(danakj): Implement partial raster with raster_dirty_rect.
56 RasterBufferProvider::PlaybackToMemory(
57 buffer->memory(0), resource_->format(), resource_->size(),
58 buffer->stride(0), raster_source, raster_full_rect, raster_full_rect,
vmpstr69c12082017-01-13 01:52:4359 scale, raster_color_space, playback_settings);
prashant.nb4d4f492016-04-29 12:51:2860 buffer->Unmap();
61 }
62
63 private:
64 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_;
65 const Resource* resource_;
66
67 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
68};
69
70} // namespace
71
72// static
73std::unique_ptr<RasterBufferProvider> ZeroCopyRasterBufferProvider::Create(
74 ResourceProvider* resource_provider,
75 ResourceFormat preferred_tile_format) {
76 return base::WrapUnique<RasterBufferProvider>(
77 new ZeroCopyRasterBufferProvider(resource_provider,
78 preferred_tile_format));
79}
80
81ZeroCopyRasterBufferProvider::ZeroCopyRasterBufferProvider(
82 ResourceProvider* resource_provider,
83 ResourceFormat preferred_tile_format)
84 : resource_provider_(resource_provider),
85 preferred_tile_format_(preferred_tile_format) {}
86
87ZeroCopyRasterBufferProvider::~ZeroCopyRasterBufferProvider() {}
88
89std::unique_ptr<RasterBuffer>
90ZeroCopyRasterBufferProvider::AcquireBufferForRaster(
91 const Resource* resource,
92 uint64_t resource_content_id,
93 uint64_t previous_content_id) {
94 return base::WrapUnique<RasterBuffer>(
95 new RasterBufferImpl(resource_provider_, resource));
96}
97
98void ZeroCopyRasterBufferProvider::ReleaseBufferForRaster(
99 std::unique_ptr<RasterBuffer> buffer) {
100 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
101}
102
sunnyps12074d3d2016-06-21 01:57:48103void ZeroCopyRasterBufferProvider::OrderingBarrier() {
prashant.nb4d4f492016-04-29 12:51:28104 // No need to sync resources as this provider does not use GL context.
prashant.nb4d4f492016-04-29 12:51:28105}
106
107ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat(
108 bool must_support_alpha) const {
109 if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) &&
110 (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
111 !must_support_alpha)) {
112 return preferred_tile_format_;
113 }
114
115 return resource_provider_->best_texture_format();
116}
117
ericrkeeda58992016-07-07 02:34:27118bool ZeroCopyRasterBufferProvider::IsResourceSwizzleRequired(
prashant.nb4d4f492016-04-29 12:51:28119 bool must_support_alpha) const {
120 return ResourceFormatRequiresSwizzle(GetResourceFormat(must_support_alpha));
121}
122
ericrk5ac42f322016-07-14 01:06:51123bool ZeroCopyRasterBufferProvider::CanPartialRasterIntoProvidedResource()
124 const {
ericrkeeda58992016-07-07 02:34:27125 return false;
126}
127
ericrk7f6a27f2017-01-31 22:34:32128bool ZeroCopyRasterBufferProvider::IsResourceReadyToDraw(
129 ResourceId resource_id) const {
130 // Zero-copy resources are immediately ready to draw.
131 return true;
132}
133
134uint64_t ZeroCopyRasterBufferProvider::SetReadyToDrawCallback(
135 const ResourceProvider::ResourceIdArray& resource_ids,
136 const base::Closure& callback,
137 uint64_t pending_callback_id) const {
138 // Zero-copy resources are immediately ready to draw.
139 return 0;
140}
141
prashant.nb4d4f492016-04-29 12:51:28142void ZeroCopyRasterBufferProvider::Shutdown() {}
143
144} // namespace cc