diff options
Diffstat (limited to 'hwc2_device/HwcDisplay.cpp')
-rw-r--r-- | hwc2_device/HwcDisplay.cpp | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index 9055a9a..8936136 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp @@ -98,6 +98,11 @@ HwcDisplay::HwcDisplay(ResourceManager *resource_manager, DrmDevice *drm, } void HwcDisplay::ClearDisplay() { + if (IsInHeadlessMode()) { + ALOGE("%s: Headless mode, should never reach here: ", __func__); + return; + } + AtomicCommitArgs a_args = {.clear_active_composition = true}; compositor_.ExecuteAtomicCommit(a_args); } @@ -136,7 +141,7 @@ HWC2::Error HwcDisplay::Init(std::vector<DrmPlane *> *planes) { } ret = vsync_worker_.Init(drm_, display, [this](int64_t timestamp) { - const std::lock_guard<std::mutex> lock(hwc2_->callback_lock_); + const std::lock_guard<std::mutex> lock(hwc2_->GetResMan().GetMainLock()); /* vsync callback */ #if PLATFORM_SDK_VERSION > 29 if (hwc2_->vsync_2_4_callback_.first != nullptr && @@ -160,7 +165,8 @@ HWC2::Error HwcDisplay::Init(std::vector<DrmPlane *> *planes) { ret = flattening_vsync_worker_ .Init(drm_, display, [this](int64_t /*timestamp*/) { - const std::lock_guard<std::mutex> lock(hwc2_->callback_lock_); + const std::lock_guard<std::mutex> lock( + hwc2_->GetResMan().GetMainLock()); /* Frontend flattening */ if (flattenning_state_ > ClientFlattenningState::ClientRefreshRequested && @@ -191,7 +197,7 @@ HWC2::Error HwcDisplay::Init(std::vector<DrmPlane *> *planes) { HWC2::Error HwcDisplay::ChosePreferredConfig() { HWC2::Error err = configs_.Update(*connector_); - if (err != HWC2::Error::None) + if (!IsInHeadlessMode() && err != HWC2::Error::None) return HWC2::Error::BadDisplay; return SetActiveConfig(configs_.preferred_config_id); @@ -229,6 +235,11 @@ HWC2::Error HwcDisplay::GetActiveConfig(hwc2_config_t *config) const { HWC2::Error HwcDisplay::GetChangedCompositionTypes(uint32_t *num_elements, hwc2_layer_t *layers, int32_t *types) { + if (IsInHeadlessMode()) { + *num_elements = 0; + return HWC2::Error::None; + } + uint32_t num_changes = 0; for (std::pair<const hwc2_layer_t, HwcLayer> &l : layers_) { if (l.second.IsTypeChanged()) { @@ -249,6 +260,9 @@ HWC2::Error HwcDisplay::GetClientTargetSupport(uint32_t width, uint32_t height, int32_t dataspace) { std::pair<uint32_t, uint32_t> min = drm_->min_resolution(); std::pair<uint32_t, uint32_t> max = drm_->max_resolution(); + if (IsInHeadlessMode()) { + return HWC2::Error::None; + } if (width < min.first || height < min.second) return HWC2::Error::Unsupported; @@ -286,8 +300,8 @@ HWC2::Error HwcDisplay::GetDisplayAttribute(hwc2_config_t config, auto &hwc_config = configs_.hwc_configs[conf]; static const int32_t kUmPerInch = 25400; - uint32_t mm_width = connector_->mm_width(); - uint32_t mm_height = connector_->mm_height(); + uint32_t mm_width = configs_.mm_width; + uint32_t mm_height = configs_.mm_height; auto attribute = static_cast<HWC2::Attribute>(attribute_in); switch (attribute) { case HWC2::Attribute::Width: @@ -328,15 +342,6 @@ HWC2::Error HwcDisplay::GetDisplayAttribute(hwc2_config_t config, HWC2::Error HwcDisplay::GetDisplayConfigs(uint32_t *num_configs, hwc2_config_t *configs) { - // Since this callback is normally invoked twice (once to get the count, and - // once to populate configs), we don't really want to read the edid - // redundantly. Instead, only update the modes on the first invocation. While - // it's possible this will result in stale modes, it'll all come out in the - // wash when we try to set the active config later. - if (!configs) { - configs_.Update(*connector_); - } - uint32_t idx = 0; for (auto &hwc_config : configs_.hwc_configs) { if (hwc_config.second.disabled) { @@ -406,6 +411,11 @@ HWC2::Error HwcDisplay::GetHdrCapabilities(uint32_t *num_types, HWC2::Error HwcDisplay::GetReleaseFences(uint32_t *num_elements, hwc2_layer_t *layers, int32_t *fences) { + if (IsInHeadlessMode()) { + *num_elements = 0; + return HWC2::Error::None; + } + uint32_t num_layers = 0; for (std::pair<const hwc2_layer_t, HwcLayer> &l : layers_) { @@ -426,6 +436,11 @@ HWC2::Error HwcDisplay::GetReleaseFences(uint32_t *num_elements, } HWC2::Error HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { + if (IsInHeadlessMode()) { + ALOGE("%s: Display is in headless mode, should never reach here", __func__); + return HWC2::Error::None; + } + // order the layers by z-order bool use_client_layer = false; uint32_t client_z_order = UINT32_MAX; @@ -505,7 +520,11 @@ HWC2::Error HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { * https://cs.android.com/android/platform/superproject/+/android-11.0.0_r3:hardware/libhardware/include/hardware/hwcomposer2.h;l=1805 */ HWC2::Error HwcDisplay::PresentDisplay(int32_t *present_fence) { - HWC2::Error ret; + if (IsInHeadlessMode()) { + *present_fence = -1; + return HWC2::Error::None; + } + HWC2::Error ret{}; ++total_stats_.total_frames_; @@ -619,6 +638,10 @@ HWC2::Error HwcDisplay::SetOutputBuffer(buffer_handle_t /*buffer*/, } HWC2::Error HwcDisplay::SetPowerMode(int32_t mode_in) { + if (IsInHeadlessMode()) { + return HWC2::Error::None; + } + auto mode = static_cast<HWC2::PowerMode>(mode_in); AtomicCommitArgs a_args{}; @@ -660,6 +683,10 @@ HWC2::Error HwcDisplay::SetVsyncEnabled(int32_t enabled) { HWC2::Error HwcDisplay::ValidateDisplay(uint32_t *num_types, uint32_t *num_requests) { + if (IsInHeadlessMode()) { + *num_types = *num_requests = 0; + return HWC2::Error::None; + } return backend_->ValidateDisplay(this, num_types, num_requests); } |