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