Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Unified Diff: cc/surfaces/direct_compositor_frame_sink_unittest.cc

Issue 2727553004: [cc] Forward BeginFrameAcks through DirectCFS and CFSSupport. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698