Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8fc9822f authored by Daniel Nicoara's avatar Daniel Nicoara
Browse files

Signal display refresh when a VR_HWC client is registered

In steady state, SurfaceFlinger will not update the surfaces. If the
observer is registered after steady state, the client will not receive
any updates. This forces SurfaceFlinger to update the display surfaces

Bug: 64207223
Test: Updated unittest
Change-Id: Ied7ffcaaacec25d36dafb948489538155a0c865f
parent 27a7c02f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -161,6 +161,10 @@ void VrComposerClient::onHotplug(Display display,
  client_->onHotplug(display, connected);
}

void VrComposerClient::onRefresh(Display display) {
  client_->onRefresh(display);
}

Return<void> VrComposerClient::registerCallback(
    const sp<IComposerCallback>& callback) {
  return client_->registerCallback(callback);
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ class VrComposerClient : public IVrComposerClient {
  virtual ~VrComposerClient();

  void onHotplug(Display display, IComposerCallback::Connection connected);
  void onRefresh(Display display);

  // IComposerClient
  Return<void> registerCallback(const sp<IComposerCallback>& callback) override;
+8 −0
Original line number Diff line number Diff line
@@ -851,6 +851,14 @@ Return<void> VrHwc::createClient(createClient_cb hidl_cb) {
  return Void();
}

void VrHwc::ForceDisplaysRefresh() {
  std::lock_guard<std::mutex> guard(mutex_);
  if (client_ != nullptr) {
    for (const auto& pair : displays_)
      client_.promote()->onRefresh(pair.first);
  }
}

void VrHwc::RegisterObserver(Observer* observer) {
  std::lock_guard<std::mutex> guard(mutex_);
  if (observer_)
+2 −1
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ class ComposerView {

  virtual ~ComposerView() {}

  virtual void ForceDisplaysRefresh() = 0;
  virtual void RegisterObserver(Observer* observer) = 0;
  virtual void UnregisterObserver(Observer* observer) = 0;
};
@@ -288,6 +289,7 @@ class VrHwc : public IComposer, public ComposerBase, public ComposerView {
  Return<void> createClient(createClient_cb hidl_cb) override;

  // ComposerView:
  void ForceDisplaysRefresh() override;
  void RegisterObserver(Observer* observer) override;
  void UnregisterObserver(Observer* observer) override;

@@ -295,7 +297,6 @@ class VrHwc : public IComposer, public ComposerBase, public ComposerView {
  HwcDisplay* FindDisplay(Display display);

  wp<VrComposerClient> client_;
  sp<IComposerCallback> callbacks_;

  // Guard access to internal state from binder threads.
  std::mutex mutex_;
+22 −1
Original line number Diff line number Diff line
@@ -10,6 +10,24 @@ namespace {

const char kVrDisplayName[] = "VrDisplay_Test";

class TestComposerView : public ComposerView {
 public:
  TestComposerView() {}
  ~TestComposerView() override = default;

  size_t display_refresh_count() const { return display_refresh_count_; }

  void ForceDisplaysRefresh() override { display_refresh_count_++; }
  void RegisterObserver(Observer* observer) override {}
  void UnregisterObserver(Observer* observer) override {}

  TestComposerView(const TestComposerView&) = delete;
  void operator=(const TestComposerView&) = delete;

 private:
  size_t display_refresh_count_ = 0;
};

class TestComposerCallback : public BnVrComposerCallback {
 public:
  TestComposerCallback() {}
@@ -57,7 +75,7 @@ sp<GraphicBuffer> CreateBuffer() {

class VrComposerTest : public testing::Test {
 public:
  VrComposerTest() : composer_(new VrComposer()) {}
  VrComposerTest() : composer_(new VrComposer(&composer_view_)) {}
  ~VrComposerTest() override = default;

  sp<IVrComposer> GetComposerProxy() const {
@@ -72,6 +90,7 @@ class VrComposerTest : public testing::Test {
  }

 protected:
  TestComposerView composer_view_;
  sp<VrComposer> composer_;

  VrComposerTest(const VrComposerTest&) = delete;
@@ -89,7 +108,9 @@ TEST_F(VrComposerTest, TestWithoutObserver) {
TEST_F(VrComposerTest, TestWithObserver) {
  sp<IVrComposer> composer = GetComposerProxy();
  sp<TestComposerCallback> callback = new TestComposerCallback();
  ASSERT_EQ(0, composer_view_.display_refresh_count());
  ASSERT_TRUE(composer->registerObserver(callback).isOk());
  ASSERT_EQ(1, composer_view_.display_refresh_count());

  ComposerView::Frame frame;
  base::unique_fd fence = composer_->OnNewFrame(frame);
Loading