/* * Copyright (c) Hisilicon Technologies Co., Ltd.. 2016-2019. All rights reserved. * Description: Initialize hardware devices and implement some interfaces of hal * Author: Hisilicon * Created: 2016.08.12 */ #ifndef HWC_DEVICE_H #define HWC_DEVICE_H #include #include #include "gralloc_priv.h" #include "HWCDisplay.h" #include "HWCCommon.h" namespace android { constexpr uint32_t MAX_VIRTUAL_DISP_COUNT = 0; // hwc not support virtual display compose constexpr uint32_t HWC_DUMP_SIZE = 8192; // The dump of hwc prints 8192 bytes at most class HWCDevice : hwc2_device_t { public: struct HWCModuleMethods : public hw_module_methods_t { HWCModuleMethods() { hw_module_methods_t::open = HWCDevice::Open; } }; explicit HWCDevice(const hw_module_t *module); // create default display, vsync ... ~HWCDevice(); int Init(); static int Open(const struct hw_module_t *module, const char *name, struct hw_device_t **device); static int Close(struct hw_device_t *dev); template static int32_t CallDisplayFunction(hwc2_device_t *device, hwc2_display_t display, HWC2::Error (HWCDisplay::*member)(Args...), Args... args) { HWC_CHK_RETURN((device == nullptr), HWC2_ERROR_BAD_PARAMETER, ALOGE("CallDisplayFunction device is nullprt")); HWC_CHK_RETURN((member == nullptr), HWC2_ERROR_BAD_PARAMETER, ALOGE("CallDisplayFunction member is nullptr")); HWCDevice *hwcDevice = static_cast(device); auto status = HWC2::Error::BadDisplay; if (hwcDevice->m_hwcDisplay[display] != nullptr) { auto hwcDisplay = hwcDevice->m_hwcDisplay[display]; status = (hwcDisplay->*member)(std::forward(args)...); } return int32_t(status); } template static int32_t CallLayerFunction(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer, HWC2::Error (HWCLayer::*member)(Args...), Args... args) { HWC_CHK_RETURN((device == nullptr), HWC2_ERROR_BAD_PARAMETER, ALOGE("CallLayerFunction device is nullprt")); HWC_CHK_RETURN((member == nullptr), HWC2_ERROR_BAD_PARAMETER, ALOGE("CallLayerFunction member is nullptr")); HWCDevice *hwcDevice = static_cast(device); auto status = HWC2::Error::BadDisplay; if (hwcDevice->m_hwcDisplay[display] != nullptr) { status = HWC2::Error::BadLayer; auto hwcLayer = hwcDevice->m_hwcDisplay[display]->GetHWCLayer(layer); if (hwcLayer != nullptr) { status = (hwcLayer->*member)(std::forward(args)...); } } return int32_t(status); } static int32_t CreateVirtualDisplay(hwc2_device_t *device, uint32_t width, uint32_t height, int32_t *format, hwc2_display_t *outDisplayDid); static int32_t DestroyVirtualDisplay(hwc2_device_t *device, hwc2_display_t display); static int32_t RegisterCallback(hwc2_device_t *device, int32_t descriptor, hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer); static void Dump(hwc2_device_t *device, uint32_t *outSize, char *outBuffer); HWC2::Error CreateVirtualDisplayObject(uint32_t width, uint32_t height, const int32_t *format); static void GetCapabilities(struct hwc2_device *device, uint32_t *outCount, int32_t *outCapabilities); static hwc2_function_pointer_t GetFunction(struct hwc2_device *device, int32_t intDescriptor); void SignalHotplug(hwc2_display_t display, HWC2::Connection state); void SignalRefresh(hwc2_display_t display); void SignalVsync(hwc2_display_t display, int64_t timestamp); HWC2::Error Register(HWC2::Callback desc, hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer); private: HWCCallbacks m_hwcCallbacks; HWCDisplay *m_hwcDisplay[HWC_NUM_DISPLAY_TYPES] = { nullptr }; framebuffer_device_t *m_fbDevices[HWC_NUM_PHYSICAL_DISPLAY_TYPES] = { nullptr }; #ifdef EXT_DOUBLE_DISPLAY_SUPPORT bool m_externalDisplayEnabled = false; #endif }; } // namespace android #endif // HWC_DEVICE_H