[go: nahoru, domu]

blob: 931db2326a67bdb39bae404d85ae535739b08a8d [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>
Robert Phillipsdbb0b7d2020-07-29 16:07:4410#include <memory>
Mike Reedf7074ff2019-03-14 14:28:1611#include <utility>
Robert Phillipsdbb0b7d2020-07-29 16:07:4412#include <vector>
ernstm69fedbd2014-09-18 01:23:4113
Peng Huangacb64c02022-02-28 20:36:4414#include "base/bits.h"
Hans Wennborg66d784de2020-06-17 20:23:0315#include "base/logging.h"
Keishi Hattori0e45c022021-11-27 09:25:5216#include "base/memory/raw_ptr.h"
ericrke4027312016-06-30 00:12:4217#include "base/metrics/histogram_macros.h"
Khushal3c3873a2018-11-06 18:14:0118#include "base/rand_util.h"
Alexandr Ilin0443a8f2018-07-20 20:14:5019#include "base/trace_event/process_memory_dump.h"
ssid904ce3b2015-01-27 15:20:1620#include "base/trace_event/trace_event.h"
Yuta Hijikata173c7d62020-11-10 06:21:3721#include "build/chromeos_buildflags.h"
ericrkc7c9e3f2016-07-01 17:30:1622#include "cc/base/histograms.h"
Adrienne Walker436a7752017-08-28 23:33:0923#include "cc/paint/display_item_list.h"
enne5a9630362017-02-24 23:41:0324#include "cc/paint/paint_canvas.h"
Adrienne Walker436a7752017-08-28 23:33:0925#include "cc/paint/paint_recorder.h"
chrishtrac41ff92017-03-17 05:07:3026#include "cc/raster/raster_source.h"
danakj57baa772018-05-29 15:59:1427#include "components/viz/client/client_resource_provider.h"
Victor Miura29b7ea3d2017-12-19 20:23:5928#include "components/viz/common/gpu/context_provider.h"
29#include "components/viz/common/gpu/raster_context_provider.h"
danakjaf3170e2018-02-09 17:31:5830#include "gpu/GLES2/gl2extchromium.h"
ericrk7f6a27f2017-01-31 22:34:3231#include "gpu/command_buffer/client/context_support.h"
Victor Miura3a4ad4f82017-12-13 06:03:4532#include "gpu/command_buffer/client/raster_interface.h"
Antoine Labour6283c792018-09-27 16:59:2833#include "gpu/command_buffer/client/shared_image_interface.h"
Antoine Labour6283c792018-09-27 16:59:2834#include "gpu/command_buffer/common/shared_image_trace_utils.h"
35#include "gpu/command_buffer/common/shared_image_usage.h"
Ian Preste598eece2020-10-19 23:31:0236#include "skia/ext/legacy_display_globals.h"
hendrikw04cea972014-09-23 20:50:5337#include "third_party/skia/include/core/SkPictureRecorder.h"
reveman47560ab2014-09-18 19:39:2138#include "third_party/skia/include/core/SkSurface.h"
Peng Huang5f3d4352021-11-23 17:51:2939#include "ui/base/ui_base_features.h"
Adrienne Walker436a7752017-08-28 23:33:0940#include "ui/gfx/geometry/axis_transform2d.h"
Khushal49836ab2018-07-25 02:08:4541#include "url/gurl.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5842
43namespace cc {
vmiura78b69282015-02-14 00:01:1744
danakjaf3170e2018-02-09 17:31:5845// Subclass for InUsePoolResource that holds ownership of a gpu-rastered backing
46// and does cleanup of the backing when destroyed.
47class GpuRasterBufferProvider::GpuRasterBacking
48 : public ResourcePool::GpuBacking {
49 public:
50 ~GpuRasterBacking() override {
Antoine Labour6283c792018-09-27 16:59:2851 if (mailbox.IsZero())
52 return;
53 auto* sii = worker_context_provider->SharedImageInterface();
danakjaf3170e2018-02-09 17:31:5854 if (returned_sync_token.HasData())
Antoine Labour6283c792018-09-27 16:59:2855 sii->DestroySharedImage(returned_sync_token, mailbox);
56 else if (mailbox_sync_token.HasData())
57 sii->DestroySharedImage(mailbox_sync_token, mailbox);
danakjaf3170e2018-02-09 17:31:5858 }
59
Alexandr Ilin0443a8f2018-07-20 20:14:5060 void OnMemoryDump(
61 base::trace_event::ProcessMemoryDump* pmd,
62 const base::trace_event::MemoryAllocatorDumpGuid& buffer_dump_guid,
63 uint64_t tracing_process_id,
64 int importance) const override {
Antoine Labour6283c792018-09-27 16:59:2865 if (mailbox.IsZero())
Alexandr Ilin0443a8f2018-07-20 20:14:5066 return;
67
Antoine Labour6283c792018-09-27 16:59:2868 auto tracing_guid = gpu::GetSharedImageGUIDForTracing(mailbox);
69 pmd->CreateSharedGlobalAllocatorDump(tracing_guid);
70 pmd->AddOwnershipEdge(buffer_dump_guid, tracing_guid, importance);
danakjaf3170e2018-02-09 17:31:5871 }
danakjaf3170e2018-02-09 17:31:5872
Antoine Labour6283c792018-09-27 16:59:2873 // The ContextProvider used to clean up the mailbox
Keishi Hattori0e45c022021-11-27 09:25:5274 raw_ptr<viz::RasterContextProvider> worker_context_provider = nullptr;
danakjaf3170e2018-02-09 17:31:5875};
76
sunnyps5d6ff0d02016-06-28 00:40:1177GpuRasterBufferProvider::RasterBufferImpl::RasterBufferImpl(
78 GpuRasterBufferProvider* client,
danakjaf3170e2018-02-09 17:31:5879 const ResourcePool::InUsePoolResource& in_use_resource,
80 GpuRasterBacking* backing,
Andres Calderon Jaramillob6b26dc2019-11-25 21:24:0581 bool resource_has_previous_content,
Andres Calderon Jaramillo5057f232019-11-29 23:05:4882 bool depends_on_at_raster_decodes,
83 bool depends_on_hardware_accelerated_jpeg_candidates,
84 bool depends_on_hardware_accelerated_webp_candidates)
sunnyps5d6ff0d02016-06-28 00:40:1185 : client_(client),
danakjaf3170e2018-02-09 17:31:5886 backing_(backing),
87 resource_size_(in_use_resource.size()),
88 resource_format_(in_use_resource.format()),
89 color_space_(in_use_resource.color_space()),
90 resource_has_previous_content_(resource_has_previous_content),
Andres Calderon Jaramillob6b26dc2019-11-25 21:24:0591 depends_on_at_raster_decodes_(depends_on_at_raster_decodes),
Andres Calderon Jaramillo5057f232019-11-29 23:05:4892 depends_on_hardware_accelerated_jpeg_candidates_(
93 depends_on_hardware_accelerated_jpeg_candidates),
94 depends_on_hardware_accelerated_webp_candidates_(
Peng Huang253518e2022-02-09 14:08:3295 depends_on_hardware_accelerated_webp_candidates) {
Yuta Hijikata173c7d62020-11-10 06:21:3796#if BUILDFLAG(IS_CHROMEOS_ASH)
kylechar14f8d7c02022-01-31 21:41:3297 // Only do this in Chrome OS because:
Andres Calderon Jaramillo01d329552019-08-23 17:14:3098 // 1) We will use this timestamp to measure raster scheduling delay and we
99 // only need to collect that data to assess the impact of hardware
kylechar14f8d7c02022-01-31 21:41:32100 // acceleration of image decodes which works only on Chrome OS.
Andres Calderon Jaramillo01d329552019-08-23 17:14:30101 // 2) We use CLOCK_MONOTONIC in that OS to get timestamps, so we can assert
102 // certain assumptions.
kylechar14f8d7c02022-01-31 21:41:32103 creation_time_ = base::TimeTicks::Now();
Andres Calderon Jaramillo01d329552019-08-23 17:14:30104#endif
105}
sunnyps5d6ff0d02016-06-28 00:40:11106
Peng Huang253518e2022-02-09 14:08:32107GpuRasterBufferProvider::RasterBufferImpl::~RasterBufferImpl() = default;
sunnyps5d6ff0d02016-06-28 00:40:11108
109void GpuRasterBufferProvider::RasterBufferImpl::Playback(
110 const RasterSource* raster_source,
111 const gfx::Rect& raster_full_rect,
112 const gfx::Rect& raster_dirty_rect,
113 uint64_t new_content_id,
trchen178ac912017-04-04 10:11:10114 const gfx::AxisTransform2d& transform,
Khushal49836ab2018-07-25 02:08:45115 const RasterSource::PlaybackSettings& playback_settings,
116 const GURL& url) {
sunnyps5d6ff0d02016-06-28 00:40:11117 TRACE_EVENT0("cc", "GpuRasterBuffer::Playback");
Peng Huangb79a26452022-02-07 15:53:51118
119 viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
120 client_->worker_context_provider_, url.possibly_invalid_spec().c_str());
121 gpu::raster::RasterInterface* ri =
122 client_->worker_context_provider_->RasterInterface();
123 PlaybackOnWorkerThread(raster_source, raster_full_rect, raster_dirty_rect,
124 new_content_id, transform, playback_settings, url);
Peng Huang253518e2022-02-09 14:08:32125
126 backing_->mailbox_sync_token =
Peng Huangb79a26452022-02-07 15:53:51127 viz::ClientResourceProvider::GenerateSyncTokenHelper(ri);
Peng Huang253518e2022-02-09 14:08:32128 backing_->returned_sync_token = gpu::SyncToken();
sunnyps5d6ff0d02016-06-28 00:40:11129}
130
Francois Dorayaffe0912020-06-30 20:29:21131bool GpuRasterBufferProvider::RasterBufferImpl::
132 SupportsBackgroundThreadPriority() const {
133 return true;
134}
135
prashant.nb4d4f492016-04-29 12:51:28136GpuRasterBufferProvider::GpuRasterBufferProvider(
Xu Xing32549162017-07-17 22:25:43137 viz::ContextProvider* compositor_context_provider,
Victor Miura29b7ea3d2017-12-19 20:23:59138 viz::RasterContextProvider* worker_context_provider,
danakjaf3170e2018-02-09 17:31:58139 bool use_gpu_memory_buffer_resources,
danakja32578c2018-04-25 21:18:36140 viz::ResourceFormat tile_format,
Eric Karl247f09c2018-03-15 02:06:36141 const gfx::Size& max_tile_size,
Eric Karla6ff8862018-04-16 20:21:06142 bool unpremultiply_and_dither_low_bit_depth_tiles,
Chris Blumee4d90f2cf2020-11-20 03:50:57143 RasterQueryQueue* const pending_raster_queries,
Aaron Krajeski6392a86f2019-07-18 13:40:47144 float raster_metric_probability)
danakj0de0c95a2016-05-25 01:42:49145 : compositor_context_provider_(compositor_context_provider),
sunnyps5d6ff0d02016-06-28 00:40:11146 worker_context_provider_(worker_context_provider),
danakjaf3170e2018-02-09 17:31:58147 use_gpu_memory_buffer_resources_(use_gpu_memory_buffer_resources),
danakja32578c2018-04-25 21:18:36148 tile_format_(tile_format),
Eric Karl247f09c2018-03-15 02:06:36149 max_tile_size_(max_tile_size),
Chris Blumee4d90f2cf2020-11-20 03:50:57150 pending_raster_queries_(pending_raster_queries),
Chris Blume9e8872e2020-08-13 19:40:40151 random_generator_(static_cast<uint32_t>(base::RandUint64())),
Peng Huang5017b272021-12-09 17:47:46152 bernoulli_distribution_(raster_metric_probability),
153 is_using_raw_draw_(features::IsUsingRawDraw()) {
Chris Blumee4d90f2cf2020-11-20 03:50:57154 DCHECK(pending_raster_queries);
sunnyps5d6ff0d02016-06-28 00:40:11155 DCHECK(compositor_context_provider);
156 DCHECK(worker_context_provider);
danakj0de0c95a2016-05-25 01:42:49157}
reveman@chromium.orgb5641b92014-02-15 14:21:58158
kylechar14f8d7c02022-01-31 21:41:32159GpuRasterBufferProvider::~GpuRasterBufferProvider() = default;
reveman@chromium.orgb5641b92014-02-15 14:21:58160
prashant.nb4d4f492016-04-29 12:51:28161std::unique_ptr<RasterBuffer> GpuRasterBufferProvider::AcquireBufferForRaster(
danakj4e871d82018-01-18 21:56:57162 const ResourcePool::InUsePoolResource& resource,
danakj510822aa2015-06-01 20:23:02163 uint64_t resource_content_id,
Andres Calderon Jaramillob6b26dc2019-11-25 21:24:05164 uint64_t previous_content_id,
Andres Calderon Jaramillo5057f232019-11-29 23:05:48165 bool depends_on_at_raster_decodes,
166 bool depends_on_hardware_accelerated_jpeg_candidates,
167 bool depends_on_hardware_accelerated_webp_candidates) {
danakjaf3170e2018-02-09 17:31:58168 if (!resource.gpu_backing()) {
169 auto backing = std::make_unique<GpuRasterBacking>();
Antoine Labour6283c792018-09-27 16:59:28170 backing->worker_context_provider = worker_context_provider_;
Jonathan Backere29d0232018-10-01 21:59:15171 backing->InitOverlayCandidateAndTextureTarget(
172 resource.format(), compositor_context_provider_->ContextCapabilities(),
173 use_gpu_memory_buffer_resources_);
Peng Huanga2a92fe2022-02-08 22:41:30174 backing->is_using_raw_draw =
175 !backing->overlay_candidate && is_using_raw_draw_;
danakjaf3170e2018-02-09 17:31:58176 resource.set_gpu_backing(std::move(backing));
177 }
178 GpuRasterBacking* backing =
179 static_cast<GpuRasterBacking*>(resource.gpu_backing());
sunnyps5d6ff0d02016-06-28 00:40:11180 bool resource_has_previous_content =
181 resource_content_id && resource_content_id == previous_content_id;
Andres Calderon Jaramillo5057f232019-11-29 23:05:48182 return std::make_unique<RasterBufferImpl>(
183 this, resource, backing, resource_has_previous_content,
184 depends_on_at_raster_decodes,
185 depends_on_hardware_accelerated_jpeg_candidates,
186 depends_on_hardware_accelerated_webp_candidates);
reveman@chromium.orgb5641b92014-02-15 14:21:58187}
188
Sunny Sachanandani5f5419e22017-05-12 20:35:30189void GpuRasterBufferProvider::Flush() {
Victor Miuraff6488612017-12-21 04:16:15190 compositor_context_provider_->ContextSupport()->FlushPendingWork();
Sunny Sachanandani5f5419e22017-05-12 20:35:30191}
192
danakja32578c2018-04-25 21:18:36193viz::ResourceFormat GpuRasterBufferProvider::GetResourceFormat() const {
194 return tile_format_;
prashant.nb4d4f492016-04-29 12:51:28195}
196
danakja32578c2018-04-25 21:18:36197bool GpuRasterBufferProvider::IsResourcePremultiplied() const {
198 return !ShouldUnpremultiplyAndDitherResource(GetResourceFormat());
Eric Karl247f09c2018-03-15 02:06:36199}
200
ericrk7f6a27f2017-01-31 22:34:32201bool GpuRasterBufferProvider::IsResourceReadyToDraw(
danakj4e871d82018-01-18 21:56:57202 const ResourcePool::InUsePoolResource& resource) const {
danakjaf3170e2018-02-09 17:31:58203 const gpu::SyncToken& sync_token = resource.gpu_backing()->mailbox_sync_token;
204 // This SyncToken() should have been set by calling OrderingBarrier() before
205 // calling this.
206 DCHECK(sync_token.HasData());
ericrk7f6a27f2017-01-31 22:34:32207
sunnyps74996292017-03-15 02:35:48208 // IsSyncTokenSignaled is thread-safe, no need for worker context lock.
209 return worker_context_provider_->ContextSupport()->IsSyncTokenSignaled(
ericrk7f6a27f2017-01-31 22:34:32210 sync_token);
211}
212
Khushalec3ba5dc2019-11-04 22:30:21213bool GpuRasterBufferProvider::CanPartialRasterIntoProvidedResource() const {
214 return true;
215}
216
ericrk7f6a27f2017-01-31 22:34:32217uint64_t GpuRasterBufferProvider::SetReadyToDrawCallback(
danakj4e871d82018-01-18 21:56:57218 const std::vector<const ResourcePool::InUsePoolResource*>& resources,
kylechar4bb144d2019-01-11 20:42:07219 base::OnceClosure callback,
ericrk7f6a27f2017-01-31 22:34:32220 uint64_t pending_callback_id) const {
danakjaf3170e2018-02-09 17:31:58221 gpu::SyncToken latest_sync_token;
222 for (const auto* in_use : resources) {
223 const gpu::SyncToken& sync_token =
224 in_use->gpu_backing()->mailbox_sync_token;
225 if (sync_token.release_count() > latest_sync_token.release_count())
226 latest_sync_token = sync_token;
227 }
228 uint64_t callback_id = latest_sync_token.release_count();
ericrk7f6a27f2017-01-31 22:34:32229 DCHECK_NE(callback_id, 0u);
230
231 // If the callback is different from the one the caller is already waiting on,
sunnyps31c92fe2017-02-10 23:46:55232 // pass the callback through to SignalSyncToken. Otherwise the request is
ericrk7f6a27f2017-01-31 22:34:32233 // redundant.
234 if (callback_id != pending_callback_id) {
danakjaf3170e2018-02-09 17:31:58235 // Use the compositor context because we want this callback on the
236 // compositor thread.
237 compositor_context_provider_->ContextSupport()->SignalSyncToken(
kylechar4bb144d2019-01-11 20:42:07238 latest_sync_token, std::move(callback));
ericrk7f6a27f2017-01-31 22:34:32239 }
240
241 return callback_id;
242}
243
kylechar14f8d7c02022-01-31 21:41:32244void GpuRasterBufferProvider::Shutdown() {}
sunnyps5d6ff0d02016-06-28 00:40:11245
Peng Huangb79a26452022-02-07 15:53:51246void GpuRasterBufferProvider::RasterBufferImpl::PlaybackOnWorkerThread(
sunnyps5d6ff0d02016-06-28 00:40:11247 const RasterSource* raster_source,
248 const gfx::Rect& raster_full_rect,
249 const gfx::Rect& raster_dirty_rect,
250 uint64_t new_content_id,
trchen178ac912017-04-04 10:11:10251 const gfx::AxisTransform2d& transform,
Khushal49836ab2018-07-25 02:08:45252 const RasterSource::PlaybackSettings& playback_settings,
Peng Huangb79a26452022-02-07 15:53:51253 const GURL& url) {
Chris Blumee4d90f2cf2020-11-20 03:50:57254 RasterQuery query;
Andres Calderon Jaramillo5057f232019-11-29 23:05:48255 query.depends_on_hardware_accelerated_jpeg_candidates =
Peng Huangb79a26452022-02-07 15:53:51256 depends_on_hardware_accelerated_jpeg_candidates_;
Andres Calderon Jaramillo5057f232019-11-29 23:05:48257 query.depends_on_hardware_accelerated_webp_candidates =
Peng Huangb79a26452022-02-07 15:53:51258 depends_on_hardware_accelerated_webp_candidates_;
259 PlaybackOnWorkerThreadInternal(raster_source, raster_full_rect,
260 raster_dirty_rect, new_content_id, transform,
261 playback_settings, url, &query);
Khushal5d4e0962018-10-18 18:04:07262
Andres Calderon Jaramillo01d329552019-08-23 17:14:30263 if (query.raster_duration_query_id) {
264 if (query.raster_start_query_id)
Peng Huangb79a26452022-02-07 15:53:51265 query.raster_buffer_creation_time = creation_time_;
Andres Calderon Jaramillo01d329552019-08-23 17:14:30266
Khushal5d4e0962018-10-18 18:04:07267 // Note that it is important to scope the raster context lock to
Chris Blumee4d90f2cf2020-11-20 03:50:57268 // PlaybackOnWorkerThreadInternal and release it before calling this
269 // function to avoid a deadlock in
270 // RasterQueryQueue::CheckRasterFinishedQueries which acquires the raster
271 // context lock while holding a lock used in the function.
Peng Huangb79a26452022-02-07 15:53:51272 client_->pending_raster_queries_->Append(std::move(query));
Khushal5d4e0962018-10-18 18:04:07273 }
Khushal5d4e0962018-10-18 18:04:07274}
275
Peng Huangb79a26452022-02-07 15:53:51276void GpuRasterBufferProvider::RasterBufferImpl::PlaybackOnWorkerThreadInternal(
Khushal5d4e0962018-10-18 18:04:07277 const RasterSource* raster_source,
278 const gfx::Rect& raster_full_rect,
279 const gfx::Rect& raster_dirty_rect,
280 uint64_t new_content_id,
281 const gfx::AxisTransform2d& transform,
282 const RasterSource::PlaybackSettings& playback_settings,
283 const GURL& url,
Chris Blumee4d90f2cf2020-11-20 03:50:57284 RasterQuery* query) {
Peng Huangb79a26452022-02-07 15:53:51285 gpu::raster::RasterInterface* ri =
286 client_->worker_context_provider_->RasterInterface();
Victor Miura3a4ad4f82017-12-13 06:03:45287 DCHECK(ri);
sunnyps5d6ff0d02016-06-28 00:40:11288
Peng Huangb79a26452022-02-07 15:53:51289 const bool measure_raster_metric =
290 client_->bernoulli_distribution_(client_->random_generator_);
Khushale898b992018-10-19 22:25:16291
Adrienne Walker436a7752017-08-28 23:33:09292 gfx::Rect playback_rect = raster_full_rect;
Peng Huangb79a26452022-02-07 15:53:51293 if (resource_has_previous_content_) {
Adrienne Walker436a7752017-08-28 23:33:09294 playback_rect.Intersect(raster_dirty_rect);
295 }
296 DCHECK(!playback_rect.IsEmpty())
297 << "Why are we rastering a tile that's not dirty?";
298
Khushale898b992018-10-19 22:25:16299 if (measure_raster_metric) {
Yuta Hijikata173c7d62020-11-10 06:21:37300#if BUILDFLAG(IS_CHROMEOS_ASH)
Andres Calderon Jaramillo01d329552019-08-23 17:14:30301 // Use a query to detect when the GPU side is ready to start issuing raster
302 // work to the driver. We will use the resulting timestamp to measure raster
kylechar14f8d7c02022-01-31 21:41:32303 // scheduling delay. We only care about this in Chrome OS because we will
304 // use this timestamp to measure raster scheduling delay and we only need to
305 // collect that data to assess the impact of hardware acceleration of image
306 // decodes which work only in Chrome OS. Furthermore, we don't count raster
307 // work that depends on at-raster image decodes. This is because we want the
308 // delay to always include image decoding and uploading time, and at-raster
309 // decodes should be relatively rare.
Peng Huangb79a26452022-02-07 15:53:51310 if (!depends_on_at_raster_decodes_) {
Andres Calderon Jaramillo01d329552019-08-23 17:14:30311 ri->GenQueriesEXT(1, &query->raster_start_query_id);
312 DCHECK_GT(query->raster_start_query_id, 0u);
313 ri->QueryCounterEXT(query->raster_start_query_id,
314 GL_COMMANDS_ISSUED_TIMESTAMP_CHROMIUM);
315 }
Peng Huangb79a26452022-02-07 15:53:51316#else
317 std::ignore = depends_on_at_raster_decodes_;
Andres Calderon Jaramillo01d329552019-08-23 17:14:30318#endif
Andres Calderon Jaramillob805fa82019-08-24 05:58:19319
320 // Use a query to time the GPU side work for rasterizing this tile.
321 ri->GenQueriesEXT(1, &query->raster_duration_query_id);
322 DCHECK_GT(query->raster_duration_query_id, 0u);
323 ri->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM,
324 query->raster_duration_query_id);
Khushale898b992018-10-19 22:25:16325 }
Khushalcd8fbb772018-10-16 22:46:14326
327 {
Anton Bikineev1b060a72021-05-14 23:15:34328 absl::optional<base::ElapsedTimer> timer;
Khushale898b992018-10-19 22:25:16329 if (measure_raster_metric)
330 timer.emplace();
Peng Huangb79a26452022-02-07 15:53:51331 RasterizeSource(raster_source, raster_full_rect, playback_rect, transform,
332 playback_settings);
Andres Calderon Jaramillo01d329552019-08-23 17:14:30333 if (measure_raster_metric) {
334 query->worker_raster_duration = timer->Elapsed();
335 ri->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
336 }
Adrienne Walker436a7752017-08-28 23:33:09337 }
Peng Huangb79a26452022-02-07 15:53:51338}
sunnyps5d6ff0d02016-06-28 00:40:11339
Peng Huangb79a26452022-02-07 15:53:51340void GpuRasterBufferProvider::RasterBufferImpl::RasterizeSource(
341 const RasterSource* raster_source,
342 const gfx::Rect& raster_full_rect,
343 const gfx::Rect& playback_rect,
344 const gfx::AxisTransform2d& transform,
345 const RasterSource::PlaybackSettings& playback_settings) {
346 gpu::raster::RasterInterface* ri =
347 client_->worker_context_provider_->RasterInterface();
348 bool mailbox_needs_clear = false;
Peng Huang253518e2022-02-09 14:08:32349 if (backing_->mailbox.IsZero()) {
350 DCHECK(!backing_->returned_sync_token.HasData());
Peng Huangb79a26452022-02-07 15:53:51351 auto* sii = client_->worker_context_provider_->SharedImageInterface();
352 uint32_t flags = gpu::SHARED_IMAGE_USAGE_DISPLAY |
353 gpu::SHARED_IMAGE_USAGE_RASTER |
354 gpu::SHARED_IMAGE_USAGE_OOP_RASTERIZATION;
Peng Huang253518e2022-02-09 14:08:32355 if (backing_->overlay_candidate) {
Peng Huangb79a26452022-02-07 15:53:51356 flags |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
357 } else if (client_->is_using_raw_draw_) {
358 flags |= gpu::SHARED_IMAGE_USAGE_RAW_DRAW;
359 }
Peng Huang253518e2022-02-09 14:08:32360 backing_->mailbox =
Peng Huangb79a26452022-02-07 15:53:51361 sii->CreateSharedImage(resource_format_, resource_size_, color_space_,
362 kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
363 flags, gpu::kNullSurfaceHandle);
364 mailbox_needs_clear = true;
365 ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
366 } else {
Peng Huang253518e2022-02-09 14:08:32367 ri->WaitSyncTokenCHROMIUM(backing_->returned_sync_token.GetConstData());
Peng Huangb79a26452022-02-07 15:53:51368 }
369
370 // Assume legacy MSAA if sample count is positive.
371 gpu::raster::MsaaMode msaa_mode = playback_settings.msaa_sample_count > 0
372 ? gpu::raster::kMSAA
373 : gpu::raster::kNoMSAA;
Peng Huangacb64c02022-02-28 20:36:44374 // msaa_sample_count should be 1, 2, 4, 8, 16, 32, 64,
375 // and log2(msaa_sample_count) should be [0,6].
376 // If playback_settings.msaa_sample_count <= 0, the MSAA is not used. It is
377 // equivalent to MSAA sample count 1.
378 uint32_t sample_count =
379 std::clamp(playback_settings.msaa_sample_count, 1, 64);
380 UMA_HISTOGRAM_CUSTOM_COUNTS("Gpu.Rasterization.Raster.MSAASampleCountLog2",
381 base::bits::Log2Floor(sample_count), 0, 7, 7);
Peng Huangb79a26452022-02-07 15:53:51382 // With Raw Draw, the framebuffer will be the rasterization target. It cannot
383 // support LCD text, so disable LCD text for Raw Draw backings.
384 // TODO(penghuang): remove it when GrSlug can be serialized.
385 bool is_raw_draw_backing =
Peng Huang253518e2022-02-09 14:08:32386 client_->is_using_raw_draw_ && !backing_->overlay_candidate;
Peng Huangb79a26452022-02-07 15:53:51387 bool use_lcd_text = playback_settings.use_lcd_text && !is_raw_draw_backing;
388 ri->BeginRasterCHROMIUM(raster_source->background_color(),
389 mailbox_needs_clear,
390 playback_settings.msaa_sample_count, msaa_mode,
Peng Huang253518e2022-02-09 14:08:32391 use_lcd_text, color_space_, backing_->mailbox.name);
Peng Huangb79a26452022-02-07 15:53:51392 gfx::Vector2dF recording_to_raster_scale = transform.scale();
393 recording_to_raster_scale.Scale(1 / raster_source->recording_scale_factor());
394 gfx::Size content_size = raster_source->GetContentSize(transform.scale());
395
396 // TODO(enne): could skip the clear on new textures, as the service side has
397 // to do that anyway. resource_has_previous_content implies that the texture
398 // is not new, but the reverse does not hold, so more plumbing is needed.
399 ri->RasterCHROMIUM(
400 raster_source->GetDisplayItemList().get(),
401 playback_settings.image_provider, content_size, raster_full_rect,
402 playback_rect, transform.translation(), recording_to_raster_scale,
403 raster_source->requires_clear(),
404 const_cast<RasterSource*>(raster_source)->max_op_size_hint());
Peng Huangd11f24a2022-02-18 01:52:37405 UMA_HISTOGRAM_COUNTS_1000(
406 "Gpu.Rasterization.Raster.NumPaintOps",
407 raster_source->GetDisplayItemList()->num_paint_ops());
Peng Huang2248ef62022-02-22 16:18:25408 UMA_HISTOGRAM_COUNTS_100(
409 "Gpu.Rasterization.Raster.NumSlowPaths",
410 raster_source->GetDisplayItemList()->num_slow_paths());
Peng Huangb79a26452022-02-07 15:53:51411 ri->EndRasterCHROMIUM();
412
413 // TODO(ericrk): Handle unpremultiply+dither for 4444 cases.
414 // https://crbug.com/789153
sunnyps5d6ff0d02016-06-28 00:40:11415}
prashant.nb4d4f492016-04-29 12:51:28416
Eric Karla6ff8862018-04-16 20:21:06417bool GpuRasterBufferProvider::ShouldUnpremultiplyAndDitherResource(
418 viz::ResourceFormat format) const {
Khushal8a168082020-11-21 01:29:34419 // TODO(crbug.com/1151490): Re-enable for OOPR.
420 return false;
Eric Karla6ff8862018-04-16 20:21:06421}
422
reveman@chromium.orgb5641b92014-02-15 14:21:58423} // namespace cc