From 16e8ed254d11c3a4dd5360e0bebb5b376a3809f8 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 19 Oct 2017 09:49:03 -0700 Subject: [PATCH] graphics: support FB HAL using HWC2OnFbAdapter FB (framebuffer) HAL has been replaced by HWC HAL for 5+ years, but we still support the legacy path in SurfaceFlinger. Devices using the legacy path cannot be Treblized. This change allows such devices to use HIDL IComposer, by adding support for FB HAL in the default implementation. Test: boots hikey960 Change-Id: Ie9050bbcaac0fd5b134786f4f9f0f5075f4ebd0c --- graphics/composer/2.1/default/Android.bp | 3 +- graphics/composer/2.1/default/Hwc.cpp | 53 +++++++++++++++++++----- graphics/composer/2.1/default/Hwc.h | 8 ++++ 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/graphics/composer/2.1/default/Android.bp b/graphics/composer/2.1/default/Android.bp index 037f81089e..140e50ece7 100644 --- a/graphics/composer/2.1/default/Android.bp +++ b/graphics/composer/2.1/default/Android.bp @@ -38,7 +38,8 @@ cc_library_shared { "liblog", "libsync", "libutils", - "libhwc2on1adapter" + "libhwc2on1adapter", + "libhwc2onfbadapter", ], } diff --git a/graphics/composer/2.1/default/Hwc.cpp b/graphics/composer/2.1/default/Hwc.cpp index 1618dccb69..fdb4af88c2 100644 --- a/graphics/composer/2.1/default/Hwc.cpp +++ b/graphics/composer/2.1/default/Hwc.cpp @@ -23,8 +23,10 @@ #include #include "ComposerClient.h" +#include "hardware/fb.h" #include "hardware/hwcomposer.h" #include "hwc2on1adapter/HWC2On1Adapter.h" +#include "hwc2onfbadapter/HWC2OnFbAdapter.h" using namespace std::chrono_literals; @@ -37,6 +39,30 @@ namespace implementation { HwcHal::HwcHal(const hw_module_t* module) : mDevice(nullptr), mDispatch(), mMustValidateDisplay(true), mAdapter() { + uint32_t majorVersion; + if (module->id && strcmp(module->id, GRALLOC_HARDWARE_MODULE_ID) == 0) { + majorVersion = initWithFb(module); + } else { + majorVersion = initWithHwc(module); + } + + initCapabilities(); + if (majorVersion >= 2 && + hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) { + ALOGE("Present fence must be reliable from HWC2 on."); + abort(); + } + + initDispatch(); +} + +HwcHal::~HwcHal() +{ + hwc2_close(mDevice); +} + +uint32_t HwcHal::initWithHwc(const hw_module_t* module) +{ // Determine what kind of module is available (HWC2 vs HWC1.X). hw_device_t* device = nullptr; int error = module->methods->open(module, HWC_HARDWARE_COMPOSER, &device); @@ -65,19 +91,22 @@ HwcHal::HwcHal(const hw_module_t* module) mDevice = reinterpret_cast(device); } - initCapabilities(); - if (majorVersion >= 2 && - hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) { - ALOGE("Present fence must be reliable from HWC2 on."); + return majorVersion; +} + +uint32_t HwcHal::initWithFb(const hw_module_t* module) +{ + framebuffer_device_t* fb_device; + int error = framebuffer_open(module, &fb_device); + if (error != 0) { + ALOGE("Failed to open FB device (%s), aborting", strerror(-error)); abort(); } - initDispatch(); -} + mFbAdapter = std::make_unique(fb_device); + mDevice = mFbAdapter.get(); -HwcHal::~HwcHal() -{ - hwc2_close(mDevice); + return 0; } void HwcHal::initCapabilities() @@ -757,7 +786,11 @@ IComposer* HIDL_FETCH_IComposer(const char*) const hw_module_t* module = nullptr; int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module); if (err) { - ALOGE("failed to get hwcomposer module"); + ALOGI("falling back to FB HAL"); + err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); + } + if (err) { + ALOGE("failed to get hwcomposer or fb module"); return nullptr; } diff --git a/graphics/composer/2.1/default/Hwc.h b/graphics/composer/2.1/default/Hwc.h index cf6a72a197..32c6b0b19b 100644 --- a/graphics/composer/2.1/default/Hwc.h +++ b/graphics/composer/2.1/default/Hwc.h @@ -34,6 +34,7 @@ namespace android { class HWC2On1Adapter; + class HWC2OnFbAdapter; } namespace android { @@ -147,6 +148,9 @@ public: Error setLayerZOrder(Display display, Layer layer, uint32_t z) override; private: + uint32_t initWithHwc(const hw_module_t* module); + uint32_t initWithFb(const hw_module_t* module); + void initCapabilities(); template @@ -221,6 +225,10 @@ private: // If the HWC implementation version is < 2.0, use an adapter to interface // between HWC 2.0 <-> HWC 1.X. std::unique_ptr mAdapter; + + // If there is no HWC implementation, use an adapter to interface between + // HWC 2.0 <-> FB HAL. + std::unique_ptr mFbAdapter; }; extern "C" IComposer* HIDL_FETCH_IComposer(const char* name);