Skip to content

Commit 708ebfb

Browse files
committed
SF: add a backdoor to introduce a janky frame to HWC
Bug: 346503493 Test: adb shell service call SurfaceFlinger 1046 i32 3Test: adb root && adb shell service call SurfaceFlinger 1046 i32 3 Flag: EXEMPT bugfix Change-Id: Ic4a837ef06aca40a24db9c1121e19e3e1a1e0d80
1 parent 7a3c56f commit 708ebfb

6 files changed

Lines changed: 30 additions & 2 deletions

File tree

services/surfaceflinger/CompositionEngine/src/Output.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,12 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr
895895
})) {
896896
editState().earliestPresentTime = frameTargetPtrOpt->get()->earliestPresentTime();
897897
editState().expectedPresentTime = frameTargetPtrOpt->get()->expectedPresentTime().ns();
898+
const auto debugPresentDelay = frameTargetPtrOpt->get()->debugPresentDelay();
899+
if (debugPresentDelay) {
900+
SFTRACE_FORMAT_INSTANT("DEBUG delaying presentation by %.2fms",
901+
debugPresentDelay->ns() / 1e6f);
902+
editState().expectedPresentTime += debugPresentDelay->ns();
903+
}
898904
}
899905
editState().frameInterval = refreshArgs.frameInterval;
900906
editState().powerCallback = refreshArgs.powerCallback;

services/surfaceflinger/Scheduler/Scheduler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,16 @@ void Scheduler::run() {
203203

204204
void Scheduler::onFrameSignal(ICompositor& compositor, VsyncId vsyncId,
205205
TimePoint expectedVsyncTime) {
206+
const auto debugPresentDelay = mDebugPresentDelay.load();
207+
mDebugPresentDelay.store(std::nullopt);
208+
206209
const FrameTargeter::BeginFrameArgs beginFrameArgs =
207210
{.frameBeginTime = SchedulerClock::now(),
208211
.vsyncId = vsyncId,
209212
.expectedVsyncTime = expectedVsyncTime,
210213
.sfWorkDuration = mVsyncModulator->getVsyncConfig().sfWorkDuration,
211-
.hwcMinWorkDuration = mVsyncConfiguration->getCurrentConfigs().hwcMinWorkDuration};
214+
.hwcMinWorkDuration = mVsyncConfiguration->getCurrentConfigs().hwcMinWorkDuration,
215+
.debugPresentTimeDelay = debugPresentDelay};
212216

213217
ftl::NonNull<const Display*> pacesetterPtr = pacesetterPtrLocked();
214218
pacesetterPtr->targeterPtr->beginFrame(beginFrameArgs, *pacesetterPtr->schedulePtr);

services/surfaceflinger/Scheduler/Scheduler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,8 @@ class Scheduler : public IEventThreadCallback, android::impl::MessageQueue {
337337
// recovery should begin.
338338
void addBufferStuffedUids(BufferStuffingMap bufferStuffedUids);
339339

340+
void setDebugPresentDelay(TimePoint delay) { mDebugPresentDelay = delay; }
341+
340342
private:
341343
friend class TestableScheduler;
342344

@@ -602,6 +604,8 @@ class Scheduler : public IEventThreadCallback, android::impl::MessageQueue {
602604

603605
FrameRateOverrideMappings mFrameRateOverrideMappings;
604606
SmallAreaDetectionAllowMappings mSmallAreaDetectionAllowMappings;
607+
608+
std::atomic<std::optional<TimePoint>> mDebugPresentDelay;
605609
};
606610

607611
} // namespace scheduler

services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class FrameTarget {
5353

5454
TimePoint expectedPresentTime() const { return mExpectedPresentTime; }
5555

56+
std::optional<TimePoint> debugPresentDelay() const { return mDebugPresentTimeDelay; }
57+
5658
std::optional<TimePoint> earliestPresentTime() const { return mEarliestPresentTime; }
5759

5860
// Equivalent to `expectedSignaledPresentFence` unless running N VSYNCs ahead.
@@ -84,6 +86,7 @@ class FrameTarget {
8486
TimePoint mFrameBeginTime;
8587
TimePoint mExpectedPresentTime;
8688
std::optional<TimePoint> mEarliestPresentTime;
89+
std::optional<TimePoint> mDebugPresentTimeDelay;
8790

8891
TracedOrdinal<bool> mFramePending;
8992
TracedOrdinal<bool> mFrameMissed;
@@ -135,6 +138,7 @@ class FrameTargeter final : private FrameTarget {
135138
TimePoint expectedVsyncTime;
136139
Duration sfWorkDuration;
137140
Duration hwcMinWorkDuration;
141+
std::optional<TimePoint> debugPresentTimeDelay; // used to introduce jank for testing
138142
};
139143

140144
void beginFrame(const BeginFrameArgs&, const IVsyncSource&);

services/surfaceflinger/Scheduler/src/FrameTargeter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ void FrameTargeter::beginFrame(const BeginFrameArgs& args, const IVsyncSource& v
8686
IsFencePendingFuncPtr isFencePendingFuncPtr) {
8787
mVsyncId = args.vsyncId;
8888
mFrameBeginTime = args.frameBeginTime;
89+
mDebugPresentTimeDelay = args.debugPresentTimeDelay;
8990

9091
// The `expectedVsyncTime`, which was predicted when this frame was scheduled, is normally in
9192
// the future relative to `frameBeginTime`, but may not be for delayed frames. Adjust

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6263,7 +6263,7 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
62636263
}
62646264
// Numbers from 1000 to 1045 are currently used for backdoors. The code
62656265
// in onTransact verifies that the user is root, and has access to use SF.
6266-
if (code >= 1000 && code <= 1045) {
6266+
if (code >= 1000 && code <= 1046) {
62676267
ALOGV("Accessing SurfaceFlinger through backdoor code: %u", code);
62686268
return OK;
62696269
}
@@ -6796,6 +6796,15 @@ status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* r
67966796
}
67976797
return err;
67986798
}
6799+
// Introduce jank to HWC
6800+
case 1046: {
6801+
int32_t jankDelayMs = 0;
6802+
if (data.readInt32(&jankDelayMs) != NO_ERROR) {
6803+
return BAD_VALUE;
6804+
}
6805+
mScheduler->setDebugPresentDelay(TimePoint::fromNs(ms2ns(jankDelayMs)));
6806+
return NO_ERROR;
6807+
}
67996808
}
68006809
}
68016810
return err;

0 commit comments

Comments
 (0)