5
5
#import < OCMock/OCMock.h>
6
6
#import < XCTest/XCTest.h>
7
7
8
+ #include " flutter/fml/raster_thread_merger.h"
8
9
#include " flutter/fml/thread.h"
9
10
10
11
#import " flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h"
@@ -65,11 +66,11 @@ - (void)testSetCorrectVariableRefreshRates {
65
66
callback: callback] autorelease ];
66
67
CADisplayLink * link = [vsyncClient getDisplayLink ];
67
68
if (@available (iOS 15.0 , *)) {
68
- XCTAssertEqual (link.preferredFrameRateRange .maximum , maxFrameRate);
69
- XCTAssertEqual (link.preferredFrameRateRange .preferred , maxFrameRate);
70
- XCTAssertEqual (link.preferredFrameRateRange .minimum , maxFrameRate / 2 );
69
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , maxFrameRate, 0.1 );
70
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , maxFrameRate, 0.1 );
71
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , maxFrameRate / 2 , 0.1 );
71
72
} else {
72
- XCTAssertEqual (link.preferredFramesPerSecond , maxFrameRate);
73
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , maxFrameRate, 0.1 );
73
74
}
74
75
[vsyncClient release ];
75
76
}
@@ -88,11 +89,11 @@ - (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIs
88
89
callback: callback] autorelease ];
89
90
CADisplayLink * link = [vsyncClient getDisplayLink ];
90
91
if (@available (iOS 15.0 , *)) {
91
- XCTAssertEqual (link.preferredFrameRateRange .maximum , 0 );
92
- XCTAssertEqual (link.preferredFrameRateRange .preferred , 0 );
93
- XCTAssertEqual (link.preferredFrameRateRange .minimum , 0 );
92
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , 0 , 0.1 );
93
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , 0 , 0.1 );
94
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , 0 , 0.1 );
94
95
} else {
95
- XCTAssertEqual (link.preferredFramesPerSecond , 0 );
96
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , 0 , 0.1 );
96
97
}
97
98
[vsyncClient release ];
98
99
}
@@ -107,11 +108,11 @@ - (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIs
107
108
callback: callback] autorelease ];
108
109
CADisplayLink * link = [vsyncClient getDisplayLink ];
109
110
if (@available (iOS 15.0 , *)) {
110
- XCTAssertEqual (link.preferredFrameRateRange .maximum , 0 );
111
- XCTAssertEqual (link.preferredFrameRateRange .preferred , 0 );
112
- XCTAssertEqual (link.preferredFrameRateRange .minimum , 0 );
111
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , 0 , 0.1 );
112
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , 0 , 0.1 );
113
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , 0 , 0.1 );
113
114
} else {
114
- XCTAssertEqual (link.preferredFramesPerSecond , 0 );
115
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , 0 , 0.1 );
115
116
}
116
117
[vsyncClient release ];
117
118
}
@@ -135,4 +136,57 @@ - (void)testAwaitAndPauseWillWorkCorrectly {
135
136
[vsyncClient release ];
136
137
}
137
138
139
+ - (void )testRefreshRateUpdatedTo80WhenThraedsMerge {
140
+ auto platform_thread_task_runner = CreateNewThread (" Platform" );
141
+ auto raster_thread_task_runner = CreateNewThread (" Raster" );
142
+ auto ui_thread_task_runner = CreateNewThread (" UI" );
143
+ auto io_thread_task_runner = CreateNewThread (" IO" );
144
+ auto task_runners =
145
+ flutter::TaskRunners (" test" , platform_thread_task_runner, raster_thread_task_runner,
146
+ ui_thread_task_runner, io_thread_task_runner);
147
+
148
+ id mockDisplayLinkManager = [OCMockObject mockForClass: [DisplayLinkManager class ]];
149
+ double maxFrameRate = 120 ;
150
+ [[[mockDisplayLinkManager stub ] andReturnValue: @(maxFrameRate)] displayRefreshRate ];
151
+ [[[mockDisplayLinkManager stub ] andReturnValue: @(YES )] maxRefreshRateEnabledOnIPhone ];
152
+ auto vsync_waiter = flutter::VsyncWaiterIOS (task_runners);
153
+
154
+ fml::scoped_nsobject<VSyncClient> vsyncClient = vsync_waiter.GetVsyncClient ();
155
+ CADisplayLink * link = [vsyncClient.get () getDisplayLink ];
156
+
157
+ if (@available (iOS 15.0 , *)) {
158
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , maxFrameRate, 0.1 );
159
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , maxFrameRate, 0.1 );
160
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , maxFrameRate / 2 , 0.1 );
161
+ } else {
162
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , maxFrameRate, 0.1 );
163
+ }
164
+
165
+ const auto merger = fml::RasterThreadMerger::CreateOrShareThreadMerger (
166
+ nullptr , platform_thread_task_runner->GetTaskQueueId (),
167
+ raster_thread_task_runner->GetTaskQueueId ());
168
+
169
+ merger->MergeWithLease (5 );
170
+ vsync_waiter.AwaitVSync ();
171
+
172
+ if (@available (iOS 15.0 , *)) {
173
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , 80 , 0.1 );
174
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , 80 , 0.1 );
175
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , 60 , 0.1 );
176
+ } else {
177
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , 80 , 0.1 );
178
+ }
179
+
180
+ merger->UnMergeNowIfLastOne ();
181
+ vsync_waiter.AwaitVSync ();
182
+
183
+ if (@available (iOS 15.0 , *)) {
184
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .maximum , maxFrameRate, 0.1 );
185
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .preferred , maxFrameRate, 0.1 );
186
+ XCTAssertEqualWithAccuracy (link.preferredFrameRateRange .minimum , maxFrameRate / 2 , 0.1 );
187
+ } else {
188
+ XCTAssertEqualWithAccuracy (link.preferredFramesPerSecond , maxFrameRate, 0.1 );
189
+ }
190
+ }
191
+
138
192
@end
0 commit comments