reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 1 | // 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.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 5 | #include "cc/raster/gpu_raster_buffer_provider.h" |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 6 | |
avi | 02a4d17 | 2015-12-21 06:14:36 | [diff] [blame] | 7 | #include <stdint.h> |
| 8 | |
ernstm | 69fedbd | 2014-09-18 01:23:41 | [diff] [blame] | 9 | #include <algorithm> |
| 10 | |
avi | 02a4d17 | 2015-12-21 06:14:36 | [diff] [blame] | 11 | #include "base/macros.h" |
danakj | 60bc3bc | 2016-04-09 00:24:48 | [diff] [blame] | 12 | #include "base/memory/ptr_util.h" |
ssid | 904ce3b | 2015-01-27 15:20:16 | [diff] [blame] | 13 | #include "base/trace_event/trace_event.h" |
vmpstr | 41d68f8 | 2016-03-30 01:20:23 | [diff] [blame] | 14 | #include "cc/playback/raster_source.h" |
danakj | 92015685 | 2015-05-18 20:22:29 | [diff] [blame] | 15 | #include "cc/raster/gpu_rasterizer.h" |
danakj | 92015685 | 2015-05-18 20:22:29 | [diff] [blame] | 16 | #include "cc/raster/scoped_gpu_raster.h" |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 17 | #include "cc/resources/resource.h" |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 18 | #include "gpu/command_buffer/client/gles2_interface.h" |
hendrikw | 04cea97 | 2014-09-23 20:50:53 | [diff] [blame] | 19 | #include "third_party/skia/include/core/SkMultiPictureDraw.h" |
| 20 | #include "third_party/skia/include/core/SkPictureRecorder.h" |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 21 | #include "third_party/skia/include/core/SkSurface.h" |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 22 | #include "third_party/skia/include/gpu/GrContext.h" |
| 23 | |
| 24 | namespace cc { |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 25 | namespace { |
| 26 | |
| 27 | class RasterBufferImpl : public RasterBuffer { |
| 28 | public: |
danakj | 05d6900 | 2015-06-02 01:42:20 | [diff] [blame] | 29 | RasterBufferImpl(GpuRasterizer* rasterizer, |
| 30 | const Resource* resource, |
| 31 | uint64_t resource_content_id, |
| 32 | uint64_t previous_content_id) |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 33 | : rasterizer_(rasterizer), |
| 34 | lock_(rasterizer->resource_provider(), resource->id()), |
danakj | 05d6900 | 2015-06-02 01:42:20 | [diff] [blame] | 35 | resource_has_previous_content_( |
| 36 | resource_content_id && resource_content_id == previous_content_id) { |
| 37 | } |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 38 | |
| 39 | // Overridden from RasterBuffer: |
vmpstr | 3f9000d4 | 2016-04-01 20:33:27 | [diff] [blame] | 40 | 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 { |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 47 | TRACE_EVENT0("cc", "RasterBufferImpl::Playback"); |
danakj | dc1dfb4 | 2015-08-06 00:25:40 | [diff] [blame] | 48 | // GPU raster doesn't do low res tiles, so should always include images. |
vmpstr | 3f9000d4 | 2016-04-01 20:33:27 | [diff] [blame] | 49 | DCHECK(!playback_settings.skip_images); |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 50 | |
danakj | 0de0c95a | 2016-05-25 01:42:49 | [diff] [blame^] | 51 | ContextProvider::ScopedContextLock scoped_context( |
| 52 | rasterizer_->worker_context_provider()); |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 53 | |
danakj | 05d6900 | 2015-06-02 01:42:20 | [diff] [blame] | 54 | 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 | |
danakj | e0b5478 | 2015-05-29 22:47:52 | [diff] [blame] | 61 | // TODO(danakj): Implement partial raster with raster_dirty_rect. |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 62 | // Rasterize source into resource. |
danakj | e0b5478 | 2015-05-29 22:47:52 | [diff] [blame] | 63 | rasterizer_->RasterizeSource(&lock_, raster_source, raster_full_rect, |
vmpstr | 3f9000d4 | 2016-04-01 20:33:27 | [diff] [blame] | 64 | playback_rect, scale, playback_settings); |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 65 | |
dyen | 41651cd | 2016-02-06 00:08:47 | [diff] [blame] | 66 | gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
| 67 | const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
| 68 | |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 69 | // Barrier to sync worker context output to cc context. |
dyen | 41651cd | 2016-02-06 00:08:47 | [diff] [blame] | 70 | 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); |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 76 | } |
| 77 | |
| 78 | private: |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 79 | GpuRasterizer* rasterizer_; |
| 80 | ResourceProvider::ScopedWriteLockGr lock_; |
danakj | 05d6900 | 2015-06-02 01:42:20 | [diff] [blame] | 81 | bool resource_has_previous_content_; |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 82 | |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 83 | DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 84 | }; |
| 85 | |
| 86 | } // namespace |
vmiura | 78b6928 | 2015-02-14 00:01:17 | [diff] [blame] | 87 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 88 | GpuRasterBufferProvider::GpuRasterBufferProvider( |
danakj | 0de0c95a | 2016-05-25 01:42:49 | [diff] [blame^] | 89 | ContextProvider* compositor_context_provider, |
| 90 | ContextProvider* worker_context_provider, |
hendrikw | 59d44948 | 2015-04-04 00:44:32 | [diff] [blame] | 91 | ResourceProvider* resource_provider, |
| 92 | bool use_distance_field_text, |
| 93 | int gpu_rasterization_msaa_sample_count) |
danakj | 0de0c95a | 2016-05-25 01:42:49 | [diff] [blame^] | 94 | : compositor_context_provider_(compositor_context_provider), |
| 95 | rasterizer_(new GpuRasterizer(worker_context_provider, |
hendrikw | 59d44948 | 2015-04-04 00:44:32 | [diff] [blame] | 96 | resource_provider, |
| 97 | use_distance_field_text, |
danakj | 0de0c95a | 2016-05-25 01:42:49 | [diff] [blame^] | 98 | gpu_rasterization_msaa_sample_count)) { |
| 99 | DCHECK(compositor_context_provider_); |
| 100 | } |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 101 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 102 | GpuRasterBufferProvider::~GpuRasterBufferProvider() {} |
reveman@chromium.org | ec7541d | 2014-04-09 01:23:53 | [diff] [blame] | 103 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 104 | std::unique_ptr<RasterBuffer> GpuRasterBufferProvider::AcquireBufferForRaster( |
danakj | e0b5478 | 2015-05-29 22:47:52 | [diff] [blame] | 105 | const Resource* resource, |
danakj | 510822aa | 2015-06-01 20:23:02 | [diff] [blame] | 106 | uint64_t resource_content_id, |
danakj | e0b5478 | 2015-05-29 22:47:52 | [diff] [blame] | 107 | uint64_t previous_content_id) { |
danakj | 60bc3bc | 2016-04-09 00:24:48 | [diff] [blame] | 108 | return std::unique_ptr<RasterBuffer>(new RasterBufferImpl( |
danakj | 05d6900 | 2015-06-02 01:42:20 | [diff] [blame] | 109 | rasterizer_.get(), resource, resource_content_id, previous_content_id)); |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 110 | } |
| 111 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 112 | void GpuRasterBufferProvider::ReleaseBufferForRaster( |
danakj | 60bc3bc | 2016-04-09 00:24:48 | [diff] [blame] | 113 | std::unique_ptr<RasterBuffer> buffer) { |
reveman | 47560ab | 2014-09-18 19:39:21 | [diff] [blame] | 114 | // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 115 | } |
| 116 | |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 117 | void GpuRasterBufferProvider::OrderingBarrier() { |
| 118 | TRACE_EVENT0("cc", "GpuRasterBufferProvider::OrderingBarrier"); |
danakj | 0de0c95a | 2016-05-25 01:42:49 | [diff] [blame^] | 119 | compositor_context_provider_->ContextGL()->OrderingBarrierCHROMIUM(); |
prashant.n | b4d4f49 | 2016-04-29 12:51:28 | [diff] [blame] | 120 | } |
| 121 | |
| 122 | ResourceFormat GpuRasterBufferProvider::GetResourceFormat( |
| 123 | bool must_support_alpha) const { |
| 124 | return rasterizer_->resource_provider()->best_render_buffer_format(); |
| 125 | } |
| 126 | |
| 127 | bool 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 | |
| 133 | void GpuRasterBufferProvider::Shutdown() {} |
| 134 | |
reveman@chromium.org | b5641b9 | 2014-02-15 14:21:58 | [diff] [blame] | 135 | } // namespace cc |