Commit 81add289 authored by kylechar's avatar kylechar Committed by Commit Bot

Add GPU vsync support to SkiaRenderer.

Plumb callback and results between viz compositor and gpu threads.

Bug: 982842
Change-Id: I1225757d42f4fc80a35ee556a76f401137971ff1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1819621Reviewed-by: default avatarSunny Sachanandani <sunnyps@chromium.org>
Commit-Queue: kylechar <kylechar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699025}
parent f435f26d
......@@ -34,6 +34,10 @@ void SkiaOutputDevice::PostSubBuffer(
void SkiaOutputDevice::SetDrawRectangle(const gfx::Rect& draw_rectangle) {}
void SkiaOutputDevice::SetGpuVSyncEnabled(bool enabled) {
NOTIMPLEMENTED();
}
void SkiaOutputDevice::SetEnableDCLayers(bool enable) {
NOTIMPLEMENTED();
}
......
......@@ -91,7 +91,8 @@ class SkiaOutputDevice {
// Set the rectangle that will be drawn into on the surface.
virtual void SetDrawRectangle(const gfx::Rect& draw_rectangle);
virtual void SetEnableDCLayers(bool enable);
virtual void SetGpuVSyncEnabled(bool enabled);
virtual void SetEnableDCLayers(bool enabled);
virtual void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers);
const OutputSurface::Capabilities& capabilities() const {
......
......@@ -43,6 +43,7 @@ SkiaOutputDeviceGL::SkiaOutputDeviceGL(
.disable_post_sub_buffers_for_onscreen_surfaces)
capabilities_.supports_post_sub_buffer = false;
capabilities_.max_frames_pending = gl_surface_->GetBufferCount() - 1;
capabilities_.supports_gpu_vsync = gl_surface_->SupportsGpuVSync();
capabilities_.supports_dc_layers = gl_surface_->SupportsDCLayers();
}
......@@ -162,6 +163,10 @@ void SkiaOutputDeviceGL::SetDrawRectangle(const gfx::Rect& draw_rectangle) {
gl_surface_->SetDrawRectangle(draw_rectangle);
}
void SkiaOutputDeviceGL::SetGpuVSyncEnabled(bool enabled) {
gl_surface_->SetGpuVSyncEnabled(enabled);
}
void SkiaOutputDeviceGL::SetEnableDCLayers(bool enable) {
gl_surface_->SetEnableDCLayers(enable);
}
......
......@@ -64,6 +64,7 @@ class SkiaOutputDeviceGL final : public SkiaOutputDevice {
BufferPresentedCallback feedback,
std::vector<ui::LatencyInfo> latency_info) override;
void SetDrawRectangle(const gfx::Rect& draw_rectangle) override;
void SetGpuVSyncEnabled(bool enabled) override;
void SetEnableDCLayers(bool enable) override;
void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers) override;
void EnsureBackbuffer() override;
......
......@@ -218,6 +218,16 @@ void SkiaOutputSurfaceImpl::SetUpdateVSyncParametersCallback(
update_vsync_parameters_callback_ = std::move(callback);
}
void SkiaOutputSurfaceImpl::SetGpuVSyncEnabled(bool enabled) {
auto task = base::BindOnce(&SkiaOutputSurfaceImplOnGpu::SetGpuVSyncEnabled,
base::Unretained(impl_on_gpu_.get()), enabled);
task_sequence_->ScheduleOrRetainTask(std::move(task), {});
}
void SkiaOutputSurfaceImpl::SetGpuVSyncCallback(GpuVSyncCallback callback) {
gpu_vsync_callback_ = std::move(callback);
}
void SkiaOutputSurfaceImpl::SetDisplayTransformHint(
gfx::OverlayTransform transform) {
if (capabilities_.supports_pre_transform)
......@@ -604,22 +614,25 @@ void SkiaOutputSurfaceImpl::InitializeOnGpuThread(base::WaitableEvent* event,
base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(event)));
}
auto did_swap_buffer_complete_callback = base::BindRepeating(
&SkiaOutputSurfaceImpl::DidSwapBuffersComplete, weak_ptr_);
did_swap_buffer_complete_callback =
CreateSafeCallback(dependency_.get(), did_swap_buffer_complete_callback);
auto buffer_presented_callback =
base::BindRepeating(&SkiaOutputSurfaceImpl::BufferPresented, weak_ptr_);
buffer_presented_callback =
CreateSafeCallback(dependency_.get(), buffer_presented_callback);
auto context_lost_callback =
base::BindRepeating(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_);
context_lost_callback =
CreateSafeCallback(dependency_.get(), context_lost_callback);
auto did_swap_buffer_complete_callback = CreateSafeCallback(
dependency_.get(),
base::BindRepeating(&SkiaOutputSurfaceImpl::DidSwapBuffersComplete,
weak_ptr_));
auto buffer_presented_callback = CreateSafeCallback(
dependency_.get(),
base::BindRepeating(&SkiaOutputSurfaceImpl::BufferPresented, weak_ptr_));
auto context_lost_callback = CreateSafeCallback(
dependency_.get(),
base::BindRepeating(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_));
auto gpu_vsync_callback = CreateSafeCallback(
dependency_.get(),
base::BindRepeating(&SkiaOutputSurfaceImpl::OnGpuVSync, weak_ptr_));
impl_on_gpu_ = SkiaOutputSurfaceImplOnGpu::Create(
dependency_.get(), renderer_settings_, task_sequence_->GetSequenceId(),
did_swap_buffer_complete_callback, buffer_presented_callback,
context_lost_callback);
std::move(did_swap_buffer_complete_callback),
std::move(buffer_presented_callback), std::move(context_lost_callback),
std::move(gpu_vsync_callback));
if (!impl_on_gpu_) {
*result = false;
} else {
......@@ -685,6 +698,13 @@ void SkiaOutputSurfaceImpl::BufferPresented(
}
}
void SkiaOutputSurfaceImpl::OnGpuVSync(base::TimeTicks timebase,
base::TimeDelta interval) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (gpu_vsync_callback_)
gpu_vsync_callback_.Run(timebase, interval);
}
void SkiaOutputSurfaceImpl::ScheduleGpuTaskForTesting(
base::OnceClosure callback,
std::vector<gpu::SyncToken> sync_tokens) {
......
......@@ -70,6 +70,8 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
bool use_stencil) override;
void SetUpdateVSyncParametersCallback(
UpdateVSyncParametersCallback callback) override;
void SetGpuVSyncEnabled(bool enabled) override;
void SetGpuVSyncCallback(GpuVSyncCallback callback) override;
void SetDisplayTransformHint(gfx::OverlayTransform transform) override;
gfx::OverlayTransform GetDisplayTransform() override;
void SwapBuffers(OutputSurfaceFrame frame) override;
......@@ -149,6 +151,10 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
void DidSwapBuffersComplete(gpu::SwapBuffersCompleteParams params,
const gfx::Size& pixel_size);
void BufferPresented(const gfx::PresentationFeedback& feedback);
// Provided as a callback for the GPU thread.
void OnGpuVSync(base::TimeTicks timebase, base::TimeDelta interval);
void ScheduleGpuTask(base::OnceClosure callback,
std::vector<gpu::SyncToken> sync_tokens);
GrBackendFormat GetGrBackendFormatForTexture(
......@@ -177,6 +183,7 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
std::unique_ptr<SkiaOutputSurfaceDependency> dependency_;
const bool is_using_vulkan_;
UpdateVSyncParametersCallback update_vsync_parameters_callback_;
GpuVSyncCallback gpu_vsync_callback_;
bool is_displayed_as_overlay_ = false;
std::unique_ptr<base::WaitableEvent> initialize_waitable_event_;
......
......@@ -586,14 +586,16 @@ std::unique_ptr<SkiaOutputSurfaceImplOnGpu> SkiaOutputSurfaceImplOnGpu::Create(
SkiaOutputSurfaceDependency* deps,
const RendererSettings& renderer_settings,
const gpu::SequenceId sequence_id,
const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
const BufferPresentedCallback& buffer_presented_callback,
const ContextLostCallback& context_lost_callback) {
DidSwapBufferCompleteCallback did_swap_buffer_complete_callback,
BufferPresentedCallback buffer_presented_callback,
ContextLostCallback context_lost_callback,
GpuVSyncCallback gpu_vsync_callback) {
TRACE_EVENT0("viz", "SkiaOutputSurfaceImplOnGpu::Create");
auto impl_on_gpu = std::make_unique<SkiaOutputSurfaceImplOnGpu>(
util::PassKey<SkiaOutputSurfaceImplOnGpu>(), deps, renderer_settings,
sequence_id, did_swap_buffer_complete_callback, buffer_presented_callback,
context_lost_callback);
sequence_id, std::move(did_swap_buffer_complete_callback),
std::move(buffer_presented_callback), std::move(context_lost_callback),
std::move(gpu_vsync_callback));
if (!impl_on_gpu->Initialize())
impl_on_gpu = nullptr;
return impl_on_gpu;
......@@ -604,9 +606,10 @@ SkiaOutputSurfaceImplOnGpu::SkiaOutputSurfaceImplOnGpu(
SkiaOutputSurfaceDependency* deps,
const RendererSettings& renderer_settings,
const gpu::SequenceId sequence_id,
const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
const BufferPresentedCallback& buffer_presented_callback,
const ContextLostCallback& context_lost_callback)
DidSwapBufferCompleteCallback did_swap_buffer_complete_callback,
BufferPresentedCallback buffer_presented_callback,
ContextLostCallback context_lost_callback,
GpuVSyncCallback gpu_vsync_callback)
: dependency_(std::move(deps)),
feature_info_(dependency_->GetSharedContextState()->feature_info()),
sync_point_client_state_(
......@@ -616,9 +619,11 @@ SkiaOutputSurfaceImplOnGpu::SkiaOutputSurfaceImplOnGpu(
vulkan_context_provider_(dependency_->GetVulkanContextProvider()),
renderer_settings_(renderer_settings),
sequence_id_(sequence_id),
did_swap_buffer_complete_callback_(did_swap_buffer_complete_callback),
buffer_presented_callback_(buffer_presented_callback),
context_lost_callback_(context_lost_callback),
did_swap_buffer_complete_callback_(
std::move(did_swap_buffer_complete_callback)),
buffer_presented_callback_(std::move(buffer_presented_callback)),
context_lost_callback_(std::move(context_lost_callback)),
gpu_vsync_callback_(std::move(gpu_vsync_callback)),
gpu_preferences_(dependency_->GetGpuPreferences()) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
......@@ -1199,6 +1204,10 @@ void SkiaOutputSurfaceImplOnGpu::ScheduleDCLayers(
output_device_->ScheduleDCLayers(std::move(dc_layers));
}
void SkiaOutputSurfaceImplOnGpu::SetGpuVSyncEnabled(bool enabled) {
output_device_->SetGpuVSyncEnabled(enabled);
}
void SkiaOutputSurfaceImplOnGpu::SetCapabilitiesForTesting(
const OutputSurface::Capabilities& capabilities) {
MakeCurrent(false /* need_fbo0 */);
......@@ -1390,7 +1399,7 @@ const gpu::GpuPreferences& SkiaOutputSurfaceImplOnGpu::GetGpuPreferences()
}
GpuVSyncCallback SkiaOutputSurfaceImplOnGpu::GetGpuVSyncCallback() {
return base::DoNothing::Repeatedly<base::TimeTicks, base::TimeDelta>();
return gpu_vsync_callback_;
}
void SkiaOutputSurfaceImplOnGpu::DidSwapBuffersComplete(
......
......@@ -84,18 +84,20 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
SkiaOutputSurfaceDependency* deps,
const RendererSettings& renderer_settings,
const gpu::SequenceId sequence_id,
const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
const BufferPresentedCallback& buffer_presented_callback,
const ContextLostCallback& context_lost_callback);
DidSwapBufferCompleteCallback did_swap_buffer_complete_callback,
BufferPresentedCallback buffer_presented_callback,
ContextLostCallback context_lost_callback,
GpuVSyncCallback gpu_vsync_callback);
SkiaOutputSurfaceImplOnGpu(
util::PassKey<SkiaOutputSurfaceImplOnGpu> pass_key,
SkiaOutputSurfaceDependency* deps,
const RendererSettings& renderer_settings,
const gpu::SequenceId sequence_id,
const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
const BufferPresentedCallback& buffer_presented_callback,
const ContextLostCallback& context_lost_callback);
DidSwapBufferCompleteCallback did_swap_buffer_complete_callback,
BufferPresentedCallback buffer_presented_callback,
ContextLostCallback context_lost_callback,
GpuVSyncCallback gpu_vsync_callback);
~SkiaOutputSurfaceImplOnGpu() override;
gpu::CommandBufferId command_buffer_id() const {
......@@ -157,6 +159,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
image_contexts);
void SetEnableDCLayers(bool enable);
void ScheduleDCLayers(std::vector<DCLayerOverlay> dc_layers);
void SetGpuVSyncEnabled(bool enabled);
bool was_context_lost() { return context_state_->context_lost(); }
......@@ -220,6 +223,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
const DidSwapBufferCompleteCallback did_swap_buffer_complete_callback_;
const BufferPresentedCallback buffer_presented_callback_;
const ContextLostCallback context_lost_callback_;
const GpuVSyncCallback gpu_vsync_callback_;
#if defined(USE_OZONE)
// This should outlive gl_surface_ and vulkan_surface_.
......
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