[go: nahoru, domu]

blob: 93e8d7e13f07440d2bb6982b62466a5f0cc436d4 [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,
37 float scale,
38 const RasterSource::PlaybackSettings& playback_settings) override {
39 gfx::GpuMemoryBuffer* buffer = lock_.GetGpuMemoryBuffer();
40 if (!buffer)
41 return;
42
43 DCHECK_EQ(1u, gfx::NumberOfPlanesForBufferFormat(buffer->GetFormat()));
44 bool rv = buffer->Map();
45 DCHECK(rv);
46 DCHECK(buffer->memory(0));
47 // RasterBufferProvider::PlaybackToMemory only supports unsigned strides.
48 DCHECK_GE(buffer->stride(0), 0);
49
50 // TODO(danakj): Implement partial raster with raster_dirty_rect.
51 RasterBufferProvider::PlaybackToMemory(
52 buffer->memory(0), resource_->format(), resource_->size(),
53 buffer->stride(0), raster_source, raster_full_rect, raster_full_rect,
54 scale, playback_settings);
55 buffer->Unmap();
56 }
57
58 private:
59 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_;
60 const Resource* resource_;
61
62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
63};
64
65} // namespace
66
67// static
68std::unique_ptr<RasterBufferProvider> ZeroCopyRasterBufferProvider::Create(
69 ResourceProvider* resource_provider,
70 ResourceFormat preferred_tile_format) {
71 return base::WrapUnique<RasterBufferProvider>(
72 new ZeroCopyRasterBufferProvider(resource_provider,
73 preferred_tile_format));
74}
75
76ZeroCopyRasterBufferProvider::ZeroCopyRasterBufferProvider(
77 ResourceProvider* resource_provider,
78 ResourceFormat preferred_tile_format)
79 : resource_provider_(resource_provider),
80 preferred_tile_format_(preferred_tile_format) {}
81
82ZeroCopyRasterBufferProvider::~ZeroCopyRasterBufferProvider() {}
83
84std::unique_ptr<RasterBuffer>
85ZeroCopyRasterBufferProvider::AcquireBufferForRaster(
86 const Resource* resource,
87 uint64_t resource_content_id,
88 uint64_t previous_content_id) {
89 return base::WrapUnique<RasterBuffer>(
90 new RasterBufferImpl(resource_provider_, resource));
91}
92
93void ZeroCopyRasterBufferProvider::ReleaseBufferForRaster(
94 std::unique_ptr<RasterBuffer> buffer) {
95 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
96}
97
98void ZeroCopyRasterBufferProvider::OrderingBarrier() {
99 // No need to sync resources as this provider does not use GL context.
100}
101
102ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat(
103 bool must_support_alpha) const {
104 if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) &&
105 (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
106 !must_support_alpha)) {
107 return preferred_tile_format_;
108 }
109
110 return resource_provider_->best_texture_format();
111}
112
113bool ZeroCopyRasterBufferProvider::GetResourceRequiresSwizzle(
114 bool must_support_alpha) const {
115 return ResourceFormatRequiresSwizzle(GetResourceFormat(must_support_alpha));
116}
117
118void ZeroCopyRasterBufferProvider::Shutdown() {}
119
120} // namespace cc