prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 1 | // 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" |
Xu Xing | c101c86 | 2017-08-24 17:26:45 | [diff] [blame] | 16 | #include "cc/resources/layer_tree_resource_provider.h" |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 17 | #include "cc/resources/resource.h" |
Fady Samuel | 555c8d1 | 2017-07-07 23:14:09 | [diff] [blame] | 18 | #include "components/viz/common/resources/platform_color.h" |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 19 | #include "ui/gfx/buffer_format_util.h" |
| 20 | #include "ui/gfx/gpu_memory_buffer.h" |
| 21 | |
| 22 | namespace cc { |
| 23 | namespace { |
| 24 | |
Daniel Bratell | 1bddcb33 | 2017-11-21 11:08:29 | [diff] [blame] | 25 | class ZeroCopyRasterBufferImpl : public RasterBuffer { |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 26 | public: |
Daniel Bratell | 1bddcb33 | 2017-11-21 11:08:29 | [diff] [blame] | 27 | ZeroCopyRasterBufferImpl(LayerTreeResourceProvider* resource_provider, |
| 28 | const Resource* resource) |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 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, |
trchen | 178ac91 | 2017-04-04 10:11:10 | [diff] [blame] | 37 | const gfx::AxisTransform2d& transform, |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 38 | const RasterSource::PlaybackSettings& playback_settings) override { |
prashant.n | 60e135b0 | 2016-06-08 04:12:23 | [diff] [blame] | 39 | TRACE_EVENT0("cc", "ZeroCopyRasterBuffer::Playback"); |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 40 | 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 | |
| 51 | // TODO(danakj): Implement partial raster with raster_dirty_rect. |
| 52 | RasterBufferProvider::PlaybackToMemory( |
| 53 | buffer->memory(0), resource_->format(), resource_->size(), |
| 54 | buffer->stride(0), raster_source, raster_full_rect, raster_full_rect, |
trchen | 178ac91 | 2017-04-04 10:11:10 | [diff] [blame] | 55 | transform, lock_.color_space_for_raster(), playback_settings); |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 56 | buffer->Unmap(); |
| 57 | } |
| 58 | |
| 59 | private: |
Xu Xing | c101c86 | 2017-08-24 17:26:45 | [diff] [blame] | 60 | LayerTreeResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_; |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 61 | const Resource* resource_; |
| 62 | |
Daniel Bratell | 1bddcb33 | 2017-11-21 11:08:29 | [diff] [blame] | 63 | DISALLOW_COPY_AND_ASSIGN(ZeroCopyRasterBufferImpl); |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 64 | }; |
| 65 | |
| 66 | } // namespace |
| 67 | |
| 68 | // static |
| 69 | std::unique_ptr<RasterBufferProvider> ZeroCopyRasterBufferProvider::Create( |
Xu Xing | c101c86 | 2017-08-24 17:26:45 | [diff] [blame] | 70 | LayerTreeResourceProvider* resource_provider, |
Fady Samuel | 555c8d1 | 2017-07-07 23:14:09 | [diff] [blame] | 71 | viz::ResourceFormat preferred_tile_format) { |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 72 | return base::WrapUnique<RasterBufferProvider>( |
| 73 | new ZeroCopyRasterBufferProvider(resource_provider, |
| 74 | preferred_tile_format)); |
| 75 | } |
| 76 | |
| 77 | ZeroCopyRasterBufferProvider::ZeroCopyRasterBufferProvider( |
Xu Xing | c101c86 | 2017-08-24 17:26:45 | [diff] [blame] | 78 | LayerTreeResourceProvider* resource_provider, |
Fady Samuel | 555c8d1 | 2017-07-07 23:14:09 | [diff] [blame] | 79 | viz::ResourceFormat preferred_tile_format) |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 80 | : resource_provider_(resource_provider), |
| 81 | preferred_tile_format_(preferred_tile_format) {} |
| 82 | |
Chris Watkins | f635329 | 2017-12-04 02:36:05 | [diff] [blame^] | 83 | ZeroCopyRasterBufferProvider::~ZeroCopyRasterBufferProvider() = default; |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 84 | |
| 85 | std::unique_ptr<RasterBuffer> |
| 86 | ZeroCopyRasterBufferProvider::AcquireBufferForRaster( |
| 87 | const Resource* resource, |
| 88 | uint64_t resource_content_id, |
| 89 | uint64_t previous_content_id) { |
| 90 | return base::WrapUnique<RasterBuffer>( |
Daniel Bratell | 1bddcb33 | 2017-11-21 11:08:29 | [diff] [blame] | 91 | new ZeroCopyRasterBufferImpl(resource_provider_, resource)); |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 92 | } |
| 93 | |
sunnyps | 12074d3d | 2016-06-21 01:57:48 | [diff] [blame] | 94 | void ZeroCopyRasterBufferProvider::OrderingBarrier() { |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 95 | // No need to sync resources as this provider does not use GL context. |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 96 | } |
| 97 | |
Sunny Sachanandani | 5f5419e2 | 2017-05-12 20:35:30 | [diff] [blame] | 98 | void ZeroCopyRasterBufferProvider::Flush() {} |
| 99 | |
Fady Samuel | 555c8d1 | 2017-07-07 23:14:09 | [diff] [blame] | 100 | viz::ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat( |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 101 | bool must_support_alpha) const { |
ericrk | d03c005d | 2017-03-24 18:48:52 | [diff] [blame] | 102 | if (resource_provider_->IsTextureFormatSupported(preferred_tile_format_) && |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 103 | (DoesResourceFormatSupportAlpha(preferred_tile_format_) || |
| 104 | !must_support_alpha)) { |
| 105 | return preferred_tile_format_; |
| 106 | } |
| 107 | |
| 108 | return resource_provider_->best_texture_format(); |
| 109 | } |
| 110 | |
ericrk | eeda5899 | 2016-07-07 02:34:27 | [diff] [blame] | 111 | bool ZeroCopyRasterBufferProvider::IsResourceSwizzleRequired( |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 112 | bool must_support_alpha) const { |
| 113 | return ResourceFormatRequiresSwizzle(GetResourceFormat(must_support_alpha)); |
| 114 | } |
| 115 | |
ericrk | 5ac42f32 | 2016-07-14 01:06:51 | [diff] [blame] | 116 | bool ZeroCopyRasterBufferProvider::CanPartialRasterIntoProvidedResource() |
| 117 | const { |
ericrk | eeda5899 | 2016-07-07 02:34:27 | [diff] [blame] | 118 | return false; |
| 119 | } |
| 120 | |
ericrk | 7f6a27f | 2017-01-31 22:34:32 | [diff] [blame] | 121 | bool ZeroCopyRasterBufferProvider::IsResourceReadyToDraw( |
Fady Samuel | c80a4a86 | 2017-07-28 10:23:36 | [diff] [blame] | 122 | viz::ResourceId resource_id) const { |
ericrk | 7f6a27f | 2017-01-31 22:34:32 | [diff] [blame] | 123 | // Zero-copy resources are immediately ready to draw. |
| 124 | return true; |
| 125 | } |
| 126 | |
| 127 | uint64_t ZeroCopyRasterBufferProvider::SetReadyToDrawCallback( |
| 128 | const ResourceProvider::ResourceIdArray& resource_ids, |
| 129 | const base::Closure& callback, |
| 130 | uint64_t pending_callback_id) const { |
| 131 | // Zero-copy resources are immediately ready to draw. |
| 132 | return 0; |
| 133 | } |
| 134 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 135 | void ZeroCopyRasterBufferProvider::Shutdown() {} |
| 136 | |
| 137 | } // namespace cc |