graphics: support FB HAL using HWC2OnFbAdapter am: 16e8ed254d
am: 20b073fe6c
Change-Id: I3e50c5f00b8385a33ff1d04622102ca041cc408d
diff --git a/graphics/composer/2.1/default/Android.bp b/graphics/composer/2.1/default/Android.bp
index 037f810..140e50e 100644
--- a/graphics/composer/2.1/default/Android.bp
+++ b/graphics/composer/2.1/default/Android.bp
@@ -38,7 +38,8 @@
"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 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;
}
diff --git a/graphics/composer/2.1/default/Hwc.h b/graphics/composer/2.1/default/Hwc.h
index cf6a72a..32c6b0b 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 @@
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<typename T>
@@ -221,6 +225,10 @@
// If the HWC implementation version is < 2.0, use an adapter to interface
// between HWC 2.0 <-> HWC 1.X.
std::unique_ptr<HWC2On1Adapter> mAdapter;
+
+ // If there is no HWC implementation, use an adapter to interface between
+ // HWC 2.0 <-> FB HAL.
+ std::unique_ptr<HWC2OnFbAdapter> mFbAdapter;
};
extern "C" IComposer* HIDL_FETCH_IComposer(const char* name);