| Index: cc/surfaces/display.cc
|
| diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
|
| index a0ffb2ce35fce3f46f4c5674d1de15016926f006..235e67487669d796fdc84bc5d72fb084af073bd7 100644
|
| --- a/cc/surfaces/display.cc
|
| +++ b/cc/surfaces/display.cc
|
| @@ -12,6 +12,7 @@
|
| #include "cc/output/compositor_frame.h"
|
| #include "cc/output/direct_renderer.h"
|
| #include "cc/output/gl_renderer.h"
|
| +#include "cc/output/output_surface_frame.h"
|
| #include "cc/output/renderer_settings.h"
|
| #include "cc/output/software_renderer.h"
|
| #include "cc/output/texture_mailbox_deleter.h"
|
| @@ -42,15 +43,18 @@ Display::Display(SharedBitmapManager* bitmap_manager,
|
| gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
|
| settings_(settings),
|
| frame_sink_id_(frame_sink_id),
|
| - begin_frame_source_(std::move(begin_frame_source)),
|
| + begin_frame_source_(
|
| + new DisplayBeginFrameSource(std::move(begin_frame_source))),
|
| output_surface_(std::move(output_surface)),
|
| scheduler_(std::move(scheduler)),
|
| texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) {
|
| DCHECK(output_surface_);
|
| - DCHECK_EQ(!scheduler_, !begin_frame_source_);
|
| + DCHECK_EQ(!scheduler_, !begin_frame_source_->GetWrappedSource());
|
| DCHECK(frame_sink_id_.is_valid());
|
| - if (scheduler_)
|
| + if (scheduler_) {
|
| scheduler_->SetClient(this);
|
| + scheduler_->SetBeginFrameSource(begin_frame_source_.get());
|
| + }
|
| }
|
|
|
| Display::~Display() {
|
| @@ -58,8 +62,7 @@ Display::~Display() {
|
| if (client_) {
|
| if (auto* context = output_surface_->context_provider())
|
| context->SetLostContextCallback(base::Closure());
|
| - if (begin_frame_source_)
|
| - surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get());
|
| + surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get());
|
| surface_manager_->RemoveObserver(this);
|
| }
|
| if (aggregator_) {
|
| @@ -82,10 +85,8 @@ void Display::Initialize(DisplayClient* client,
|
|
|
| // This must be done in Initialize() so that the caller can delay this until
|
| // they are ready to receive a BeginFrameSource.
|
| - if (begin_frame_source_) {
|
| - surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(),
|
| - frame_sink_id_);
|
| - }
|
| + surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(),
|
| + frame_sink_id_);
|
|
|
| output_surface_->BindToClient(this);
|
| InitializeRenderer();
|
| @@ -328,7 +329,15 @@ bool Display::DrawAndSwap() {
|
| "Display::DrawAndSwap");
|
| }
|
| benchmark_instrumentation::IssueDisplayRenderingStatsEvent();
|
| - renderer_->SwapBuffers(std::move(frame.metadata.latency_info));
|
| + OutputSurfaceFrame output_frame;
|
| + output_frame.latency_info = std::move(frame.metadata.latency_info);
|
| + // Pass on frame number information through |output_frame| for output
|
| + // surfaces that acknowledge the frame to an external BeginFrameSource.
|
| + output_frame.begin_frame_source_id = begin_frame_source_->CurrentSourceId();
|
| + output_frame.begin_frame_number = begin_frame_source_->CurrentFrameNumber();
|
| + output_frame.begin_frame_number =
|
| + begin_frame_source_->LatestConfirmedFrame();
|
| + renderer_->SwapBuffers(std::move(output_frame));
|
| if (scheduler_)
|
| scheduler_->DidSwapBuffers();
|
| } else {
|
| @@ -403,4 +412,9 @@ void Display::ForceImmediateDrawAndSwapIfPossible() {
|
| scheduler_->ForceImmediateSwapIfPossible();
|
| }
|
|
|
| +void Display::SwapBeginFrameSource(
|
| + std::unique_ptr<BeginFrameSource>* begin_frame_source) {
|
| + begin_frame_source_->SwapWrappedSource(begin_frame_source);
|
| +}
|
| +
|
| } // namespace cc
|
|
|