Skip to content

Commit 5ef1fa1

Browse files
author
Manasi Navare
committed
SF: Propagate Display Mode Rejection from SF to DM
Create a new DisplayEventReceiver callback for onModeRejected to signal mode rejection from SF to DM so that DM can trigger a retry. Add the plumbing through DisplayEventReceiver and EventThread Bug: 374184110 Test: manual Flag: com.android.graphics.surfaceflinger.flags.display_config_error_hal Change-Id: I78515d413bdf2e6e07d6649b7b60df8ced199b19 Signed-off-by: Manasi Navare <navaremanasi@google.com>
1 parent b03dfd3 commit 5ef1fa1

11 files changed

Lines changed: 68 additions & 3 deletions

File tree

libs/gui/Choreographer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,10 @@ void Choreographer::dispatchHdcpLevelsChanged(PhysicalDisplayId displayId, int32
369369
this, to_string(displayId).c_str(), connectedLevel, maxLevel);
370370
}
371371

372+
void Choreographer::dispatchModeRejected(PhysicalDisplayId, int32_t) {
373+
LOG_ALWAYS_FATAL("dispatchModeRejected was called but was never registered");
374+
}
375+
372376
void Choreographer::handleMessage(const Message& message) {
373377
switch (message.what) {
374378
case MSG_SCHEDULE_CALLBACKS:

libs/gui/DisplayEventDispatcher.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ bool DisplayEventDispatcher::processPendingEvents(nsecs_t* outTimestamp,
211211
ev.hdcpLevelsChange.connectedLevel,
212212
ev.hdcpLevelsChange.maxLevel);
213213
break;
214+
case DisplayEventReceiver::DISPLAY_EVENT_MODE_REJECTION:
215+
dispatchModeRejected(ev.header.displayId, ev.modeRejection.modeId);
216+
break;
214217
default:
215218
ALOGW("dispatcher %p ~ ignoring unknown event type %#x", this, ev.header.type);
216219
break;

libs/gui/include/gui/Choreographer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class Choreographer : public DisplayEventDispatcher, public MessageHandler {
127127
std::vector<FrameRateOverride> overrides) override;
128128
void dispatchHdcpLevelsChanged(PhysicalDisplayId displayId, int32_t connectedLevel,
129129
int32_t maxLevel) override;
130+
void dispatchModeRejected(PhysicalDisplayId displayId, int32_t modeId) override;
130131

131132
void scheduleCallbacks();
132133

libs/gui/include/gui/DisplayEventDispatcher.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class DisplayEventDispatcher : public LooperCallback {
6868
virtual void dispatchHdcpLevelsChanged(PhysicalDisplayId displayId, int32_t connectedLevel,
6969
int32_t maxLevel) = 0;
7070

71+
virtual void dispatchModeRejected(PhysicalDisplayId displayId, int32_t modeId) = 0;
72+
7173
bool processPendingEvents(nsecs_t* outTimestamp, PhysicalDisplayId* outDisplayId,
7274
uint32_t* outCount, VsyncEventData* outVsyncEventData);
7375

libs/gui/include/gui/DisplayEventReceiver.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class DisplayEventReceiver {
6262
DISPLAY_EVENT_VSYNC = fourcc('v', 's', 'y', 'n'),
6363
DISPLAY_EVENT_HOTPLUG = fourcc('p', 'l', 'u', 'g'),
6464
DISPLAY_EVENT_MODE_CHANGE = fourcc('m', 'o', 'd', 'e'),
65+
DISPLAY_EVENT_MODE_REJECTION = fourcc('r', 'e', 'j', 'e'),
6566
DISPLAY_EVENT_NULL = fourcc('n', 'u', 'l', 'l'),
6667
DISPLAY_EVENT_FRAME_RATE_OVERRIDE = fourcc('r', 'a', 't', 'e'),
6768
DISPLAY_EVENT_FRAME_RATE_OVERRIDE_FLUSH = fourcc('f', 'l', 's', 'h'),
@@ -96,6 +97,10 @@ class DisplayEventReceiver {
9697
nsecs_t vsyncPeriod __attribute__((aligned(8)));
9798
};
9899

100+
struct ModeRejection {
101+
int32_t modeId;
102+
};
103+
99104
struct FrameRateOverride {
100105
uid_t uid __attribute__((aligned(8)));
101106
float frameRateHz __attribute__((aligned(8)));
@@ -117,6 +122,7 @@ class DisplayEventReceiver {
117122
ModeChange modeChange;
118123
FrameRateOverride frameRateOverride;
119124
HdcpLevelsChange hdcpLevelsChange;
125+
ModeRejection modeRejection;
120126
};
121127
};
122128
static_assert(sizeof(Event) == 224);

services/surfaceflinger/Scheduler/EventThread.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <utils/Errors.h>
4444

4545
#include <common/FlagManager.h>
46+
#include <scheduler/FrameRateMode.h>
4647
#include <scheduler/VsyncConfig.h>
4748
#include "FrameTimeline.h"
4849
#include "VSyncDispatch.h"
@@ -102,6 +103,10 @@ std::string toString(const DisplayEventReceiver::Event& event) {
102103
to_string(event.header.displayId).c_str(),
103104
event.hdcpLevelsChange.connectedLevel,
104105
event.hdcpLevelsChange.maxLevel);
106+
case DisplayEventReceiver::DISPLAY_EVENT_MODE_REJECTION:
107+
return StringPrintf("ModeRejected{displayId=%s, modeId=%u}",
108+
to_string(event.header.displayId).c_str(),
109+
event.modeRejection.modeId);
105110
default:
106111
return "Event{}";
107112
}
@@ -186,6 +191,18 @@ DisplayEventReceiver::Event makeHdcpLevelsChange(PhysicalDisplayId displayId,
186191
};
187192
}
188193

194+
DisplayEventReceiver::Event makeModeRejection(PhysicalDisplayId displayId, DisplayModeId modeId) {
195+
return DisplayEventReceiver::Event{
196+
.header =
197+
DisplayEventReceiver::Event::Header{
198+
.type = DisplayEventReceiver::DISPLAY_EVENT_MODE_REJECTION,
199+
.displayId = displayId,
200+
.timestamp = systemTime(),
201+
},
202+
.modeRejection.modeId = ftl::to_underlying(modeId),
203+
};
204+
}
205+
189206
} // namespace
190207

191208
EventThreadConnection::EventThreadConnection(EventThread* eventThread, uid_t callingUid,
@@ -480,6 +497,13 @@ void EventThread::onHdcpLevelsChanged(PhysicalDisplayId displayId, int32_t conne
480497
mCondition.notify_all();
481498
}
482499

500+
void EventThread::onModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) {
501+
std::lock_guard<std::mutex> lock(mMutex);
502+
503+
mPendingEvents.push_back(makeModeRejection(displayId, modeId));
504+
mCondition.notify_all();
505+
}
506+
483507
// Merge lists of buffer stuffed Uids
484508
void EventThread::addBufferStuffedUids(BufferStuffingMap bufferStuffedUids) {
485509
std::lock_guard<std::mutex> lock(mMutex);

services/surfaceflinger/Scheduler/EventThread.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <gui/DisplayEventReceiver.h>
2222
#include <private/gui/BitTube.h>
2323
#include <sys/types.h>
24+
#include <ui/DisplayId.h>
2425
#include <utils/Errors.h>
2526

2627
#include <scheduler/FrameRateMode.h>
@@ -32,6 +33,7 @@
3233
#include <thread>
3334
#include <vector>
3435

36+
#include "DisplayHardware/DisplayMode.h"
3537
#include "TracedOrdinal.h"
3638
#include "VSyncDispatch.h"
3739
#include "VsyncSchedule.h"
@@ -115,6 +117,9 @@ class EventThread {
115117
// called when SF changes the active mode and apps needs to be notified about the change
116118
virtual void onModeChanged(const scheduler::FrameRateMode&) = 0;
117119

120+
// called when SF rejects the mode change request
121+
virtual void onModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) = 0;
122+
118123
// called when SF updates the Frame Rate Override list
119124
virtual void onFrameRateOverridesChanged(PhysicalDisplayId displayId,
120125
std::vector<FrameRateOverride> overrides) = 0;
@@ -179,6 +184,8 @@ class EventThread : public android::EventThread {
179184

180185
void onModeChanged(const scheduler::FrameRateMode&) override;
181186

187+
void onModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) override;
188+
182189
void onFrameRateOverridesChanged(PhysicalDisplayId displayId,
183190
std::vector<FrameRateOverride> overrides) override;
184191

services/surfaceflinger/Scheduler/Scheduler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,12 @@ bool Scheduler::onDisplayModeChanged(PhysicalDisplayId displayId, const FrameRat
465465
}
466466
#pragma clang diagnostic pop
467467

468+
void Scheduler::onDisplayModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) {
469+
if (hasEventThreads()) {
470+
eventThreadFor(Cycle::Render).onModeRejected(displayId, modeId);
471+
}
472+
}
473+
468474
void Scheduler::emitModeChangeIfNeeded() {
469475
if (!mPolicy.modeOpt || !mPolicy.emittedModeOpt) {
470476
ALOGW("No mode change to emit");

services/surfaceflinger/Scheduler/Scheduler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@
3636
#include <ftl/non_null.h>
3737
#include <ftl/optional.h>
3838
#include <scheduler/Features.h>
39+
#include <scheduler/FrameRateMode.h>
3940
#include <scheduler/FrameTargeter.h>
4041
#include <scheduler/Time.h>
4142
#include <scheduler/VsyncConfig.h>
4243
#include <ui/DisplayId.h>
4344
#include <ui/DisplayMap.h>
4445

46+
#include "DisplayHardware/DisplayMode.h"
4547
#include "EventThread.h"
4648
#include "FrameRateOverrideMappings.h"
4749
#include "ISchedulerCallback.h"
@@ -153,6 +155,8 @@ class Scheduler : public IEventThreadCallback, android::impl::MessageQueue {
153155
bool onDisplayModeChanged(PhysicalDisplayId, const FrameRateMode&,
154156
bool clearContentRequirements) EXCLUDES(mPolicyLock);
155157

158+
void onDisplayModeRejected(PhysicalDisplayId, DisplayModeId);
159+
156160
void enableSyntheticVsync(bool = true) REQUIRES(kMainThreadContext);
157161
void omitVsyncDispatching(bool) REQUIRES(kMainThreadContext);
158162

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,9 +1532,15 @@ void SurfaceFlinger::initiateDisplayModeChanges() {
15321532
constraints.seamlessRequired = false;
15331533
hal::VsyncPeriodChangeTimeline outTimeline;
15341534

1535-
if (mDisplayModeController.initiateModeChange(displayId, std::move(*desiredModeOpt),
1536-
constraints, outTimeline) !=
1537-
display::DisplayModeController::ModeChangeResult::Changed) {
1535+
const auto error =
1536+
mDisplayModeController.initiateModeChange(displayId, std::move(*desiredModeOpt),
1537+
constraints, outTimeline);
1538+
if (error != display::DisplayModeController::ModeChangeResult::Changed) {
1539+
dropModeRequest(displayId);
1540+
if (FlagManager::getInstance().display_config_error_hal() &&
1541+
error == display::DisplayModeController::ModeChangeResult::Rejected) {
1542+
mScheduler->onDisplayModeRejected(displayId, desiredModeId);
1543+
}
15381544
continue;
15391545
}
15401546

0 commit comments

Comments
 (0)