summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/DisplayDevice.cpp
diff options
context:
space:
mode:
author Dominik Laskowski <domlaskowski@google.com> 2023-11-27 11:45:57 -0500
committer Dominik Laskowski <domlaskowski@google.com> 2023-11-30 12:22:21 -0500
commit1ab20c51fa8a5a104338df6b6361d7d0ab0636fa (patch)
tree633f032fe0f38927d1311a9c2cd70a2edc139f54 /services/surfaceflinger/DisplayDevice.cpp
parent86382017378fca31f16d81a0df26205148a1188f (diff)
SF: Remove DisplayDevice::ActiveModeInfo
This type is redundant with DisplayModeRequest, so store the desired and pending modes as DisplayModeRequestOpt. This is a step toward flowing the request through one of desired/pending/active states. Use the std::nullopt state of the desired mode instead of relying on the implicitly associated TracedOrdinal<bool>. Bug: 241285876 Test: presubmit Change-Id: Ie12a5ad420745761c73b1ce2c536862f79a50665
Diffstat (limited to 'services/surfaceflinger/DisplayDevice.cpp')
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp55
1 files changed, 24 insertions, 31 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index 7fdf9e7672..249c40b473 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -70,7 +70,7 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args)
mIsPrimary(args.isPrimary),
mRequestedRefreshRate(args.requestedRefreshRate),
mRefreshRateSelector(std::move(args.refreshRateSelector)),
- mDesiredModeChanged(concatId("DesiredModeChanged"), false) {
+ mHasDesiredModeTrace(concatId("HasDesiredMode"), false) {
mCompositionDisplay->editState().isSecure = args.isSecure;
mCompositionDisplay->createRenderSurface(
compositionengine::RenderSurfaceCreationArgsBuilder()
@@ -217,20 +217,13 @@ void DisplayDevice::setActiveMode(DisplayModeId modeId, Fps vsyncRate, Fps rende
updateRefreshRateOverlayRate(vsyncRate, renderFps);
}
-bool DisplayDevice::initiateModeChange(const ActiveModeInfo& info,
+bool DisplayDevice::initiateModeChange(display::DisplayModeRequest&& desiredMode,
const hal::VsyncPeriodChangeConstraints& constraints,
hal::VsyncPeriodChangeTimeline& outTimeline) {
- if (!info.modeOpt || info.modeOpt->modePtr->getPhysicalDisplayId() != getPhysicalId()) {
- ALOGE("Trying to initiate a mode change to invalid mode %s on display %s",
- info.modeOpt ? std::to_string(info.modeOpt->modePtr->getId().value()).c_str()
- : "null",
- to_string(getId()).c_str());
- return BAD_VALUE;
- }
- mPendingMode = info;
+ mPendingModeOpt = std::move(desiredMode);
mIsModeSetPending = true;
- const auto& mode = *info.modeOpt->modePtr;
+ const auto& mode = *mPendingModeOpt->mode.modePtr;
if (mHwComposer.setActiveModeWithConstraints(getPhysicalId(), mode.getHwcId(), constraints,
&outTimeline) != OK) {
@@ -528,35 +521,36 @@ void DisplayDevice::animateOverlay() {
}
}
-auto DisplayDevice::setDesiredMode(const ActiveModeInfo& info, bool force) -> DesiredModeAction {
+auto DisplayDevice::setDesiredMode(display::DisplayModeRequest&& desiredMode, bool force)
+ -> DesiredModeAction {
ATRACE_CALL();
- LOG_ALWAYS_FATAL_IF(!info.modeOpt, "desired mode not provided");
- LOG_ALWAYS_FATAL_IF(getPhysicalId() != info.modeOpt->modePtr->getPhysicalDisplayId(),
+ const auto& desiredModePtr = desiredMode.mode.modePtr;
+
+ LOG_ALWAYS_FATAL_IF(getPhysicalId() != desiredModePtr->getPhysicalDisplayId(),
"DisplayId mismatch");
- ALOGV("%s(%s)", __func__, to_string(*info.modeOpt->modePtr).c_str());
+ ALOGV("%s(%s)", __func__, to_string(*desiredModePtr).c_str());
std::scoped_lock lock(mDesiredModeLock);
- if (mDesiredModeChanged) {
+ if (mDesiredModeOpt) {
// A mode transition was already scheduled, so just override the desired mode.
- const auto event = mDesiredMode.event;
- mDesiredMode = info;
- mDesiredMode.event = mDesiredMode.event | event;
+ const bool emitEvent = mDesiredModeOpt->emitEvent;
+ mDesiredModeOpt = std::move(desiredMode);
+ mDesiredModeOpt->emitEvent |= emitEvent;
return DesiredModeAction::None;
}
- const auto& desiredMode = *info.modeOpt->modePtr;
-
// If the desired mode is already active...
const auto activeMode = refreshRateSelector().getActiveMode();
- if (!force && activeMode.modePtr->getId() == desiredMode.getId()) {
- if (activeMode == info.modeOpt) {
+ if (!force && activeMode.modePtr->getId() == desiredModePtr->getId()) {
+ if (activeMode == desiredMode.mode) {
return DesiredModeAction::None;
}
// ...but the render rate changed:
- setActiveMode(desiredMode.getId(), desiredMode.getVsyncRate(), info.modeOpt->fps);
+ setActiveMode(desiredModePtr->getId(), desiredModePtr->getVsyncRate(),
+ desiredMode.mode.fps);
return DesiredModeAction::InitiateRenderRateSwitch;
}
@@ -566,21 +560,20 @@ auto DisplayDevice::setDesiredMode(const ActiveModeInfo& info, bool force) -> De
activeMode.modePtr->getVsyncRate());
// Initiate a mode change.
- mDesiredModeChanged = true;
- mDesiredMode = info;
+ mDesiredModeOpt = std::move(desiredMode);
+ mHasDesiredModeTrace = true;
return DesiredModeAction::InitiateDisplayModeSwitch;
}
-auto DisplayDevice::getDesiredMode() const -> ftl::Optional<ActiveModeInfo> {
+auto DisplayDevice::getDesiredMode() const -> DisplayModeRequestOpt {
std::scoped_lock lock(mDesiredModeLock);
- if (mDesiredModeChanged) return mDesiredMode;
- return std::nullopt;
+ return mDesiredModeOpt;
}
void DisplayDevice::clearDesiredMode() {
std::scoped_lock lock(mDesiredModeLock);
- mDesiredMode.event = scheduler::DisplayModeEvent::None;
- mDesiredModeChanged = false;
+ mDesiredModeOpt.reset();
+ mHasDesiredModeTrace = false;
}
void DisplayDevice::adjustRefreshRate(Fps pacesetterDisplayRefreshRate) {