VR: Update VR HWC and VR WM to use GrallocMapper

Removes the gralloc hacks to access buffer internals and re-enables
building of VR Window Manager.

Bug: b/34878847
Test: Compiled
Change-Id: I06aa5ec0428b2f282a36ee89dbc4da9838c25782
diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h
index 54f4cd3..95ca0f3 100644
--- a/include/ui/GraphicBuffer.h
+++ b/include/ui/GraphicBuffer.h
@@ -91,6 +91,12 @@
             uint32_t inLayerCount, uint32_t inUsage, uint32_t inStride,
             native_handle_t* inHandle, bool keepOwnership);
 
+    // create a buffer from an existing handle using gralloc1
+    GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
+            uint32_t inLayerCount, uint32_t inProducerUsage,
+            uint32_t inConsumerUsage, uint32_t inStride,
+            native_handle_t* inHandle, bool keepOwnership);
+
     // create a buffer from an existing ANativeWindowBuffer
     GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership);
 
diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp
index d29bae1..5ef95ec 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -104,6 +104,24 @@
     handle = inHandle;
 }
 
+GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
+        PixelFormat inFormat, uint32_t inLayerCount, uint32_t inProducerUsage,
+        uint32_t inConsumerUsage, uint32_t inStride,
+        native_handle_t* inHandle, bool keepOwnership)
+    : BASE(), mOwner(keepOwnership ? ownHandle : ownNone),
+      mBufferMapper(GraphicBufferMapper::get()),
+      mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0)
+{
+    width  = static_cast<int>(inWidth);
+    height = static_cast<int>(inHeight);
+    stride = static_cast<int>(inStride);
+    format = inFormat;
+    layerCount = inLayerCount;
+    usage  = static_cast<int>(inConsumerUsage | inProducerUsage);
+    handle = inHandle;
+}
+
+
 GraphicBuffer::GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership)
     : BASE(), mOwner(keepOwnership ? ownHandle : ownNone),
       mBufferMapper(GraphicBufferMapper::get()),
diff --git a/services/vr/vr_window_manager/Android.mk_disable b/services/vr/vr_window_manager/Android.mk
similarity index 96%
rename from services/vr/vr_window_manager/Android.mk_disable
rename to services/vr/vr_window_manager/Android.mk
index cc1db7b..47d9dcc 100644
--- a/services/vr/vr_window_manager/Android.mk_disable
+++ b/services/vr/vr_window_manager/Android.mk
@@ -100,7 +100,6 @@
 
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(src)
-LOCAL_C_INCLUDES := hardware/qcom/display/msm8996/libgralloc
 LOCAL_STATIC_LIBRARIES := $(static_libs)
 LOCAL_SHARED_LIBRARIES := $(shared_libs)
 LOCAL_SHARED_LIBRARIES += libgvr
@@ -117,7 +116,6 @@
 
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(native_src)
-LOCAL_C_INCLUDES := hardware/qcom/display/msm8996/libgralloc
 LOCAL_STATIC_LIBRARIES := $(static_libs) libvrwm_binder
 LOCAL_SHARED_LIBRARIES := $(shared_libs)
 LOCAL_SHARED_LIBRARIES += libgvr
diff --git a/services/vr/vr_window_manager/composer/Android.bp b/services/vr/vr_window_manager/composer/Android.bp
index 207d456..08c105c 100644
--- a/services/vr/vr_window_manager/composer/Android.bp
+++ b/services/vr/vr_window_manager/composer/Android.bp
@@ -2,46 +2,43 @@
   "1.0",
 ]
 
-//cc_library_shared {
-//  name: "libvrhwc",
-//
-//  srcs: [
-//    "impl/sync_timeline.cpp",
-//    "impl/vr_composer_view.cpp",
-//    "impl/vr_hwc.cpp",
-//    "impl/vr_composer_client.cpp",
-//  ],
-//
-//  static_libs: [
-//    "libhwcomposer-client",
-//  ],
-//
-//  shared_libs: [
-//    "android.dvr.composer@1.0",
-//    "android.hardware.graphics.composer@2.1",
-//    "libbase",
-//    "libcutils",
-//    "libfmq",
-//    "libhardware",
-//    "libhidlbase",
-//    "libhidltransport",
-//    "liblog",
-//    "libsync",
-//    "libui",
-//    "libutils",
-//  ],
-//
-//  export_include_dirs: ["."],
-//
-//  include_dirs: [
-//    // Access to software sync timeline.
-//    "system/core/libsync",
-//
-//    // Access to internal gralloc implementation.
-//    "hardware/qcom/display/msm8996/libgralloc",
-//  ],
-//
-//  cflags: [
-//    "-DLOG_TAG=\"vrhwc\"",
-//  ],
-//}
+cc_library_shared {
+  name: "libvrhwc",
+
+  srcs: [
+    "impl/sync_timeline.cpp",
+    "impl/vr_composer_view.cpp",
+    "impl/vr_hwc.cpp",
+    "impl/vr_composer_client.cpp",
+  ],
+
+  static_libs: [
+    "libhwcomposer-client",
+  ],
+
+  shared_libs: [
+    "android.dvr.composer@1.0",
+    "android.hardware.graphics.composer@2.1",
+    "libbase",
+    "libcutils",
+    "libfmq",
+    "libhardware",
+    "libhidlbase",
+    "libhidltransport",
+    "liblog",
+    "libsync",
+    "libui",
+    "libutils",
+  ],
+
+  export_include_dirs: ["."],
+
+  include_dirs: [
+    // Access to software sync timeline.
+    "system/core/libsync",
+  ],
+
+  cflags: [
+    "-DLOG_TAG=\"vrhwc\"",
+  ],
+}
diff --git a/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp b/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
index 7e406a5..d7d0e5b 100644
--- a/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
+++ b/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
@@ -15,7 +15,6 @@
  */
 #include "vr_hwc.h"
 
-#include <gralloc_priv.h>
 #include <ui/Fence.h>
 #include <ui/GraphicBuffer.h>
 #include <ui/GraphicBufferMapper.h>
@@ -44,13 +43,28 @@
 const Config kDefaultConfigId = 1;
 
 sp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
-  // TODO(dnicoara): Fix this once gralloc1 is available.
-  private_handle_t* private_handle = private_handle_t::dynamicCast(handle);
+  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
+  uint64_t producer_usage = 0, consumer_usage = 0;
+  int32_t format = 0;
+
+  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
+  if (mapper.getDimensions(handle, &width, &height) ||
+      mapper.getStride(handle, &stride) ||
+      mapper.getFormat(handle, &format) ||
+      mapper.getProducerUsage(handle, &producer_usage) ||
+      mapper.getConsumerUsage(handle, &consumer_usage)) {
+    ALOGE("Failed to read handle properties");
+    return nullptr;
+  }
+
+  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
+  // capability. Otherwise assume a count of 1.
+  mapper.getLayerCount(handle, &layer_count);
+
   sp<GraphicBuffer> buffer = new GraphicBuffer(
-      private_handle->width, private_handle->height, private_handle->format, 1,
-      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE,
-      private_handle->width, native_handle_clone(handle), true);
-  if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) {
+      width, height, format, layer_count, producer_usage, consumer_usage,
+      stride, native_handle_clone(handle), true);
+  if (mapper.registerBuffer(buffer.get()) != OK) {
     ALOGE("Failed to register buffer");
     return nullptr;
   }
diff --git a/services/vr/vr_window_manager/composer/impl/vr_hwc.h b/services/vr/vr_window_manager/composer/impl/vr_hwc.h
index 6b9487b..9450097 100644
--- a/services/vr/vr_window_manager/composer/impl/vr_hwc.h
+++ b/services/vr/vr_window_manager/composer/impl/vr_hwc.h
@@ -18,7 +18,8 @@
 
 #include <android/hardware/graphics/composer/2.1/IComposer.h>
 #include <ComposerBase.h>
-#include <ui/GraphicBufferMapper.h>
+#include <ui/Fence.h>
+#include <ui/GraphicBuffer.h>
 #include <utils/StrongPointer.h>
 
 #include <mutex>
diff --git a/services/vr/vr_window_manager/hwc_callback.cpp b/services/vr/vr_window_manager/hwc_callback.cpp
index 5045790..12a76d8 100644
--- a/services/vr/vr_window_manager/hwc_callback.cpp
+++ b/services/vr/vr_window_manager/hwc_callback.cpp
@@ -1,10 +1,10 @@
 #include "hwc_callback.h"
 
-#include <gralloc_priv.h>
 #include <android-base/unique_fd.h>
 #include <log/log.h>
 #include <private/dvr/native_buffer.h>
 #include <sync/sync.h>
+#include <ui/GraphicBufferMapper.h>
 
 namespace android {
 namespace dvr {
@@ -12,14 +12,28 @@
 namespace {
 
 sp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
-  // TODO(dnicoara): Fix this once gralloc1 is available.
-  private_handle_t* private_handle = private_handle_t::dynamicCast(handle);
+  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
+  uint64_t producer_usage = 0, consumer_usage = 0;
+  int32_t format = 0;
+
+  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
+  if (mapper.getDimensions(handle, &width, &height) ||
+      mapper.getStride(handle, &stride) ||
+      mapper.getFormat(handle, &format) ||
+      mapper.getProducerUsage(handle, &producer_usage) ||
+      mapper.getConsumerUsage(handle, &consumer_usage)) {
+    ALOGE("Failed to read handle properties");
+    return nullptr;
+  }
+
+  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
+  // capability. Otherwise assume a count of 1.
+  mapper.getLayerCount(handle, &layer_count);
+
   sp<GraphicBuffer> buffer = new GraphicBuffer(
-      private_handle->width, private_handle->height, private_handle->format, 1,
-      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE |
-      GraphicBuffer::USAGE_HW_2D | GraphicBuffer::USAGE_HW_RENDER,
-      private_handle->width, native_handle_clone(handle), true);
-  if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) {
+      width, height, format, layer_count, producer_usage, consumer_usage,
+      stride, native_handle_clone(handle), true);
+  if (mapper.registerBuffer(buffer.get()) != OK) {
     ALOGE("Failed to register buffer");
     return nullptr;
   }