Commit 50b5bffb authored by Daniel Libby's avatar Daniel Libby Committed by Commit Bot

Plumb gfx::SwapTimings out to Display

Note: based on crrev.com/c/1648953

In order to get swap timing in the renderer process, we'll need to send
down additional information via BeginFrame. crrev.com/c/1639559 adds a
new FrameTimingDetails struct that will be sent down, instead of just
the PresentationFeedback. We'll be adding to that struct in a future CL
that plumbs out swap information.

This struct add the first bit of plumbing from OutputSurface to Display.
OutputSurfaceClient::DidReceiveSwapBuffersAck now takes a SwapTimings
parameter, which will then be plubmed out to Surface then SurfaceClient
(CompositorFrameSinkSupport) once dependent changes all land.

Bug: 971712
Change-Id: Ibdd49356ce94261aec4a695b22f96dec1ed5e0ca
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1650224
Commit-Queue: Daniel Libby <dlibby@microsoft.com>
Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#670223}
parent 5d3b20d0
...@@ -381,7 +381,9 @@ void SurfacesInstance::DrawAndSwap(const gfx::Size& viewport, ...@@ -381,7 +381,9 @@ void SurfacesInstance::DrawAndSwap(const gfx::Size& viewport,
} }
display_->Resize(viewport); display_->Resize(viewport);
display_->DrawAndSwap(); display_->DrawAndSwap();
display_->DidReceiveSwapBuffersAck(); // TODO(dlibby): Consider sending real swap timings here for webview (or
// prove why it is not needed).
display_->DidReceiveSwapBuffersAck(gfx::SwapTimings());
gl_surface_->MaybeDidPresent(gfx::PresentationFeedback( gl_surface_->MaybeDidPresent(gfx::PresentationFeedback(
base::TimeTicks::Now(), base::TimeDelta(), 0 /* flags */)); base::TimeTicks::Now(), base::TimeDelta(), 0 /* flags */));
} }
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
namespace cc { namespace cc {
void FakeOutputSurfaceClient::DidReceiveSwapBuffersAck() { void FakeOutputSurfaceClient::DidReceiveSwapBuffersAck(
const gfx::SwapTimings&) {
swap_count_++; swap_count_++;
} }
......
...@@ -14,7 +14,7 @@ class FakeOutputSurfaceClient : public viz::OutputSurfaceClient { ...@@ -14,7 +14,7 @@ class FakeOutputSurfaceClient : public viz::OutputSurfaceClient {
FakeOutputSurfaceClient() = default; FakeOutputSurfaceClient() = default;
void SetNeedsRedrawRect(const gfx::Rect& damage_rect) override {} void SetNeedsRedrawRect(const gfx::Rect& damage_rect) override {}
void DidReceiveSwapBuffersAck() override; void DidReceiveSwapBuffersAck(const gfx::SwapTimings& timings) override;
void DidReceiveTextureInUseResponses( void DidReceiveTextureInUseResponses(
const gpu::TextureInUseResponses& responses) override {} const gpu::TextureInUseResponses& responses) override {}
void DidReceiveCALayerParams( void DidReceiveCALayerParams(
......
...@@ -77,7 +77,7 @@ void PixelTestOutputSurface::SwapBuffers(viz::OutputSurfaceFrame frame) { ...@@ -77,7 +77,7 @@ void PixelTestOutputSurface::SwapBuffers(viz::OutputSurfaceFrame frame) {
} }
void PixelTestOutputSurface::SwapBuffersCallback() { void PixelTestOutputSurface::SwapBuffersCallback() {
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(gfx::SwapTimings());
client_->DidReceivePresentationFeedback( client_->DidReceivePresentationFeedback(
gfx::PresentationFeedback(base::TimeTicks::Now(), base::TimeDelta(), 0)); gfx::PresentationFeedback(base::TimeTicks::Now(), base::TimeDelta(), 0));
} }
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/overlay_transform_utils.h" #include "ui/gfx/overlay_transform_utils.h"
#include "ui/gfx/presentation_feedback.h" #include "ui/gfx/presentation_feedback.h"
#include "ui/gfx/swap_result.h"
namespace viz { namespace viz {
...@@ -599,7 +600,7 @@ bool Display::DrawAndSwap() { ...@@ -599,7 +600,7 @@ bool Display::DrawAndSwap() {
return true; return true;
} }
void Display::DidReceiveSwapBuffersAck() { void Display::DidReceiveSwapBuffersAck(const gfx::SwapTimings& timings) {
if (scheduler_) { if (scheduler_) {
scheduler_->DidReceiveSwapBuffersAck(); scheduler_->DidReceiveSwapBuffersAck();
if (no_pending_swaps_callback_ && scheduler_->pending_swaps() == 0) if (no_pending_swaps_callback_ && scheduler_->pending_swaps() == 0)
...@@ -608,6 +609,19 @@ void Display::DidReceiveSwapBuffersAck() { ...@@ -608,6 +609,19 @@ void Display::DidReceiveSwapBuffersAck() {
if (renderer_) if (renderer_)
renderer_->SwapBuffersComplete(); renderer_->SwapBuffersComplete();
// Adding to pending_presented_callbacks_ must have been done in DrawAndSwap,
// and should not be popped until DidReceivePresentationFeedback. Therefore
// we must not have an empty list when getting the SwapBuffers ACK (this is
// required to happen between those two events).
DCHECK(!pending_presented_callbacks_.empty());
// Check that the swap timings correspond with the timestamp from when
// the swap was triggered. Note that not all output surfaces provide timing
// information, hence the check for a valid swap_start.
const auto swap_time = pending_presented_callbacks_.front().first;
if (!timings.swap_start.is_null())
DCHECK_LE(swap_time, timings.swap_start);
} }
void Display::DidReceiveTextureInUseResponses( void Display::DidReceiveTextureInUseResponses(
......
...@@ -126,7 +126,7 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient, ...@@ -126,7 +126,7 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient,
// OutputSurfaceClient implementation. // OutputSurfaceClient implementation.
void SetNeedsRedrawRect(const gfx::Rect& damage_rect) override; void SetNeedsRedrawRect(const gfx::Rect& damage_rect) override;
void DidReceiveSwapBuffersAck() override; void DidReceiveSwapBuffersAck(const gfx::SwapTimings& timings) override;
void DidReceiveTextureInUseResponses( void DidReceiveTextureInUseResponses(
const gpu::TextureInUseResponses& responses) override; const gpu::TextureInUseResponses& responses) override;
void DidReceiveCALayerParams( void DidReceiveCALayerParams(
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
namespace gfx { namespace gfx {
struct CALayerParams; struct CALayerParams;
struct PresentationFeedback; struct PresentationFeedback;
struct SwapTimings;
} // namespace gfx } // namespace gfx
namespace viz { namespace viz {
...@@ -25,8 +26,9 @@ namespace viz { ...@@ -25,8 +26,9 @@ namespace viz {
class VIZ_SERVICE_EXPORT OutputSurfaceClient { class VIZ_SERVICE_EXPORT OutputSurfaceClient {
public: public:
// A notification that the swap of the backbuffer to the hardware is complete // A notification that the swap of the backbuffer to the hardware is complete
// and is now visible to the user. // and is now visible to the user, along with timing information on when the
virtual void DidReceiveSwapBuffersAck() = 0; // swapping of the backbuffer started and completed.
virtual void DidReceiveSwapBuffersAck(const gfx::SwapTimings& timings) = 0;
// For surfaceless/ozone implementations to create damage for the next frame. // For surfaceless/ozone implementations to create damage for the next frame.
virtual void SetNeedsRedrawRect(const gfx::Rect& damage_rect) = 0; virtual void SetNeedsRedrawRect(const gfx::Rect& damage_rect) = 0;
......
...@@ -154,8 +154,9 @@ bool GLOutputSurface::HasExternalStencilTest() const { ...@@ -154,8 +154,9 @@ bool GLOutputSurface::HasExternalStencilTest() const {
void GLOutputSurface::ApplyExternalStencil() {} void GLOutputSurface::ApplyExternalStencil() {}
void GLOutputSurface::DidReceiveSwapBuffersAck(gfx::SwapResult result) { void GLOutputSurface::DidReceiveSwapBuffersAck(
client_->DidReceiveSwapBuffersAck(); const gfx::SwapResponse& response) {
client_->DidReceiveSwapBuffersAck(response.timings);
} }
void GLOutputSurface::HandlePartialSwap( void GLOutputSurface::HandlePartialSwap(
...@@ -176,7 +177,7 @@ void GLOutputSurface::OnGpuSwapBuffersCompleted( ...@@ -176,7 +177,7 @@ void GLOutputSurface::OnGpuSwapBuffersCompleted(
client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses); client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses);
if (!params.ca_layer_params.is_empty) if (!params.ca_layer_params.is_empty)
client_->DidReceiveCALayerParams(params.ca_layer_params); client_->DidReceiveCALayerParams(params.ca_layer_params);
DidReceiveSwapBuffersAck(params.swap_response.result); DidReceiveSwapBuffersAck(params.swap_response);
UpdateLatencyInfoOnSwap(params.swap_response, &latency_info); UpdateLatencyInfoOnSwap(params.swap_response, &latency_info);
latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
......
...@@ -59,7 +59,7 @@ class GLOutputSurface : public OutputSurface { ...@@ -59,7 +59,7 @@ class GLOutputSurface : public OutputSurface {
ui::LatencyTracker* latency_tracker() { return &latency_tracker_; } ui::LatencyTracker* latency_tracker() { return &latency_tracker_; }
// Called when a swap completion is signaled from ImageTransportSurface. // Called when a swap completion is signaled from ImageTransportSurface.
virtual void DidReceiveSwapBuffersAck(gfx::SwapResult result); virtual void DidReceiveSwapBuffersAck(const gfx::SwapResponse& response);
// Called in SwapBuffers() when a swap is determined to be partial. Subclasses // Called in SwapBuffers() when a swap is determined to be partial. Subclasses
// might override this method because different platforms handle partial swaps // might override this method because different platforms handle partial swaps
......
...@@ -102,18 +102,17 @@ gfx::BufferFormat GLOutputSurfaceBufferQueue::GetOverlayBufferFormat() const { ...@@ -102,18 +102,17 @@ gfx::BufferFormat GLOutputSurfaceBufferQueue::GetOverlayBufferFormat() const {
} }
void GLOutputSurfaceBufferQueue::DidReceiveSwapBuffersAck( void GLOutputSurfaceBufferQueue::DidReceiveSwapBuffersAck(
gfx::SwapResult result) { const gfx::SwapResponse& response) {
bool force_swap = false; bool force_swap = false;
if (result == gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS) { if (response.result == gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS) {
// Even through the swap failed, this is a fixable error so we can pretend // Even through the swap failed, this is a fixable error so we can pretend
// it succeeded to the rest of the system. // it succeeded to the rest of the system.
result = gfx::SwapResult::SWAP_ACK;
buffer_queue_->RecreateBuffers(); buffer_queue_->RecreateBuffers();
force_swap = true; force_swap = true;
} }
buffer_queue_->PageFlipComplete(); buffer_queue_->PageFlipComplete();
client()->DidReceiveSwapBuffersAck(); client()->DidReceiveSwapBuffersAck(response.timings);
if (force_swap) if (force_swap)
client()->SetNeedsRedrawRect(gfx::Rect(swap_size_)); client()->SetNeedsRedrawRect(gfx::Rect(swap_size_));
......
...@@ -62,7 +62,7 @@ class GLOutputSurfaceBufferQueue : public GLOutputSurface { ...@@ -62,7 +62,7 @@ class GLOutputSurfaceBufferQueue : public GLOutputSurface {
void SetDrawRectangle(const gfx::Rect& damage) override; void SetDrawRectangle(const gfx::Rect& damage) override;
// GLOutputSurface: // GLOutputSurface:
void DidReceiveSwapBuffersAck(gfx::SwapResult result) override; void DidReceiveSwapBuffersAck(const gfx::SwapResponse& response) override;
std::unique_ptr<BufferQueue> buffer_queue_; std::unique_ptr<BufferQueue> buffer_queue_;
......
...@@ -117,7 +117,9 @@ void GLOutputSurfaceOffscreen::SwapBuffers(OutputSurfaceFrame frame) { ...@@ -117,7 +117,9 @@ void GLOutputSurfaceOffscreen::SwapBuffers(OutputSurfaceFrame frame) {
void GLOutputSurfaceOffscreen::OnSwapBuffersComplete( void GLOutputSurfaceOffscreen::OnSwapBuffersComplete(
std::vector<ui::LatencyInfo> latency_info) { std::vector<ui::LatencyInfo> latency_info) {
latency_tracker()->OnGpuSwapBuffersCompleted(latency_info); latency_tracker()->OnGpuSwapBuffersCompleted(latency_info);
client()->DidReceiveSwapBuffersAck(); // Swap timings are not available since for offscreen there is no Swap, just
// a SignalSyncToken.
client()->DidReceiveSwapBuffersAck(gfx::SwapTimings());
client()->DidReceivePresentationFeedback(gfx::PresentationFeedback()); client()->DidReceivePresentationFeedback(gfx::PresentationFeedback());
} }
......
...@@ -46,6 +46,9 @@ gfx::SwapResponse SkiaOutputDevice::FinishSwapBuffers(gfx::SwapResult result) { ...@@ -46,6 +46,9 @@ gfx::SwapResponse SkiaOutputDevice::FinishSwapBuffers(gfx::SwapResult result) {
params_->swap_response.result = result; params_->swap_response.result = result;
params_->swap_response.timings.swap_end = base::TimeTicks::Now(); params_->swap_response.timings.swap_end = base::TimeTicks::Now();
did_swap_buffer_complete_callback_.Run(
*params_, gfx::Size(draw_surface_->width(), draw_surface_->height()));
if (feedback_) { if (feedback_) {
std::move(*feedback_) std::move(*feedback_)
.Run(gfx::PresentationFeedback( .Run(gfx::PresentationFeedback(
...@@ -55,8 +58,6 @@ gfx::SwapResponse SkiaOutputDevice::FinishSwapBuffers(gfx::SwapResult result) { ...@@ -55,8 +58,6 @@ gfx::SwapResponse SkiaOutputDevice::FinishSwapBuffers(gfx::SwapResult result) {
? 0 ? 0
: gfx::PresentationFeedback::Flags::kFailure)); : gfx::PresentationFeedback::Flags::kFailure));
} }
did_swap_buffer_complete_callback_.Run(
*params_, gfx::Size(draw_surface_->width(), draw_surface_->height()));
feedback_.reset(); feedback_.reset();
auto response = params_->swap_response; auto response = params_->swap_response;
......
...@@ -573,7 +573,7 @@ void SkiaOutputSurfaceImpl::DidSwapBuffersComplete( ...@@ -573,7 +573,7 @@ void SkiaOutputSurfaceImpl::DidSwapBuffersComplete(
client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses); client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses);
if (!params.ca_layer_params.is_empty) if (!params.ca_layer_params.is_empty)
client_->DidReceiveCALayerParams(params.ca_layer_params); client_->DidReceiveCALayerParams(params.ca_layer_params);
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(params.swap_response.timings);
if (needs_swap_size_notifications_) if (needs_swap_size_notifications_)
client_->DidSwapWithSize(pixel_size); client_->DidSwapWithSize(pixel_size);
} }
......
...@@ -252,11 +252,14 @@ void SkiaOutputSurfaceImplNonDDL::ReleaseCachedResources( ...@@ -252,11 +252,14 @@ void SkiaOutputSurfaceImplNonDDL::ReleaseCachedResources(
void SkiaOutputSurfaceImplNonDDL::SkiaSwapBuffers(OutputSurfaceFrame frame) { void SkiaOutputSurfaceImplNonDDL::SkiaSwapBuffers(OutputSurfaceFrame frame) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
gfx::SwapTimings swap_timings;
swap_timings.swap_start = base::TimeTicks::Now();
gl_surface_->SwapBuffers( gl_surface_->SwapBuffers(
base::BindOnce(&SkiaOutputSurfaceImplNonDDL::BufferPresented, base::BindOnce(&SkiaOutputSurfaceImplNonDDL::BufferPresented,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
swap_timings.swap_end = base::TimeTicks::Now();
if (need_swapbuffers_ack_) if (need_swapbuffers_ack_)
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(swap_timings);
} }
SkCanvas* SkiaOutputSurfaceImplNonDDL::BeginPaintRenderPass( SkCanvas* SkiaOutputSurfaceImplNonDDL::BeginPaintRenderPass(
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "components/viz/service/display/output_surface_frame.h" #include "components/viz/service/display/output_surface_frame.h"
#include "components/viz/service/display/software_output_device.h" #include "components/viz/service/display/software_output_device.h"
#include "ui/gfx/presentation_feedback.h" #include "ui/gfx/presentation_feedback.h"
#include "ui/gfx/swap_result.h"
#include "ui/gfx/vsync_provider.h" #include "ui/gfx/vsync_provider.h"
#include "ui/latency/latency_info.h" #include "ui/latency/latency_info.h"
...@@ -71,8 +72,9 @@ void SoftwareOutputSurface::SwapBuffers(OutputSurfaceFrame frame) { ...@@ -71,8 +72,9 @@ void SoftwareOutputSurface::SwapBuffers(OutputSurfaceFrame frame) {
<< "arrive before the previous latency info is processed."; << "arrive before the previous latency info is processed.";
stored_latency_info_ = std::move(frame.latency_info); stored_latency_info_ = std::move(frame.latency_info);
software_device()->OnSwapBuffers(base::BindOnce( software_device()->OnSwapBuffers(
&SoftwareOutputSurface::SwapBuffersCallback, weak_factory_.GetWeakPtr())); base::BindOnce(&SoftwareOutputSurface::SwapBuffersCallback,
weak_factory_.GetWeakPtr(), swap_time));
gfx::VSyncProvider* vsync_provider = software_device()->GetVSyncProvider(); gfx::VSyncProvider* vsync_provider = software_device()->GetVSyncProvider();
if (vsync_provider && update_vsync_parameters_callback_) { if (vsync_provider && update_vsync_parameters_callback_) {
...@@ -106,11 +108,12 @@ uint32_t SoftwareOutputSurface::GetFramebufferCopyTextureFormat() { ...@@ -106,11 +108,12 @@ uint32_t SoftwareOutputSurface::GetFramebufferCopyTextureFormat() {
return 0; return 0;
} }
void SoftwareOutputSurface::SwapBuffersCallback(const gfx::Size& pixel_size) { void SoftwareOutputSurface::SwapBuffersCallback(base::TimeTicks swap_time,
const gfx::Size& pixel_size) {
latency_tracker_.OnGpuSwapBuffersCompleted(stored_latency_info_); latency_tracker_.OnGpuSwapBuffersCompleted(stored_latency_info_);
client_->DidFinishLatencyInfo(stored_latency_info_); client_->DidFinishLatencyInfo(stored_latency_info_);
std::vector<ui::LatencyInfo>().swap(stored_latency_info_); std::vector<ui::LatencyInfo>().swap(stored_latency_info_);
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck({swap_time, swap_time});
base::TimeTicks now = base::TimeTicks::Now(); base::TimeTicks now = base::TimeTicks::Now();
base::TimeDelta interval_to_next_refresh = base::TimeDelta interval_to_next_refresh =
......
...@@ -53,7 +53,8 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : public OutputSurface { ...@@ -53,7 +53,8 @@ class VIZ_SERVICE_EXPORT SoftwareOutputSurface : public OutputSurface {
#endif #endif
private: private:
void SwapBuffersCallback(const gfx::Size& pixel_size); void SwapBuffersCallback(base::TimeTicks swap_time,
const gfx::Size& pixel_size);
void UpdateVSyncParameters(base::TimeTicks timebase, void UpdateVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval); base::TimeDelta interval);
......
...@@ -54,9 +54,9 @@ void FakeOutputSurface::SwapBuffers(OutputSurfaceFrame frame) { ...@@ -54,9 +54,9 @@ void FakeOutputSurface::SwapBuffers(OutputSurfaceFrame frame) {
} }
void FakeOutputSurface::SwapBuffersAck() { void FakeOutputSurface::SwapBuffersAck() {
client_->DidReceiveSwapBuffersAck(); base::TimeTicks now = base::TimeTicks::Now();
client_->DidReceivePresentationFeedback( client_->DidReceiveSwapBuffersAck({now, now});
{base::TimeTicks::Now(), base::TimeDelta(), 0}); client_->DidReceivePresentationFeedback({now, base::TimeDelta(), 0});
} }
void FakeOutputSurface::BindFramebuffer() { void FakeOutputSurface::BindFramebuffer() {
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "third_party/skia/include/core/SkPixelRef.h" #include "third_party/skia/include/core/SkPixelRef.h"
#include "third_party/skia/include/gpu/GrBackendSurface.h" #include "third_party/skia/include/gpu/GrBackendSurface.h"
#include "third_party/skia/include/gpu/gl/GrGLTypes.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h"
#include "ui/gfx/swap_result.h"
#include "ui/gl/gl_utils.h" #include "ui/gl/gl_utils.h"
namespace viz { namespace viz {
...@@ -330,9 +331,9 @@ bool FakeSkiaOutputSurface::GetGrBackendTexture( ...@@ -330,9 +331,9 @@ bool FakeSkiaOutputSurface::GetGrBackendTexture(
} }
void FakeSkiaOutputSurface::SwapBuffersAck() { void FakeSkiaOutputSurface::SwapBuffersAck() {
client_->DidReceiveSwapBuffersAck(); base::TimeTicks now = base::TimeTicks::Now();
client_->DidReceivePresentationFeedback( client_->DidReceiveSwapBuffersAck({now, now});
{base::TimeTicks::Now(), base::TimeDelta(), 0}); client_->DidReceivePresentationFeedback({now, base::TimeDelta(), 0});
} }
} // namespace viz } // namespace viz
...@@ -50,7 +50,7 @@ void GpuBrowserCompositorOutputSurface::OnGpuSwapBuffersCompleted( ...@@ -50,7 +50,7 @@ void GpuBrowserCompositorOutputSurface::OnGpuSwapBuffersCompleted(
client_->DidReceiveCALayerParams(params.ca_layer_params); client_->DidReceiveCALayerParams(params.ca_layer_params);
if (!params.texture_in_use_responses.empty()) if (!params.texture_in_use_responses.empty())
client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses); client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses);
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(params.swap_response.timings);
UpdateLatencyInfoOnSwap(params.swap_response, &latency_info); UpdateLatencyInfoOnSwap(params.swap_response, &latency_info);
latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
} }
......
...@@ -186,7 +186,9 @@ void OffscreenBrowserCompositorOutputSurface::OnReflectorChanged() { ...@@ -186,7 +186,9 @@ void OffscreenBrowserCompositorOutputSurface::OnReflectorChanged() {
void OffscreenBrowserCompositorOutputSurface::OnSwapBuffersComplete( void OffscreenBrowserCompositorOutputSurface::OnSwapBuffersComplete(
const std::vector<ui::LatencyInfo>& latency_info) { const std::vector<ui::LatencyInfo>& latency_info) {
latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
client_->DidReceiveSwapBuffersAck(); // Swap timings are not available since for offscreen there is no Swap, just
// a SignalSyncToken.
client_->DidReceiveSwapBuffersAck(gfx::SwapTimings());
client_->DidReceivePresentationFeedback(gfx::PresentationFeedback()); client_->DidReceivePresentationFeedback(gfx::PresentationFeedback());
} }
......
...@@ -81,14 +81,15 @@ void SoftwareBrowserCompositorOutputSurface::SwapBuffers( ...@@ -81,14 +81,15 @@ void SoftwareBrowserCompositorOutputSurface::SwapBuffers(
software_device()->OnSwapBuffers(base::BindOnce( software_device()->OnSwapBuffers(base::BindOnce(
&SoftwareBrowserCompositorOutputSurface::SwapBuffersCallback, &SoftwareBrowserCompositorOutputSurface::SwapBuffersCallback,
weak_factory_.GetWeakPtr(), frame.latency_info)); weak_factory_.GetWeakPtr(), frame.latency_info, swap_time));
} }
void SoftwareBrowserCompositorOutputSurface::SwapBuffersCallback( void SoftwareBrowserCompositorOutputSurface::SwapBuffersCallback(
const std::vector<ui::LatencyInfo>& latency_info, const std::vector<ui::LatencyInfo>& latency_info,
const base::TimeTicks& swap_time,
const gfx::Size& pixel_size) { const gfx::Size& pixel_size) {
latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck({swap_time, swap_time});
#if defined(USE_X11) #if defined(USE_X11)
if (needs_swap_size_notifications_) if (needs_swap_size_notifications_)
client_->DidSwapWithSize(pixel_size); client_->DidSwapWithSize(pixel_size);
......
...@@ -46,6 +46,7 @@ class CONTENT_EXPORT SoftwareBrowserCompositorOutputSurface ...@@ -46,6 +46,7 @@ class CONTENT_EXPORT SoftwareBrowserCompositorOutputSurface
private: private:
void SwapBuffersCallback(const std::vector<ui::LatencyInfo>& latency_info, void SwapBuffersCallback(const std::vector<ui::LatencyInfo>& latency_info,
const base::TimeTicks& swap_time,
const gfx::Size& pixel_size); const gfx::Size& pixel_size);
void UpdateVSyncCallback(const base::TimeTicks timebase, void UpdateVSyncCallback(const base::TimeTicks timebase,
const base::TimeDelta interval); const base::TimeDelta interval);
......
...@@ -315,7 +315,7 @@ class AndroidOutputSurface : public viz::OutputSurface { ...@@ -315,7 +315,7 @@ class AndroidOutputSurface : public viz::OutputSurface {
void OnSwapBuffersCompleted(std::vector<ui::LatencyInfo> latency_info, void OnSwapBuffersCompleted(std::vector<ui::LatencyInfo> latency_info,
gfx::Size swap_size, gfx::Size swap_size,
const gpu::SwapBuffersCompleteParams& params) { const gpu::SwapBuffersCompleteParams& params) {
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(params.swap_response.timings);
swap_buffers_callback_.Run(swap_size); swap_buffers_callback_.Run(swap_size);
UpdateLatencyInfoOnSwap(params.swap_response, &latency_info); UpdateLatencyInfoOnSwap(params.swap_response, &latency_info);
latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
......
...@@ -134,7 +134,7 @@ class DirectOutputSurface : public viz::OutputSurface { ...@@ -134,7 +134,7 @@ class DirectOutputSurface : public viz::OutputSurface {
private: private:
void OnSwapBuffersComplete() { void OnSwapBuffersComplete() {
client_->DidReceiveSwapBuffersAck(); client_->DidReceiveSwapBuffersAck(gfx::SwapTimings());
client_->DidReceivePresentationFeedback(gfx::PresentationFeedback()); client_->DidReceivePresentationFeedback(gfx::PresentationFeedback());
} }
......
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