graphics: support FB HAL using HWC2OnFbAdapter am: 16e8ed254d

am: 20b073fe6c

Change-Id: I3e50c5f00b8385a33ff1d04622102ca041cc408d
This commit is contained in:
Chia-I Wu
2017-11-07 18:19:19 +00:00
committed by android-build-merger
3 changed files with 53 additions and 11 deletions

View File

@@ -38,7 +38,8 @@ cc_library_shared {
"liblog", "liblog",
"libsync", "libsync",
"libutils", "libutils",
"libhwc2on1adapter" "libhwc2on1adapter",
"libhwc2onfbadapter",
], ],
} }

View File

@@ -23,8 +23,10 @@
#include <log/log.h> #include <log/log.h>
#include "ComposerClient.h" #include "ComposerClient.h"
#include "hardware/fb.h"
#include "hardware/hwcomposer.h" #include "hardware/hwcomposer.h"
#include "hwc2on1adapter/HWC2On1Adapter.h" #include "hwc2on1adapter/HWC2On1Adapter.h"
#include "hwc2onfbadapter/HWC2OnFbAdapter.h"
using namespace std::chrono_literals; using namespace std::chrono_literals;
@@ -37,6 +39,30 @@ namespace implementation {
HwcHal::HwcHal(const hw_module_t* module) HwcHal::HwcHal(const hw_module_t* module)
: mDevice(nullptr), mDispatch(), mMustValidateDisplay(true), mAdapter() { : 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). // Determine what kind of module is available (HWC2 vs HWC1.X).
hw_device_t* device = nullptr; hw_device_t* device = nullptr;
int error = module->methods->open(module, HWC_HARDWARE_COMPOSER, &device); int error = module->methods->open(module, HWC_HARDWARE_COMPOSER, &device);
@@ -65,19 +91,22 @@ HwcHal::HwcHal(const hw_module_t* module)
mDevice = reinterpret_cast<hwc2_device_t*>(device); mDevice = reinterpret_cast<hwc2_device_t*>(device);
} }
initCapabilities(); return majorVersion;
if (majorVersion >= 2 && }
hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
ALOGE("Present fence must be reliable from HWC2 on."); 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(); abort();
} }
initDispatch(); mFbAdapter = std::make_unique<HWC2OnFbAdapter>(fb_device);
} mDevice = mFbAdapter.get();
HwcHal::~HwcHal() return 0;
{
hwc2_close(mDevice);
} }
void HwcHal::initCapabilities() void HwcHal::initCapabilities()
@@ -757,7 +786,11 @@ IComposer* HIDL_FETCH_IComposer(const char*)
const hw_module_t* module = nullptr; const hw_module_t* module = nullptr;
int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module); int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module);
if (err) { 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; return nullptr;
} }

View File

@@ -34,6 +34,7 @@
namespace android { namespace android {
class HWC2On1Adapter; class HWC2On1Adapter;
class HWC2OnFbAdapter;
} }
namespace android { namespace android {
@@ -147,6 +148,9 @@ public:
Error setLayerZOrder(Display display, Layer layer, uint32_t z) override; Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
private: private:
uint32_t initWithHwc(const hw_module_t* module);
uint32_t initWithFb(const hw_module_t* module);
void initCapabilities(); void initCapabilities();
template<typename T> template<typename T>
@@ -221,6 +225,10 @@ private:
// If the HWC implementation version is < 2.0, use an adapter to interface // If the HWC implementation version is < 2.0, use an adapter to interface
// between HWC 2.0 <-> HWC 1.X. // between HWC 2.0 <-> HWC 1.X.
std::unique_ptr<HWC2On1Adapter> mAdapter; 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); extern "C" IComposer* HIDL_FETCH_IComposer(const char* name);