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
diff --git a/graphics/composer/2.1/default/Hwc.cpp b/graphics/composer/2.1/default/Hwc.cpp
index 1618dcc..fdb4af8 100644
--- a/graphics/composer/2.1/default/Hwc.cpp
+++ b/graphics/composer/2.1/default/Hwc.cpp
@@ -23,8 +23,10 @@
#include <log/log.h>
#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 @@
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 @@
mDevice = reinterpret_cast<hwc2_device_t*>(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<HWC2OnFbAdapter>(fb_device);
+ mDevice = mFbAdapter.get();
-HwcHal::~HwcHal()
-{
- hwc2_close(mDevice);
+ return 0;
}
void HwcHal::initCapabilities()
@@ -757,7 +786,11 @@
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;
}