@@ -171,16 +171,22 @@ class DisplayModeSwitchingTest : public DisplayTransactionTest {
171171 static constexpr DisplayModeId kModeId90 {1 };
172172 static constexpr DisplayModeId kModeId120 {2 };
173173 static constexpr DisplayModeId kModeId90_4K {3 };
174+ static constexpr DisplayModeId kModeId60_8K {4 };
174175
175176 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60 , 60_Hz, 0 );
176177 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90 , 90_Hz, 1 );
177178 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120 , 120_Hz, 2 );
178179
179180 static constexpr ui::Size kResolution4K {3840 , 2160 };
181+ static constexpr ui::Size kResolution8K {7680 , 4320 };
182+
180183 static inline const DisplayModePtr kMode90_4K =
181184 createDisplayMode (kModeId90_4K , 90_Hz, 3 , kResolution4K );
185+ static inline const DisplayModePtr kMode60_8K =
186+ createDisplayMode (kModeId60_8K , 60_Hz, 4 , kResolution8K );
182187
183- static inline const DisplayModes kModes = makeModes(kMode60 , kMode90 , kMode120 , kMode90_4K );
188+ static inline const DisplayModes kModes =
189+ makeModes (kMode60 , kMode90 , kMode120 , kMode90_4K , kMode60_8K );
184190};
185191
186192void DisplayModeSwitchingTest::setupScheduler (
@@ -326,6 +332,8 @@ TEST_F(DisplayModeSwitchingTest, twoConsecutiveSetDesiredDisplayModeSpecs) {
326332}
327333
328334TEST_F (DisplayModeSwitchingTest, changeResolutionWithoutRefreshRequired) {
335+ SET_FLAG_FOR_TEST (flags::synced_resolution_switch, false );
336+
329337 EXPECT_THAT (mDisplay , ModeSettledTo (&dmc (), kModeId60 ));
330338
331339 EXPECT_EQ (NO_ERROR,
@@ -360,6 +368,44 @@ TEST_F(DisplayModeSwitchingTest, changeResolutionWithoutRefreshRequired) {
360368 EXPECT_THAT (mDisplay , ModeSettledTo (&dmc (), kModeId90_4K ));
361369}
362370
371+ TEST_F (DisplayModeSwitchingTest, changeResolutionSynced) {
372+ SET_FLAG_FOR_TEST (flags::synced_resolution_switch, true );
373+
374+ EXPECT_THAT (mDisplay , ModeSettledTo (&dmc (), kModeId60 ));
375+
376+ // PrimaryDisplayVariant has a 4K size, so switch to 8K.
377+ EXPECT_EQ (NO_ERROR,
378+ mFlinger .setDesiredDisplayModeSpecs (mDisplay ->getDisplayToken ().promote (),
379+ mock::createDisplayModeSpecs (kModeId60_8K ,
380+ 60_Hz)));
381+
382+ EXPECT_THAT (mDisplay , ModeSwitchingTo (&mFlinger , kModeId60_8K ));
383+
384+ // The mode should not be set until the commit that resizes the display.
385+ mFlinger .commit ();
386+ EXPECT_THAT (mDisplay , ModeSwitchingTo (&mFlinger , kModeId60_8K ));
387+ mFlinger .commit ();
388+ EXPECT_THAT (mDisplay , ModeSwitchingTo (&mFlinger , kModeId60_8K ));
389+
390+ // Set the display size to match the resolution.
391+ DisplayState state;
392+ state.what = DisplayState::eDisplaySizeChanged;
393+ state.token = mDisplay ->getDisplayToken ().promote ();
394+ state.width = static_cast <uint32_t >(kResolution8K .width );
395+ state.height = static_cast <uint32_t >(kResolution8K .height );
396+
397+ // The next commit should set the mode and resize the framebuffer.
398+ const VsyncPeriodChangeTimeline timeline{.refreshRequired = false };
399+ EXPECT_CALL (*mDisplaySurface , resizeBuffers (kResolution8K ));
400+ EXPECT_SET_ACTIVE_CONFIG (kInnerDisplayHwcId , kModeId60_8K );
401+
402+ constexpr bool kModeset = true ;
403+ mFlinger .setDisplayStateLocked (state);
404+ mFlinger .configureAndCommit (kModeset );
405+
406+ EXPECT_THAT (mDisplay , ModeSettledTo (&dmc (), kModeId60_8K ));
407+ }
408+
363409TEST_F (DisplayModeSwitchingTest, innerXorOuterDisplay) {
364410 SET_FLAG_FOR_TEST (flags::connected_display, true );
365411
0 commit comments