OSDN Git Service

VR: Move VR HWC initialization in SurfaceFlingerView
authorDaniel Nicoara <dnicoara@google.com>
Thu, 16 Feb 2017 15:59:37 +0000 (10:59 -0500)
committerDaniel Nicoara <dnicoara@google.com>
Thu, 16 Feb 2017 20:19:27 +0000 (15:19 -0500)
Initialize the VR HWC at first use since it is also needed to register
the frame observer VR WM uses to display SurfaceFlinger output.

Note, need the real implementation, rather than the passthrough
interface received via IComposer::getService().

Bug: b/35403318
Test: Compiled
Change-Id: I7569136edcef57f545e3d1c3daf644f48fd6b907

services/vr/vr_window_manager/surface_flinger_view.cpp
services/vr/vr_window_manager/surface_flinger_view.h
services/vr/vr_window_manager/vr_window_manager.cpp

index 7b17420..d42d3ff 100644 (file)
@@ -14,16 +14,29 @@ SurfaceFlingerView::SurfaceFlingerView() {}
 SurfaceFlingerView::~SurfaceFlingerView() {}
 
 bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
-  sp<IComposer> vr_hwcomposer = IComposer::getService("vr_hwcomposer");
-  if (!vr_hwcomposer.get()) {
-    ALOGE("vr_hwcomposer not registered as service");
+  const char vr_hwcomposer_name[] = "vr_hwcomposer";
+  vr_hwcomposer_ = HIDL_FETCH_IComposer(vr_hwcomposer_name);
+  if (!vr_hwcomposer_.get()) {
+    ALOGE("Failed to get vr_hwcomposer");
+    return false;
+  }
+
+  if (vr_hwcomposer_->isRemote()) {
+    ALOGE("vr_hwcomposer service is remote");
+    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");
     return false;
   }
 
   vr_composer_view_ =
       std::make_unique<VrComposerView>(std::make_unique<HwcCallback>(client));
   vr_composer_view_->Initialize(GetComposerViewFromIComposer(
-      vr_hwcomposer.get()));
+      vr_hwcomposer_.get()));
 
   // TODO(dnicoara): Query this from the composer service.
   width_ = 1920;
index 8d9b44e..9c16192 100644 (file)
@@ -39,6 +39,7 @@ class SurfaceFlingerView {
   void ReleaseFrame();
 
  private:
+  sp<IComposer> vr_hwcomposer_;
   std::unique_ptr<VrComposerView> vr_composer_view_;
   int width_ = 0;
   int height_ = 0;
index 5e9215c..6636dc5 100644 (file)
@@ -14,18 +14,6 @@ using namespace android::dvr;
 int main(int /* argc */, char** /* argv */) {
   android::ProcessState::self()->startThreadPool();
 
-  // Create vr_hwcomposer.
-  const char vr_hwcomposer_name[] = "vr_hwcomposer";
-  sp<IComposer> vr_hwcomposer = HIDL_FETCH_IComposer(vr_hwcomposer_name);
-  LOG_ALWAYS_FATAL_IF(!vr_hwcomposer.get(), "Failed to get vr_hwcomposer");
-  LOG_ALWAYS_FATAL_IF(vr_hwcomposer->isRemote(),
-                      "vr_hwcomposer service is remote");
-
-  const android::status_t vr_hwcomposer_status =
-      vr_hwcomposer->registerAsService(vr_hwcomposer_name);
-  LOG_ALWAYS_FATAL_IF(vr_hwcomposer_status != ::android::OK,
-                      "Failed to register vr_hwcomposer service");
-
   // ShellView needs to be created after vr_hwcomposer.
   android::dvr::ShellView app;
   const int app_status = app.Initialize();