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