SF: Introduce LayerTraceGenerator
Generates layer traces from transaction traces. The tool is a custom
surface flinger build that mocks out most everything else apart from
the front end logic. Transaction traces are written when the
transaction is applied, along with a timestamp and vsync id. The
transactions are parsed from proto, and applied to recreate the
layer state and output the result into a layer trace.
Test: presubmit
Bug: 200284593
Change-Id: If90a23b9310dbafbdca597b7f5178e40c8b86022
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
index 67e47e7..d83b9bb 100644
--- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
+++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
@@ -177,8 +177,10 @@
public:
using HotplugEvent = SurfaceFlinger::HotplugEvent;
- TestableSurfaceFlinger()
- : mFlinger(sp<SurfaceFlinger>::make(mFactory, SurfaceFlinger::SkipInitialization)) {
+ TestableSurfaceFlinger(sp<SurfaceFlinger> flinger = nullptr) : mFlinger(flinger) {
+ if (!mFlinger) {
+ mFlinger = sp<SurfaceFlinger>::make(mFactory, SurfaceFlinger::SkipInitialization);
+ }
mFlinger->mAnimationTransactionTimeout = ms2ns(10);
}
@@ -219,7 +221,8 @@
std::unique_ptr<EventThread> appEventThread,
std::unique_ptr<EventThread> sfEventThread,
SchedulerCallbackImpl callbackImpl = SchedulerCallbackImpl::kNoOp,
- DisplayModesVariant modesVariant = kOneDisplayMode) {
+ DisplayModesVariant modesVariant = kOneDisplayMode,
+ bool useNiceMock = false) {
RefreshRateConfigsPtr configs;
if (std::holds_alternative<RefreshRateConfigsPtr>(modesVariant)) {
configs = std::move(std::get<RefreshRateConfigsPtr>(modesVariant));
@@ -256,9 +259,17 @@
? static_cast<Callback&>(mNoOpSchedulerCallback)
: static_cast<Callback&>(mSchedulerCallback);
- mScheduler = new scheduler::TestableScheduler(std::move(vsyncController),
- std::move(vsyncTracker), std::move(configs),
- callback);
+ if (useNiceMock) {
+ mScheduler =
+ new testing::NiceMock<scheduler::TestableScheduler>(std::move(vsyncController),
+ std::move(vsyncTracker),
+ std::move(configs),
+ callback);
+ } else {
+ mScheduler = new scheduler::TestableScheduler(std::move(vsyncController),
+ std::move(vsyncTracker),
+ std::move(configs), callback);
+ }
mFlinger->mAppConnectionHandle = mScheduler->createConnection(std::move(appEventThread));
mFlinger->mSfConnectionHandle = mScheduler->createConnection(std::move(sfEventThread));
@@ -455,6 +466,23 @@
mFlinger->onActiveDisplayChangedLocked(activeDisplay);
}
+ auto commit(nsecs_t frameTime, int64_t vsyncId) {
+ const nsecs_t expectedVsyncTime = frameTime + 10'000'000;
+ mFlinger->commit(frameTime, vsyncId, expectedVsyncTime);
+ }
+
+ auto createLayer(LayerCreationArgs& args, sp<IBinder>* outHandle,
+ const sp<IBinder>& parentHandle, int32_t* outLayerId,
+ const sp<Layer>& parentLayer, uint32_t* outTransformHint) {
+ return mFlinger->createLayer(args, outHandle, parentHandle, outLayerId, parentLayer,
+ outTransformHint);
+ }
+
+ auto mirrorLayer(const LayerCreationArgs& args, const sp<IBinder>& mirrorFromHandle,
+ sp<IBinder>* outHandle, int32_t* outLayerId) {
+ return mFlinger->mirrorLayer(args, mirrorFromHandle, outHandle, outLayerId);
+ }
+
/* ------------------------------------------------------------------------
* Read-only access to private data to assert post-conditions.
*/
@@ -850,8 +878,7 @@
private:
surfaceflinger::test::Factory mFactory;
- sp<SurfaceFlinger> mFlinger = new SurfaceFlinger(mFactory, SurfaceFlinger::SkipInitialization);
-
+ sp<SurfaceFlinger> mFlinger;
scheduler::mock::SchedulerCallback mSchedulerCallback;
scheduler::mock::NoOpSchedulerCallback mNoOpSchedulerCallback;
scheduler::TestableScheduler* mScheduler = nullptr;