summaryrefslogtreecommitdiff
path: root/composer/hwc_session_services.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'composer/hwc_session_services.cpp')
-rw-r--r--composer/hwc_session_services.cpp126
1 files changed, 96 insertions, 30 deletions
diff --git a/composer/hwc_session_services.cpp b/composer/hwc_session_services.cpp
index 0a7f8caf..354247de 100644
--- a/composer/hwc_session_services.cpp
+++ b/composer/hwc_session_services.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -29,6 +29,7 @@
#include <core/buffer_allocator.h>
#include <utils/debug.h>
+#include <utils/constants.h>
#include <sync/sync.h>
#include <vector>
#include <string>
@@ -425,8 +426,10 @@ int HWCSession::DisplayConfigImpl::ToggleScreenUpdate(bool on) {
int HWCSession::SetIdleTimeout(uint32_t value) {
SEQUENCE_WAIT_SCOPE_LOCK(locker_[HWC_DISPLAY_PRIMARY]);
+ int inactive_ms = IDLE_TIMEOUT_INACTIVE_MS;
+ Debug::Get()->GetProperty(IDLE_TIME_INACTIVE_PROP, &inactive_ms);
if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
- hwc_display_[HWC_DISPLAY_PRIMARY]->SetIdleTimeoutMs(value);
+ hwc_display_[HWC_DISPLAY_PRIMARY]->SetIdleTimeoutMs(value, inactive_ms);
return 0;
}
@@ -502,32 +505,9 @@ int HWCSession::SetCameraLaunchStatus(uint32_t on) {
return -EINVAL;
}
- hwc2_display_t active_builtin_disp_id = GetActiveBuiltinDisplay();
- if (active_builtin_disp_id < HWCCallbacks::kNumRealDisplays) {
- std::vector<DisplayMapInfo> map_info = {map_info_primary_};
- std::copy(map_info_builtin_.begin(), map_info_builtin_.end(), std::back_inserter(map_info));
+ // trigger invalidate to apply new bw caps.
+ callbacks_.Refresh(0);
- for (auto &info : map_info) {
- hwc2_display_t target_display = info.client_id;
- {
- SCOPE_LOCK(power_state_[target_display]);
- if (power_state_transition_[target_display]) {
- // Route all interactions with client to dummy display.
- target_display = map_hwc_display_.find(target_display)->second;
- }
- }
- {
- SEQUENCE_WAIT_SCOPE_LOCK(locker_[target_display]);
- auto &hwc_display = hwc_display_[target_display];
- if (hwc_display && hwc_display->GetCurrentPowerMode() != HWC2::PowerMode::Off) {
- hwc_display->ResetValidation();
- }
- }
- }
-
- // trigger invalidate to apply new bw caps.
- callbacks_.Refresh(active_builtin_disp_id);
- }
return 0;
}
@@ -535,6 +515,29 @@ int HWCSession::DisplayConfigImpl::SetCameraLaunchStatus(uint32_t on) {
return hwc_session_->SetCameraLaunchStatus(on);
}
+#ifdef DISPLAY_CONFIG_CAMERA_SMOOTH_APIs_1_0
+int HWCSession::DisplayConfigImpl::SetCameraSmoothInfo(CameraSmoothOp op, uint32_t fps) {
+ std::shared_ptr<DisplayConfig::ConfigCallback> callback = hwc_session_->camera_callback_.lock();
+ if (!callback) {
+ return -EAGAIN;
+ }
+
+ callback->NotifyCameraSmoothInfo(op, fps);
+
+ return 0;
+}
+
+int HWCSession::DisplayConfigImpl::ControlCameraSmoothCallback(bool enable) {
+ if (enable) {
+ hwc_session_->camera_callback_ = callback_;
+ } else {
+ hwc_session_->camera_callback_.reset();
+ }
+
+ return 0;
+}
+#endif
+
int HWCSession::DisplayBWTransactionPending(bool *status) {
SEQUENCE_WAIT_SCOPE_LOCK(locker_[HWC_DISPLAY_PRIMARY]);
@@ -718,12 +721,15 @@ int HWCSession::DisplayConfigImpl::SetPowerMode(uint32_t disp_id,
if (!supported) {
return 0;
}
-
+ // Added this flag for pixel
+ hwc_session_->async_power_mode_triggered_ = true;
// Active builtin display needs revalidation
hwc2_display_t active_builtin_disp_id = hwc_session_->GetActiveBuiltinDisplay();
HWC2::PowerMode previous_mode = hwc_session_->hwc_display_[disp_id]->GetCurrentPowerMode();
DLOGI("disp_id: %d power_mode: %d", disp_id, power_mode);
+ auto mode = static_cast<HWC2::PowerMode>(power_mode);
+
HWCDisplay::HWCLayerStack stack = {};
hwc2_display_t dummy_disp_id = hwc_session_->map_hwc_display_.at(disp_id);
@@ -740,6 +746,21 @@ int HWCSession::DisplayConfigImpl::SetPowerMode(uint32_t disp_id,
hwc_session_->hwc_display_[dummy_disp_id]->UpdatePowerMode(
hwc_session_->hwc_display_[disp_id]->GetCurrentPowerMode());
+ buffer_handle_t target = 0;
+ shared_ptr<Fence> acquire_fence = nullptr;
+ int32_t dataspace = 0;
+ hwc_region_t damage = {};
+ VsyncPeriodNanos vsync_period = 16600000;
+ hwc_session_->hwc_display_[disp_id]->GetClientTarget(
+ target, acquire_fence, dataspace, damage);
+ hwc_session_->hwc_display_[dummy_disp_id]->SetClientTarget(
+ target, acquire_fence, dataspace, damage);
+
+
+
+ hwc_session_->hwc_display_[disp_id]->GetDisplayVsyncPeriod(&vsync_period);
+ hwc_session_->hwc_display_[dummy_disp_id]->SetDisplayVsyncPeriod(vsync_period);
+
hwc_session_->locker_[dummy_disp_id].Unlock(); // Release the dummy display.
// Release the display's power-state transition var read lock.
hwc_session_->power_state_[disp_id].Unlock();
@@ -748,8 +769,7 @@ int HWCSession::DisplayConfigImpl::SetPowerMode(uint32_t disp_id,
// those operations on the dummy display.
// Perform the actual [synchronous] power-state change.
- hwc_session_->hwc_display_[disp_id]->SetPowerMode(static_cast<HWC2::PowerMode>(power_mode),
- false /* teardown */);
+ hwc_session_->hwc_display_[disp_id]->SetPowerMode(mode, false /* teardown */);
// Power state transition end.
// Acquire the display's power-state transition var read lock.
@@ -760,6 +780,15 @@ int HWCSession::DisplayConfigImpl::SetPowerMode(uint32_t disp_id,
// Retrieve the real display's layer-stack from the dummy display.
hwc_session_->hwc_display_[dummy_disp_id]->GetLayerStack(&stack);
hwc_session_->hwc_display_[disp_id]->SetLayerStack(&stack);
+ bool vsync_pending = hwc_session_->hwc_display_[dummy_disp_id]->VsyncEnablePending();
+ if (vsync_pending) {
+ hwc_session_->hwc_display_[disp_id]->SetVsyncEnabled(HWC2::Vsync::Enable);
+ }
+ hwc_session_->hwc_display_[dummy_disp_id]->GetClientTarget(
+ target, acquire_fence, dataspace, damage);
+ hwc_session_->hwc_display_[disp_id]->SetClientTarget(
+ target, acquire_fence, dataspace, damage);
+
// Read display has got layerstack. Update the fences.
hwc_session_->hwc_display_[disp_id]->PostPowerMode();
@@ -1206,4 +1235,41 @@ int HWCSession::DisplayConfigImpl::ControlQsyncCallback(bool enable) {
return 0;
}
+int HWCSession::DisplayConfigImpl::ControlIdleStatusCallback(bool enable) {
+ if (enable) {
+ hwc_session_->idle_callback_ = callback_;
+ } else {
+ hwc_session_->idle_callback_.reset();
+ }
+
+ return 0;
+}
+
+int HWCSession::DisplayConfigImpl::IsRCSupported(uint32_t disp_id, bool *supported) {
+ // Mask layers can potentially be shown on any display so report RC supported on all displays if
+ // the property enables the feature for use.
+ int val = false; // Default value.
+ Debug::GetProperty(ENABLE_ROUNDED_CORNER, &val);
+ *supported = val ? true: false;
+
+ return 0;
+}
+
+int HWCSession::DisplayConfigImpl::AllowIdleFallback() {
+ SEQUENCE_WAIT_SCOPE_LOCK(hwc_session_->locker_[HWC_DISPLAY_PRIMARY]);
+
+ uint32_t active_ms = 0;
+ uint32_t inactive_ms = 0;
+ Debug::GetIdleTimeoutMs(&active_ms, &inactive_ms);
+ if (hwc_session_->hwc_display_[HWC_DISPLAY_PRIMARY]) {
+ DLOGI("enable idle time active_ms:%d inactive_ms:%d",active_ms,inactive_ms);
+ hwc_session_->hwc_display_[HWC_DISPLAY_PRIMARY]->SetIdleTimeoutMs(active_ms, inactive_ms);
+ hwc_session_->is_idle_time_up_ = true;
+ return 0;
+ }
+
+ DLOGW("Display = %d is not connected.", HWC_DISPLAY_PRIMARY);
+ return -ENODEV;
+}
+
} // namespace sdm