| Index: cc/surfaces/direct_compositor_frame_sink_unittest.cc
|
| diff --git a/cc/surfaces/direct_compositor_frame_sink_unittest.cc b/cc/surfaces/direct_compositor_frame_sink_unittest.cc
|
| index 8ce6043c937f0c9bd3555898c8fbfa09c6f2603e..3bc52f1621a94e17fc062330e0baf5cf091090fe 100644
|
| --- a/cc/surfaces/direct_compositor_frame_sink_unittest.cc
|
| +++ b/cc/surfaces/direct_compositor_frame_sink_unittest.cc
|
| @@ -16,6 +16,7 @@
|
| #include "cc/surfaces/frame_sink_id.h"
|
| #include "cc/surfaces/local_surface_id_allocator.h"
|
| #include "cc/surfaces/surface_manager.h"
|
| +#include "cc/test/begin_frame_args_test.h"
|
| #include "cc/test/fake_compositor_frame_sink_client.h"
|
| #include "cc/test/fake_output_surface.h"
|
| #include "cc/test/ordered_simple_task_runner.h"
|
| @@ -29,6 +30,35 @@ namespace {
|
|
|
| static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
|
|
|
| +class ObserverTrackingBeginFrameSource : public BackToBackBeginFrameSource {
|
| + public:
|
| + using BackToBackBeginFrameSource::BackToBackBeginFrameSource;
|
| +
|
| + void DidFinishFrame(BeginFrameObserver* obs,
|
| + const BeginFrameAck& ack) override {
|
| + BackToBackBeginFrameSource::DidFinishFrame(obs, ack);
|
| + if (obs == tracked_observer_)
|
| + last_ack_ = ack;
|
| + }
|
| +
|
| + void set_tracked_observer(BeginFrameObserver* obs) {
|
| + tracked_observer_ = obs;
|
| + }
|
| +
|
| + const BeginFrameAck& last_ack() const { return last_ack_; }
|
| +
|
| + private:
|
| + BeginFrameObserver* tracked_observer_ = nullptr;
|
| + BeginFrameAck last_ack_;
|
| +};
|
| +
|
| +class TestDirectCompositorFrameSink : public DirectCompositorFrameSink {
|
| + public:
|
| + using DirectCompositorFrameSink::DirectCompositorFrameSink;
|
| +
|
| + CompositorFrameSinkSupport* support() const { return support_.get(); }
|
| +};
|
| +
|
| class DirectCompositorFrameSinkTest : public testing::Test {
|
| public:
|
| DirectCompositorFrameSinkTest()
|
| @@ -43,7 +73,7 @@ class DirectCompositorFrameSinkTest : public testing::Test {
|
| FakeOutputSurface::Create3d();
|
| display_output_surface_ = display_output_surface.get();
|
|
|
| - begin_frame_source_.reset(new BackToBackBeginFrameSource(
|
| + begin_frame_source_.reset(new ObserverTrackingBeginFrameSource(
|
| base::MakeUnique<DelayBasedTimeSource>(task_runner_.get())));
|
|
|
| int max_frames_pending = 2;
|
| @@ -55,12 +85,14 @@ class DirectCompositorFrameSinkTest : public testing::Test {
|
| kArbitraryFrameSinkId, begin_frame_source_.get(),
|
| std::move(display_output_surface), std::move(scheduler),
|
| base::MakeUnique<TextureMailboxDeleter>(task_runner_.get())));
|
| - compositor_frame_sink_.reset(new DirectCompositorFrameSink(
|
| + compositor_frame_sink_.reset(new TestDirectCompositorFrameSink(
|
| kArbitraryFrameSinkId, &surface_manager_, display_.get(),
|
| context_provider_, nullptr, &gpu_memory_buffer_manager_,
|
| &bitmap_manager_));
|
|
|
| compositor_frame_sink_->BindToClient(&compositor_frame_sink_client_);
|
| + begin_frame_source_->set_tracked_observer(
|
| + compositor_frame_sink_->support());
|
| display_->Resize(display_size_);
|
| display_->SetVisible(true);
|
|
|
| @@ -103,10 +135,10 @@ class DirectCompositorFrameSinkTest : public testing::Test {
|
|
|
| scoped_refptr<TestContextProvider> context_provider_;
|
| FakeOutputSurface* display_output_surface_ = nullptr;
|
| - std::unique_ptr<BeginFrameSource> begin_frame_source_;
|
| + std::unique_ptr<ObserverTrackingBeginFrameSource> begin_frame_source_;
|
| std::unique_ptr<Display> display_;
|
| FakeCompositorFrameSinkClient compositor_frame_sink_client_;
|
| - std::unique_ptr<DirectCompositorFrameSink> compositor_frame_sink_;
|
| + std::unique_ptr<TestDirectCompositorFrameSink> compositor_frame_sink_;
|
| };
|
|
|
| TEST_F(DirectCompositorFrameSinkTest, DamageTriggersSwapBuffers) {
|
| @@ -151,5 +183,37 @@ TEST_F(DirectCompositorFrameSinkTest,
|
| EXPECT_EQ(1u, display_output_surface_->num_sent_frames());
|
| }
|
|
|
| +class TestBeginFrameObserver : public BeginFrameObserverBase {
|
| + public:
|
| + explicit TestBeginFrameObserver(BeginFrameSource* source) : source_(source) {}
|
| +
|
| + void FinishFrame() { source_->DidFinishFrame(this, ack()); }
|
| +
|
| + const BeginFrameAck& ack() const { return ack_; }
|
| +
|
| + private:
|
| + bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
|
| + ack_ = BeginFrameAck(args.source_id, args.sequence_number,
|
| + args.sequence_number, 0, true);
|
| + return true;
|
| + }
|
| +
|
| + void OnBeginFrameSourcePausedChanged(bool paused) override{};
|
| +
|
| + BeginFrameSource* source_;
|
| + BeginFrameAck ack_;
|
| +};
|
| +
|
| +TEST_F(DirectCompositorFrameSinkTest, AcknowledgesBeginFrames) {
|
| + // Request a BeginFrame from the CompositorFrameSinkClient.
|
| + TestBeginFrameObserver observer(begin_frame_source_.get());
|
| + compositor_frame_sink_client_.begin_frame_source()->AddObserver(&observer);
|
| + observer.FinishFrame();
|
| + compositor_frame_sink_client_.begin_frame_source()->RemoveObserver(&observer);
|
| +
|
| + // Verify that the frame sink acknowledged the last BeginFrame.
|
| + EXPECT_EQ(observer.ack(), begin_frame_source_->last_ack());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|