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

Commit 3db84126 authored by Daniel Nicoara's avatar Daniel Nicoara
Browse files

VR: Update VR Window Manager to use the VR Hardware Composer service

Decouples VR HWC from VR Window Manager.

Bug: 36051907
Test: Compiled and ran on device in VR mode.
Change-Id: Ifd76e742148765b3cf3e71b0cf538b920814eb7b
parent 0860434b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -3,4 +3,3 @@ service vr_hwc /system/bin/vr_hwc
  user system
  group system graphics
  onrestart restart surfaceflinger
  disabled
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ static_libs = [
    "libperformance",
    "libpdx_default_transport",
    "libcutils",
    "libvr_hwc-binder",
    "libvr_manager",
    "libvirtualtouchpadclient",
]
+19 −16
Original line number Diff line number Diff line
@@ -38,26 +38,29 @@ HwcCallback::HwcCallback(Client* client) : client_(client) {
HwcCallback::~HwcCallback() {
}

base::unique_fd HwcCallback::OnNewFrame(const ComposerView::Frame& display_frame) {
  auto& frame = display_frame.layers;
  std::vector<HwcLayer> hwc_frame(frame.size());

  for (size_t i = 0; i < frame.size(); ++i) {
binder::Status HwcCallback::onNewFrame(
    const ParcelableComposerFrame& parcelable_frame,
    ParcelableUniqueFd* fence) {
  ComposerView::Frame frame = parcelable_frame.frame();
  std::vector<HwcLayer> hwc_frame(frame.layers.size());
  for (size_t i = 0; i < frame.layers.size(); ++i) {
    const ComposerView::ComposerLayer& layer = frame.layers[i];
    hwc_frame[i] = HwcLayer{
      .fence = frame[i].fence,
      .buffer = frame[i].buffer,
      .crop = frame[i].crop,
      .display_frame = frame[i].display_frame,
      .blending = static_cast<int32_t>(frame[i].blend_mode),
      .appid = frame[i].app_id,
      .type = static_cast<HwcLayer::LayerType>(frame[i].type),
      .alpha = frame[i].alpha,
      .fence = layer.fence,
      .buffer = layer.buffer,
      .crop = layer.crop,
      .display_frame = layer.display_frame,
      .blending = static_cast<int32_t>(layer.blend_mode),
      .appid = layer.app_id,
      .type = static_cast<HwcLayer::LayerType>(layer.type),
      .alpha = layer.alpha,
    };
  }

  return client_->OnFrame(std::make_unique<Frame>(
      std::move(hwc_frame), display_frame.display_id, display_frame.removed,
      display_frame.display_width, display_frame.display_height));
  fence->set_fence(client_->OnFrame(std::make_unique<Frame>(
      std::move(hwc_frame), frame.display_id, frame.removed,
      frame.display_width, frame.display_height)));
  return binder::Status::ok();
}

HwcCallback::Frame::Frame(std::vector<HwcLayer>&& layers, uint32_t display_id,
+8 −5
Original line number Diff line number Diff line
#ifndef VR_WINDOW_MANAGER_HWC_CALLBACK_H_
#define VR_WINDOW_MANAGER_HWC_CALLBACK_H_

#include <android/dvr/BnVrComposerCallback.h>
#include <android-base/unique_fd.h>

#include <deque>
#include <functional>
#include <mutex>
#include <vector>

#include <android-base/unique_fd.h>
#include <impl/vr_composer_view.h>
#include <impl/vr_hwc.h>
#include "impl/vr_composer_view.h"
#include "impl/vr_hwc.h"

namespace android {

@@ -20,7 +22,7 @@ namespace dvr {
using Recti = ComposerView::ComposerLayer::Recti;
using Rectf = ComposerView::ComposerLayer::Rectf;

class HwcCallback : public VrComposerView::Callback {
class HwcCallback : public BnVrComposerCallback {
 public:
  struct HwcLayer {
    enum LayerType : uint32_t {
@@ -110,7 +112,8 @@ class HwcCallback : public VrComposerView::Callback {
  ~HwcCallback() override;

 private:
  base::unique_fd OnNewFrame(const ComposerView::Frame& frame) override;
  binder::Status onNewFrame(const ParcelableComposerFrame& frame,
                            ParcelableUniqueFd* fence) override;

  Client *client_;

+12 −12
Original line number Diff line number Diff line
#include "surface_flinger_view.h"

#include <android/dvr/IVrComposer.h>
#include <binder/IServiceManager.h>
#include <impl/vr_composer_view.h>
#include <private/dvr/native_buffer.h>

@@ -14,22 +16,20 @@ SurfaceFlingerView::SurfaceFlingerView() {}
SurfaceFlingerView::~SurfaceFlingerView() {}

bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
  const char vr_hwcomposer_name[] = "vr";
  vr_hwcomposer_ = HIDL_FETCH_IComposer(vr_hwcomposer_name);
  if (!vr_hwcomposer_.get()) {
    ALOGE("Failed to get vr_hwcomposer");
    return false;
  }
  sp<IServiceManager> sm(defaultServiceManager());
  vr_composer_ = interface_cast<IVrComposer>(
      sm->getService(IVrComposer::SERVICE_NAME()));

  if (vr_hwcomposer_->isRemote()) {
    ALOGE("vr_hwcomposer service is remote");
  String8 service_name(IVrComposer::SERVICE_NAME().string());
  if (!vr_composer_.get()) {
    ALOGE("Faild to connect to %s", service_name.c_str());
    return false;
  }

  const android::status_t vr_hwcomposer_status =
      vr_hwcomposer_->registerAsService(vr_hwcomposer_name);
  if (vr_hwcomposer_status != OK) {
    ALOGE("Failed to register vr_hwcomposer service");
  composer_callback_ = new HwcCallback(client);
  binder::Status status = vr_composer_->registerObserver(composer_callback_);
  if (!status.isOk()) {
    ALOGE("Failed to register observer with %s", service_name.c_str());
    return false;
  }

Loading