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;
}