Commit d258f4b7 authored by kylechar's avatar kylechar Committed by Commit Bot

Fix Windows overlay missing frames

Ensure the GPU thread task to schedule DC overlays runs after the
mailboxes have been mapped to textures.

Bug: 1003040
Change-Id: I0a5a8b4ce1c24d8b64fbb600092703e5e8a2d136
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1907193
Commit-Queue: kylechar <kylechar@chromium.org>
Reviewed-by: default avatarJonathan Backer <backer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714495}
parent 77cb42e4
......@@ -133,8 +133,10 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurface : public OutputSurface,
// ScheduleDCLayers() will be called.
virtual void SetEnableDCLayers(bool enable) = 0;
// Schedule drawing DC layer overlays at next SkiaSwapBuffers() call.
virtual void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers) = 0;
// Schedule drawing DC layer overlays at next SkiaSwapBuffers() call. Waits on
// |sync_tokens| for the overlay textures to be ready before scheduling.
virtual void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers,
std::vector<gpu::SyncToken> sync_tokens) = 0;
// Add context lost observer.
virtual void AddContextLostObserver(ContextLostObserver* observer) = 0;
......
......@@ -2044,6 +2044,7 @@ void SkiaRenderer::ScheduleDCLayers() {
if (current_frame()->dc_layer_overlay_list.empty())
return;
std::vector<gpu::SyncToken> sync_tokens;
for (auto& dc_layer_overlay : current_frame()->dc_layer_overlay_list) {
for (size_t i = 0; i < DCLayerOverlay::kNumResources; ++i) {
ResourceId resource_id = dc_layer_overlay.resources[i];
......@@ -2053,6 +2054,12 @@ void SkiaRenderer::ScheduleDCLayers() {
// Resources will be unlocked after the next call to SwapBuffers().
auto* image_context =
lock_set_for_external_use_->LockResource(resource_id, true);
// Sync tokens ensure the texture to be overlaid is available before
// scheduling it for display.
DCHECK(image_context->mailbox_holder().sync_token.HasData());
sync_tokens.push_back(image_context->mailbox_holder().sync_token);
dc_layer_overlay.mailbox[i] = image_context->mailbox_holder().mailbox;
}
DCHECK(!dc_layer_overlay.mailbox[0].IsZero());
......@@ -2060,7 +2067,8 @@ void SkiaRenderer::ScheduleDCLayers() {
has_locked_overlay_resources_ = true;
skia_output_surface_->ScheduleDCLayers(
std::move(current_frame()->dc_layer_overlay_list));
std::move(current_frame()->dc_layer_overlay_list),
std::move(sync_tokens));
}
sk_sp<SkColorFilter> SkiaRenderer::GetColorFilter(const gfx::ColorSpace& src,
......
......@@ -621,11 +621,12 @@ void SkiaOutputSurfaceImpl::SetEnableDCLayers(bool enable) {
}
void SkiaOutputSurfaceImpl::ScheduleDCLayers(
std::vector<DCLayerOverlay> overlays) {
std::vector<DCLayerOverlay> overlays,
std::vector<gpu::SyncToken> sync_tokens) {
auto task =
base::BindOnce(&SkiaOutputSurfaceImplOnGpu::ScheduleDCLayers,
base::Unretained(impl_on_gpu_.get()), std::move(overlays));
ScheduleGpuTask(std::move(task), {});
ScheduleGpuTask(std::move(task), std::move(sync_tokens));
}
void SkiaOutputSurfaceImpl::SetCapabilitiesForTesting(
......
......@@ -115,7 +115,8 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
void RemoveRenderPassResource(std::vector<RenderPassId> ids) override;
void SetEnableDCLayers(bool enable) override;
void ScheduleDCLayers(std::vector<DCLayerOverlay> overlays) override;
void ScheduleDCLayers(std::vector<DCLayerOverlay> overlays,
std::vector<gpu::SyncToken> sync_tokens) override;
void CopyOutput(RenderPassId id,
const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space,
......
......@@ -90,7 +90,8 @@ class FakeSkiaOutputSurface : public SkiaOutputSurface {
sk_sp<SkColorSpace> color_space) override;
void RemoveRenderPassResource(std::vector<RenderPassId> ids) override;
void SetEnableDCLayers(bool enable) override {}
void ScheduleDCLayers(std::vector<DCLayerOverlay> overlays) override {}
void ScheduleDCLayers(std::vector<DCLayerOverlay> overlays,
std::vector<gpu::SyncToken> sync_tokens) override {}
void CopyOutput(RenderPassId id,
const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment