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, ...@@ -133,8 +133,10 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurface : public OutputSurface,
// ScheduleDCLayers() will be called. // ScheduleDCLayers() will be called.
virtual void SetEnableDCLayers(bool enable) = 0; virtual void SetEnableDCLayers(bool enable) = 0;
// Schedule drawing DC layer overlays at next SkiaSwapBuffers() call. // Schedule drawing DC layer overlays at next SkiaSwapBuffers() call. Waits on
virtual void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers) = 0; // |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. // Add context lost observer.
virtual void AddContextLostObserver(ContextLostObserver* observer) = 0; virtual void AddContextLostObserver(ContextLostObserver* observer) = 0;
......
...@@ -2044,6 +2044,7 @@ void SkiaRenderer::ScheduleDCLayers() { ...@@ -2044,6 +2044,7 @@ void SkiaRenderer::ScheduleDCLayers() {
if (current_frame()->dc_layer_overlay_list.empty()) if (current_frame()->dc_layer_overlay_list.empty())
return; return;
std::vector<gpu::SyncToken> sync_tokens;
for (auto& dc_layer_overlay : current_frame()->dc_layer_overlay_list) { for (auto& dc_layer_overlay : current_frame()->dc_layer_overlay_list) {
for (size_t i = 0; i < DCLayerOverlay::kNumResources; ++i) { for (size_t i = 0; i < DCLayerOverlay::kNumResources; ++i) {
ResourceId resource_id = dc_layer_overlay.resources[i]; ResourceId resource_id = dc_layer_overlay.resources[i];
...@@ -2053,6 +2054,12 @@ void SkiaRenderer::ScheduleDCLayers() { ...@@ -2053,6 +2054,12 @@ void SkiaRenderer::ScheduleDCLayers() {
// Resources will be unlocked after the next call to SwapBuffers(). // Resources will be unlocked after the next call to SwapBuffers().
auto* image_context = auto* image_context =
lock_set_for_external_use_->LockResource(resource_id, true); 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; dc_layer_overlay.mailbox[i] = image_context->mailbox_holder().mailbox;
} }
DCHECK(!dc_layer_overlay.mailbox[0].IsZero()); DCHECK(!dc_layer_overlay.mailbox[0].IsZero());
...@@ -2060,7 +2067,8 @@ void SkiaRenderer::ScheduleDCLayers() { ...@@ -2060,7 +2067,8 @@ void SkiaRenderer::ScheduleDCLayers() {
has_locked_overlay_resources_ = true; has_locked_overlay_resources_ = true;
skia_output_surface_->ScheduleDCLayers( 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, sk_sp<SkColorFilter> SkiaRenderer::GetColorFilter(const gfx::ColorSpace& src,
......
...@@ -621,11 +621,12 @@ void SkiaOutputSurfaceImpl::SetEnableDCLayers(bool enable) { ...@@ -621,11 +621,12 @@ void SkiaOutputSurfaceImpl::SetEnableDCLayers(bool enable) {
} }
void SkiaOutputSurfaceImpl::ScheduleDCLayers( void SkiaOutputSurfaceImpl::ScheduleDCLayers(
std::vector<DCLayerOverlay> overlays) { std::vector<DCLayerOverlay> overlays,
std::vector<gpu::SyncToken> sync_tokens) {
auto task = auto task =
base::BindOnce(&SkiaOutputSurfaceImplOnGpu::ScheduleDCLayers, base::BindOnce(&SkiaOutputSurfaceImplOnGpu::ScheduleDCLayers,
base::Unretained(impl_on_gpu_.get()), std::move(overlays)); base::Unretained(impl_on_gpu_.get()), std::move(overlays));
ScheduleGpuTask(std::move(task), {}); ScheduleGpuTask(std::move(task), std::move(sync_tokens));
} }
void SkiaOutputSurfaceImpl::SetCapabilitiesForTesting( void SkiaOutputSurfaceImpl::SetCapabilitiesForTesting(
......
...@@ -115,7 +115,8 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface { ...@@ -115,7 +115,8 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override;
void SetEnableDCLayers(bool enable) 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, void CopyOutput(RenderPassId id,
const copy_output::RenderPassGeometry& geometry, const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space, const gfx::ColorSpace& color_space,
......
...@@ -90,7 +90,8 @@ class FakeSkiaOutputSurface : public SkiaOutputSurface { ...@@ -90,7 +90,8 @@ class FakeSkiaOutputSurface : public SkiaOutputSurface {
sk_sp<SkColorSpace> color_space) override; sk_sp<SkColorSpace> color_space) override;
void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override;
void SetEnableDCLayers(bool enable) 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, void CopyOutput(RenderPassId id,
const copy_output::RenderPassGeometry& geometry, const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space, 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