1aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include <android/dvr/BnVrComposerCallback.h>
2aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include <binder/IServiceManager.h>
3aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include <gtest/gtest.h>
4aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include <sys/eventfd.h>
5aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include <vr_composer.h>
6aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
7aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace android {
8aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace dvr {
9aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace {
10aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
11aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaraconst char kVrDisplayName[] = "VrDisplay_Test";
12aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
138fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoaraclass TestComposerView : public ComposerView {
148fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara public:
158fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  TestComposerView() {}
168fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  ~TestComposerView() override = default;
178fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
188fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  size_t display_refresh_count() const { return display_refresh_count_; }
198fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
208fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  void ForceDisplaysRefresh() override { display_refresh_count_++; }
218fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  void RegisterObserver(Observer* observer) override {}
228fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  void UnregisterObserver(Observer* observer) override {}
238fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
248fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  TestComposerView(const TestComposerView&) = delete;
258fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  void operator=(const TestComposerView&) = delete;
268fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
278fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara private:
288fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  size_t display_refresh_count_ = 0;
298fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara};
308fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
31aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaraclass TestComposerCallback : public BnVrComposerCallback {
32aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara public:
33aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  TestComposerCallback() {}
34aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ~TestComposerCallback() override = default;
35aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
36aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame last_frame() const { return last_frame_; }
37aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
38aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  binder::Status onNewFrame(
39aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara      const ParcelableComposerFrame& frame,
40aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara      ParcelableUniqueFd* /* fence */) override {
41aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    last_frame_ = frame.frame();
42aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return binder::Status::ok();
43aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
44aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
45aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara private:
46aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame last_frame_;
47aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
48aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  TestComposerCallback(const TestComposerCallback&) = delete;
49aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  void operator=(const TestComposerCallback&) = delete;
50aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara};
51aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
52aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaraclass TestComposerCallbackWithFence : public TestComposerCallback {
53aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara public:
54aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ~TestComposerCallbackWithFence() override = default;
55aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
56aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  binder::Status onNewFrame(
57aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara      const ParcelableComposerFrame& frame,
58aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara      ParcelableUniqueFd* fence) override {
59aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    binder::Status status = TestComposerCallback::onNewFrame(frame, fence);
60aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
61aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    base::unique_fd fd(eventfd(0, 0));
62aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    EXPECT_LE(0, fd.get());
63aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    fence->set_fence(fd);
64aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
65aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return status;
66aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
67aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara};
68aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
69aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoarasp<GraphicBuffer> CreateBuffer() {
70aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  return new GraphicBuffer(600, 400, PIXEL_FORMAT_RGBA_8888,
71aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara                           GraphicBuffer::USAGE_HW_TEXTURE);
72aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
73aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
74aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace
75aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
76aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaraclass VrComposerTest : public testing::Test {
77aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara public:
788fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  VrComposerTest() : composer_(new VrComposer(&composer_view_)) {}
79aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ~VrComposerTest() override = default;
80aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
81aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<IVrComposer> GetComposerProxy() const {
82aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    sp<IServiceManager> sm(defaultServiceManager());
83aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return interface_cast<IVrComposer>(sm->getService(String16(kVrDisplayName)));
84aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
85aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
86aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  void SetUp() override {
87aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    sp<IServiceManager> sm(defaultServiceManager());
88aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    EXPECT_EQ(OK,
89aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara              sm->addService(String16(kVrDisplayName), composer_, false));
90aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
91aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
92aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara protected:
938fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  TestComposerView composer_view_;
94aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<VrComposer> composer_;
95aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
96aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  VrComposerTest(const VrComposerTest&) = delete;
97aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  void operator=(const VrComposerTest&) = delete;
98aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara};
99aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
100aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraTEST_F(VrComposerTest, TestWithoutObserver) {
101aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<IVrComposer> composer = GetComposerProxy();
102aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame frame;
103aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
104aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  base::unique_fd fence = composer_->OnNewFrame(frame);
105aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(-1, fence.get());
106aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
107aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
108aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraTEST_F(VrComposerTest, TestWithObserver) {
109aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<IVrComposer> composer = GetComposerProxy();
110aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<TestComposerCallback> callback = new TestComposerCallback();
1118fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  ASSERT_EQ(0, composer_view_.display_refresh_count());
112aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_TRUE(composer->registerObserver(callback).isOk());
1138fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  ASSERT_EQ(1, composer_view_.display_refresh_count());
114aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
115aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame frame;
116aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  base::unique_fd fence = composer_->OnNewFrame(frame);
117aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(-1, fence.get());
118aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
119aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
120aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraTEST_F(VrComposerTest, TestWithOneLayer) {
121aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<IVrComposer> composer = GetComposerProxy();
122aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  sp<TestComposerCallback> callback = new TestComposerCallbackWithFence();
123aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_TRUE(composer->registerObserver(callback).isOk());
124aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
125aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame frame;
126aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  frame.display_id = 1;
127aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  frame.removed = false;
12804c73d23d5e366c9f0337cdaa71bd2d15ebf1f4eDaniel Nicoara  frame.display_width = 600;
12904c73d23d5e366c9f0337cdaa71bd2d15ebf1f4eDaniel Nicoara  frame.display_height = 400;
130aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  frame.layers.push_back(ComposerView::ComposerLayer{
131aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .id = 1,
132aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .buffer = CreateBuffer(),
133aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .fence = new Fence(eventfd(0, 0)),
134aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .display_frame = {0, 0, 600, 400},
135aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .crop = {0.0f, 0.0f, 600.0f, 400.0f},
136aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .blend_mode = IComposerClient::BlendMode::NONE,
137aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .alpha = 1.0f,
138aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .type = 1,
139aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    .app_id = 1,
140aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  });
141aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  base::unique_fd fence = composer_->OnNewFrame(frame);
142aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_LE(0, fence.get());
143aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
144aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ComposerView::Frame received_frame = callback->last_frame();
145aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.display_id, received_frame.display_id);
14604c73d23d5e366c9f0337cdaa71bd2d15ebf1f4eDaniel Nicoara  ASSERT_EQ(frame.display_width, received_frame.display_width);
14704c73d23d5e366c9f0337cdaa71bd2d15ebf1f4eDaniel Nicoara  ASSERT_EQ(frame.display_height, received_frame.display_height);
148aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.removed, received_frame.removed);
149aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(1u, received_frame.layers.size());
150aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].id, received_frame.layers[0].id);
151aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_NE(nullptr, received_frame.layers[0].buffer.get());
152aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_TRUE(received_frame.layers[0].fence->isValid());
153aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].display_frame.left,
154aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara            received_frame.layers[0].display_frame.left);
155aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].display_frame.top,
156aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara            received_frame.layers[0].display_frame.top);
157aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].display_frame.right,
158aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara            received_frame.layers[0].display_frame.right);
159aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].display_frame.bottom,
160aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara            received_frame.layers[0].display_frame.bottom);
161aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].crop.left, received_frame.layers[0].crop.left);
162aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].crop.top, received_frame.layers[0].crop.top);
163aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].crop.right, received_frame.layers[0].crop.right);
164aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].crop.bottom, received_frame.layers[0].crop.bottom);
165aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].blend_mode, received_frame.layers[0].blend_mode);
166aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].alpha, received_frame.layers[0].alpha);
167aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].type, received_frame.layers[0].type);
168aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ASSERT_EQ(frame.layers[0].app_id, received_frame.layers[0].app_id);
169aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
170aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
171aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace dvr
172aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace android
173