mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 21:37:44 +00:00
graphics: support FB HAL using HWC2OnFbAdapter am: 16e8ed254d
am: 20b073fe6c
Change-Id: I3e50c5f00b8385a33ff1d04622102ca041cc408d
This commit is contained in:
@@ -38,7 +38,8 @@ cc_library_shared {
|
|||||||
"liblog",
|
"liblog",
|
||||||
"libsync",
|
"libsync",
|
||||||
"libutils",
|
"libutils",
|
||||||
"libhwc2on1adapter"
|
"libhwc2on1adapter",
|
||||||
|
"libhwc2onfbadapter",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user