diff options
author | John Stultz <john.stultz@linaro.org> | 2018-08-21 11:21:56 -0700 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2018-08-31 09:10:36 -0700 |
commit | fb3599c39bad496a86a213badbab74e75e0378bc (patch) | |
tree | ddbdaa2289164e4394bd80b0a95a6e7d8dd788ab | |
parent | a451483cf1999af2ac76b0e9ab305da3d4392382 (diff) | |
download | drm_hwcomposer-fb3599c39bad496a86a213badbab74e75e0378bc.tar.gz |
drm_hwcomposer: Add support for P+ environments
Originally-by: Alistair Strachan <astrachan@google.com>
With Android P, the GraphicBufferMapper ImportBuffer interface
has changed, which breaks the current drm_hwcomposer master
branch:
https://android.googlesource.com/platform/frameworks/native/+/dbbe33b95336efa74e8bb4ebcf6cba50919aa247
Alistair has updated the AOSP/master branch of drm_hwcomposer to
make it build:
https://android.googlesource.com/platform/external/drm_hwcomposer/+/4f73630dcdab6604a3f4b3e7d59068633d923745%5E2..4f73630dcdab6604a3f4b3e7d59068633d923745/
But since we need to keep older users working, so I've forward
ported and conditionalized the code so both new and old users
can properly build.
Change-Id: I2089c1105a7074ff13b5ddfe2d2eb7129917794f
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
v2:
* Fix up LOCAL_CPPFLAGS typeo and unsued variable errors
both found thanks to Alexandru Gheorghe
v3:
* Reordered so this patch comes last
* Squish layer_count calculation patch into this one
-rw-r--r-- | Android.mk | 6 | ||||
-rw-r--r-- | drmhwcomposer.h | 3 | ||||
-rw-r--r-- | hwcutils.cpp | 34 |
3 files changed, 37 insertions, 6 deletions
@@ -14,6 +14,8 @@ ifeq ($(strip $(BOARD_USES_DRM_HWCOMPOSER)),true) +DRM_HWC_ANDROID_MAJOR_VERSION := $(word 1, $(subst ., , $(PLATFORM_VERSION))) + LOCAL_PATH := $(call my-dir) common_drm_hwcomposer_cflags := \ @@ -79,6 +81,10 @@ LOCAL_CPPFLAGS += \ -DHWC2_USE_CPP11 \ -DHWC2_INCLUDE_STRINGIFICATION +ifneq ($(filter 2 3 4 5 6 7 8, $(DRM_HWC_ANDROID_MAJOR_VERSION)),) +LOCAL_CPPFLAGS += -DHWC2_USE_OLD_GB_IMPORT +endif + ifeq ($(TARGET_PRODUCT),hikey960) LOCAL_CPPFLAGS += -DUSE_HISI_IMPORTER diff --git a/drmhwcomposer.h b/drmhwcomposer.h index 1d6da2f..2af7e6e 100644 --- a/drmhwcomposer.h +++ b/drmhwcomposer.h @@ -99,7 +99,8 @@ class DrmHwcNativeHandle { return *this; } - int CopyBufferHandle(buffer_handle_t handle); + int CopyBufferHandle(buffer_handle_t handle, int width, int height, + int layerCount, int format, int usage, int stride); void Clear(); diff --git a/hwcutils.cpp b/hwcutils.cpp index b778b93..87e3c42 100644 --- a/hwcutils.cpp +++ b/hwcutils.cpp @@ -23,6 +23,8 @@ #include <log/log.h> #include <ui/GraphicBufferMapper.h> +#define UNUSED(x) (void)(x) + namespace android { const hwc_drm_bo *DrmHwcBuffer::operator->() const { @@ -59,11 +61,25 @@ int DrmHwcBuffer::ImportBuffer(buffer_handle_t handle, Importer *importer) { return 0; } -int DrmHwcNativeHandle::CopyBufferHandle(buffer_handle_t handle) { +int DrmHwcNativeHandle::CopyBufferHandle(buffer_handle_t handle, int width, + int height, int layerCount, int format, + int usage, int stride) { native_handle_t *handle_copy; GraphicBufferMapper &gm(GraphicBufferMapper::get()); - int ret = gm.importBuffer(handle, - const_cast<buffer_handle_t *>(&handle_copy)); + int ret; + +#ifdef HWC2_USE_OLD_GB_IMPORT + UNUSED(width); + UNUSED(height); + UNUSED(layerCount); + UNUSED(format); + UNUSED(usage); + UNUSED(stride); + ret = gm.importBuffer(handle, const_cast<buffer_handle_t *>(&handle_copy)); +#else + ret = gm.importBuffer(handle, width, height, layerCount, format, usage, + stride, const_cast<buffer_handle_t *>(&handle_copy)); +#endif if (ret) { ALOGE("Failed to import buffer handle %d", ret); return ret; @@ -96,11 +112,19 @@ int DrmHwcLayer::ImportBuffer(Importer *importer) { if (ret) return ret; - ret = handle.CopyBufferHandle(sf_handle); + const hwc_drm_bo *bo = buffer.operator->(); + + unsigned int layer_count; + for (layer_count = 0; layer_count < HWC_DRM_BO_MAX_PLANES; ++layer_count) + if (bo->gem_handles[layer_count] == 0) + break; + + ret = handle.CopyBufferHandle(sf_handle, bo->width, bo->height, layer_count, + bo->hal_format, bo->usage, bo->pixel_stride); if (ret) return ret; - gralloc_buffer_usage = buffer.operator->()->usage; + gralloc_buffer_usage = bo->usage; return 0; } |