blob: c75538f47645ea2ce60c4b0b316e1aac3347e4a9 [file] [log] [blame]
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +00001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "LibSurfaceFlingerUnittests"
19
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
22#include <gui/SurfaceComposerClient.h>
23#include <log/log.h>
24#include <utils/String8.h>
25
26#include "TestableSurfaceFlinger.h"
27#include "mock/DisplayHardware/MockComposer.h"
28#include "mock/MockEventThread.h"
29#include "mock/MockVsyncController.h"
30
31namespace android {
32
33using testing::_;
34using testing::Mock;
35using testing::Return;
36using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
37using PresentState = frametimeline::SurfaceFrame::PresentState;
38
39class TransactionSurfaceFrameTest : public testing::Test {
40public:
41 TransactionSurfaceFrameTest() {
42 const ::testing::TestInfo* const test_info =
43 ::testing::UnitTest::GetInstance()->current_test_info();
44 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
45 setupScheduler();
46 setupComposer(0);
47 }
48
49 ~TransactionSurfaceFrameTest() {
50 const ::testing::TestInfo* const test_info =
51 ::testing::UnitTest::GetInstance()->current_test_info();
52 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
53 }
54
55 sp<BufferStateLayer> createBufferStateLayer() {
56 sp<Client> client;
57 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 100, 100, 0,
58 LayerMetadata());
59 return new BufferStateLayer(args);
60 }
61
62 void commitTransaction(Layer* layer) {
63 layer->pushPendingState();
64 // After pushing the state, the currentState should not store any BufferlessSurfaceFrames
65 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
66 auto c = layer->getCurrentState();
67 if (layer->applyPendingStates(&c)) {
68 layer->commitTransaction(c);
69 }
70 }
71
72 void setupScheduler() {
73 auto eventThread = std::make_unique<mock::EventThread>();
74 auto sfEventThread = std::make_unique<mock::EventThread>();
75
76 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
77 EXPECT_CALL(*eventThread, createEventConnection(_, _))
78 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
79 ResyncCallback())));
80
81 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
82 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
83 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
84 ResyncCallback())));
85
86 auto vsyncController = std::make_unique<mock::VsyncController>();
87 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
88
89 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
90 EXPECT_CALL(*vsyncTracker, currentPeriod())
91 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
92 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
93 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
94 std::move(eventThread), std::move(sfEventThread));
95 }
96
97 void setupComposer(uint32_t virtualDisplayCount) {
98 mComposer = new Hwc2::mock::Composer();
99 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
100 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
101
102 Mock::VerifyAndClear(mComposer);
103 }
104
105 TestableSurfaceFlinger mFlinger;
106 Hwc2::mock::Composer* mComposer = nullptr;
107 FenceToFenceTimeMap fenceFactory;
108 client_cache_t mClientCache;
109
110 void PresentedSurfaceFrameForBufferlessTransaction() {
111 sp<BufferStateLayer> layer = createBufferStateLayer();
112 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
113 10);
114 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
115 ASSERT_TRUE(layer->mCurrentState.bufferSurfaceFrameTX == nullptr);
116 const auto surfaceFrame = layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
117 commitTransaction(layer.get());
118 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000119 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000120 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
121 }
122
123 void PresentedSurfaceFrameForBufferTransaction() {
124 sp<BufferStateLayer> layer = createBufferStateLayer();
125 sp<Fence> fence(new Fence());
126 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
127 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
128 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800129 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000130 acquireFence->signalForTest(12);
131
132 commitTransaction(layer.get());
133 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
134 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
135 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
136 // Buffers are presented only at latch time.
137 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
138
139 bool computeVisisbleRegions;
140 layer->updateTexImage(computeVisisbleRegions, 15, 0);
141
142 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000143 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000144 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
145 }
146
147 void DroppedSurfaceFrameForBufferTransaction() {
148 sp<BufferStateLayer> layer = createBufferStateLayer();
149
150 sp<Fence> fence1(new Fence());
151 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
152 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
153 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800154 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000155 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
156 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
157 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
158
159 sp<Fence> fence2(new Fence());
160 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
161 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000162 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000163 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800164 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000165 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000166 acquireFence2->signalForTest(12);
167
168 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
169 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
170 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
171
172 commitTransaction(layer.get());
173 bool computeVisisbleRegions;
174 layer->updateTexImage(computeVisisbleRegions, 15, 0);
175
176 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000177 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000178 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000179 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
180 auto dropTime = droppedSurfaceFrame->getDropTime();
181 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000182
183 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000184 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000185 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
186 }
187
188 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
189 sp<BufferStateLayer> layer = createBufferStateLayer();
190
191 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
192 10);
193
194 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
195 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
196
197 sp<Fence> fence(new Fence());
198 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
199 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
200
201 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800202 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000203 acquireFence->signalForTest(12);
204
205 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
206 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
207 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
208
209 commitTransaction(layer.get());
210 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000211 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000212 // Buffers are presented only at latch time.
213 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
214
215 bool computeVisisbleRegions;
216 layer->updateTexImage(computeVisisbleRegions, 15, 0);
217
218 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
219 }
220
221 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
222 sp<BufferStateLayer> layer = createBufferStateLayer();
223 sp<Fence> fence(new Fence());
224 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
225 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
226
227 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800228 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000229 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
230 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
231
232 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
233 10);
234 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
235 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
236 }
237
238 void MultipleSurfaceFramesPresentedTogether() {
239 sp<BufferStateLayer> layer = createBufferStateLayer();
240 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
241 10);
242 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
243 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
244 const auto bufferlessSurfaceFrame1 =
245 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
246
247 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
248 10);
249 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
250 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
251 const auto bufferlessSurfaceFrame2 = layer->mCurrentState.bufferlessSurfaceFramesTX[4];
252
253 sp<Fence> fence(new Fence());
254 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
255 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
256
257 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800258 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000259 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
260 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
261 const auto& bufferSurfaceFrameTX = layer->mCurrentState.bufferSurfaceFrameTX;
262
263 acquireFence->signalForTest(12);
264
265 commitTransaction(layer.get());
266
267 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000268 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000269 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
270
271 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000272 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000273 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
274
275 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000276 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000277 // Buffers are presented only at latch time.
278 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
279
280 bool computeVisisbleRegions;
281 layer->updateTexImage(computeVisisbleRegions, 15, 0);
282
283 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
284 }
285
286 void MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken() {
287 sp<BufferStateLayer> layer = createBufferStateLayer();
288 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
289 10);
290 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
291 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
292 const auto bufferlessSurfaceFrame1 =
293 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
294
295 layer->pushPendingState();
296 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
297
298 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2, /*inputEventId*/ 0},
299 12);
300 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
301 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
302 const auto bufferlessSurfaceFrame2 =
303 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 2);
304
305 commitTransaction(layer.get());
306
307 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000308 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000309 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
310 EXPECT_EQ(10, bufferlessSurfaceFrame1->getActuals().endTime);
311
312 EXPECT_EQ(2, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000313 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000314 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
315 EXPECT_EQ(12, bufferlessSurfaceFrame2->getActuals().endTime);
316 }
317
318 void MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken() {
319 sp<BufferStateLayer> layer = createBufferStateLayer();
320 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
321 10);
322 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
323 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
324 const auto bufferlessSurfaceFrame1 =
325 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
326
327 layer->pushPendingState();
328 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
329
330 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
331 12);
332 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
333 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
334 const auto bufferlessSurfaceFrame2 =
335 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
336
337 commitTransaction(layer.get());
338
339 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000340 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000341 EXPECT_EQ(PresentState::Unknown, bufferlessSurfaceFrame1->getPresentState());
342
343 EXPECT_EQ(1, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000344 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000345 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
346 EXPECT_EQ(12, bufferlessSurfaceFrame2->getActuals().endTime);
347 }
Adithya Srinivasan95619432021-02-08 21:52:51 +0000348
349 void PendingSurfaceFramesRemovedAfterClassification() {
350 sp<BufferStateLayer> layer = createBufferStateLayer();
351
352 sp<Fence> fence1(new Fence());
353 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
354 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
355 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800356 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000357 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
358 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
359
360 sp<Fence> fence2(new Fence());
361 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
362 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
363 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800364 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000365 acquireFence2->signalForTest(12);
366
367 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
368 auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
369
370 commitTransaction(layer.get());
371 bool computeVisisbleRegions;
372 layer->updateTexImage(computeVisisbleRegions, 15, 0);
373
374 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
375 // pendingJankClassifications.
376 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
377 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
378 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
379 layer->releasePendingBuffer(25);
380
381 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
382 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000383
384 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
385 sp<BufferStateLayer> layer = createBufferStateLayer();
386
387 sp<Fence> fence1(new Fence());
388 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
389 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
390 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800391 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000392 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
393 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
394 const auto droppedSurfaceFrame1 = layer->mCurrentState.bufferSurfaceFrameTX;
395
396 sp<Fence> fence2(new Fence());
397 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
398 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
399 auto dropStartTime1 = systemTime();
400 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800401 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
402 nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000403 auto dropEndTime1 = systemTime();
404 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
405 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
406 const auto droppedSurfaceFrame2 = layer->mCurrentState.bufferSurfaceFrameTX;
407
408 sp<Fence> fence3(new Fence());
409 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
410 sp<GraphicBuffer> buffer3{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
411 auto dropStartTime2 = systemTime();
412 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800413 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000414 auto dropEndTime2 = systemTime();
415 acquireFence3->signalForTest(12);
416
417 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
418 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
419 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
420
421 commitTransaction(layer.get());
422 bool computeVisisbleRegions;
423 layer->updateTexImage(computeVisisbleRegions, 15, 0);
424
425 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000426 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000427 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
428 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
429 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
430 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
431
432 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000433 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000434 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
435 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
436 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
437 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
438
439 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000440 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000441 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
442 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000443
444 void MultipleCommitsBeforeLatch() {
445 sp<BufferStateLayer> layer = createBufferStateLayer();
446 uint32_t surfaceFramesPendingClassification = 0;
447 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
448 for (int i = 0; i < 10; i += 2) {
449 sp<Fence> fence1(new Fence());
450 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
451 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800452 {/*vsyncId*/ 1, /*inputEventId*/ 0},
453 nullptr /* releaseBufferCallback */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000454 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
455 /*inputEventId*/ 0},
456 10);
457 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
458 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
459 auto& bufferlessSurfaceFrame =
460 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
461 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
462
463 commitTransaction(layer.get());
464 surfaceFramesPendingClassification += 2;
465 EXPECT_EQ(surfaceFramesPendingClassification,
466 layer->mPendingJankClassifications.size());
467 }
468
469 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
470 bool computeVisisbleRegions;
471 layer->updateTexImage(computeVisisbleRegions, 15, 0);
472 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
473 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
474 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
475 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
476 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
477 }
478 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
479 /*displayDeadlineDelta*/ 0,
480 /*displayPresentDelta*/ 0);
481
482 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
483 ASSERT_EQ(10u, surfaceFramesPendingClassification);
484 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
485
486 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
487 // bufferlessSurfaceFrame presented
488 for (uint32_t i = 0; i < 8; i += 2) {
489 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
490 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
491 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
492 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
493 }
494 {
495 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
496 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
497 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
498 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
499 }
500
501 layer->releasePendingBuffer(25);
502
503 // There shouldn't be any pending classifications. Everything should have been cleared.
504 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
505 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000506};
507
508TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
509 PresentedSurfaceFrameForBufferlessTransaction();
510}
511
512TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
513 PresentedSurfaceFrameForBufferTransaction();
514}
515
516TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
517 DroppedSurfaceFrameForBufferTransaction();
518}
519
520TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
521 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
522}
523
524TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
525 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
526}
527
528TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
529 MultipleSurfaceFramesPresentedTogether();
530}
531
532TEST_F(TransactionSurfaceFrameTest,
533 MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken) {
534 MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken();
535}
536
537TEST_F(TransactionSurfaceFrameTest,
538 MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken) {
539 MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken();
540}
541
Adithya Srinivasan95619432021-02-08 21:52:51 +0000542TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
543 PendingSurfaceFramesRemovedAfterClassification();
544}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000545
546TEST_F(TransactionSurfaceFrameTest,
547 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
548 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
549}
550
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000551TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
552 MultipleCommitsBeforeLatch();
553}
554
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000555} // namespace android