blob: 09a1c2af75c3f9553c9db605a2a176e010e58899 [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) {
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000063 auto c = layer->getCurrentState();
Robert Carr0758e5d2021-03-11 22:15:04 -080064 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000065 }
66
67 void setupScheduler() {
68 auto eventThread = std::make_unique<mock::EventThread>();
69 auto sfEventThread = std::make_unique<mock::EventThread>();
70
71 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
72 EXPECT_CALL(*eventThread, createEventConnection(_, _))
73 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
74 ResyncCallback())));
75
76 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
77 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
78 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
79 ResyncCallback())));
80
81 auto vsyncController = std::make_unique<mock::VsyncController>();
82 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
83
84 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
85 EXPECT_CALL(*vsyncTracker, currentPeriod())
86 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
87 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
88 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
89 std::move(eventThread), std::move(sfEventThread));
90 }
91
92 void setupComposer(uint32_t virtualDisplayCount) {
93 mComposer = new Hwc2::mock::Composer();
94 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
95 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
96
97 Mock::VerifyAndClear(mComposer);
98 }
99
100 TestableSurfaceFlinger mFlinger;
101 Hwc2::mock::Composer* mComposer = nullptr;
102 FenceToFenceTimeMap fenceFactory;
103 client_cache_t mClientCache;
104
105 void PresentedSurfaceFrameForBufferlessTransaction() {
106 sp<BufferStateLayer> layer = createBufferStateLayer();
107 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
108 10);
109 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
110 ASSERT_TRUE(layer->mCurrentState.bufferSurfaceFrameTX == nullptr);
111 const auto surfaceFrame = layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
112 commitTransaction(layer.get());
113 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000114 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000115 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
116 }
117
118 void PresentedSurfaceFrameForBufferTransaction() {
119 sp<BufferStateLayer> layer = createBufferStateLayer();
120 sp<Fence> fence(new Fence());
121 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri617752f2021-04-15 16:27:01 +0000122 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000123 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800124 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000125 acquireFence->signalForTest(12);
126
127 commitTransaction(layer.get());
128 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
129 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
130 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
131 // Buffers are presented only at latch time.
132 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
133
134 bool computeVisisbleRegions;
135 layer->updateTexImage(computeVisisbleRegions, 15, 0);
136
137 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000138 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000139 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
140 }
141
142 void DroppedSurfaceFrameForBufferTransaction() {
143 sp<BufferStateLayer> layer = createBufferStateLayer();
144
145 sp<Fence> fence1(new Fence());
146 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri617752f2021-04-15 16:27:01 +0000147 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000148 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800149 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000150 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
151 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
152 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
153
154 sp<Fence> fence2(new Fence());
155 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri617752f2021-04-15 16:27:01 +0000156 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000157 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000158 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800159 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000160 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000161 acquireFence2->signalForTest(12);
162
163 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
164 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
165 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
166
167 commitTransaction(layer.get());
168 bool computeVisisbleRegions;
169 layer->updateTexImage(computeVisisbleRegions, 15, 0);
170
171 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000172 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000173 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000174 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
175 auto dropTime = droppedSurfaceFrame->getDropTime();
176 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000177
178 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000179 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000180 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
181 }
182
183 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
184 sp<BufferStateLayer> layer = createBufferStateLayer();
185
186 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
187 10);
188
189 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
190 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
191
192 sp<Fence> fence(new Fence());
193 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri617752f2021-04-15 16:27:01 +0000194 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
195
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000196 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800197 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000198 acquireFence->signalForTest(12);
199
200 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
201 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
202 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
203
204 commitTransaction(layer.get());
205 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000206 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000207 // Buffers are presented only at latch time.
208 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
209
210 bool computeVisisbleRegions;
211 layer->updateTexImage(computeVisisbleRegions, 15, 0);
212
213 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
214 }
215
216 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
217 sp<BufferStateLayer> layer = createBufferStateLayer();
218 sp<Fence> fence(new Fence());
219 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri617752f2021-04-15 16:27:01 +0000220 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
221
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000222 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800223 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000224 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
225 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
226
227 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
228 10);
229 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
230 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
231 }
232
233 void MultipleSurfaceFramesPresentedTogether() {
234 sp<BufferStateLayer> layer = createBufferStateLayer();
235 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
236 10);
237 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
238 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
239 const auto bufferlessSurfaceFrame1 =
240 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
241
242 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
243 10);
244 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
245 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
246 const auto bufferlessSurfaceFrame2 = layer->mCurrentState.bufferlessSurfaceFramesTX[4];
247
248 sp<Fence> fence(new Fence());
249 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri617752f2021-04-15 16:27:01 +0000250 sp<GraphicBuffer> buffer{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
251
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000252 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800253 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000254 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
255 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
256 const auto& bufferSurfaceFrameTX = layer->mCurrentState.bufferSurfaceFrameTX;
257
258 acquireFence->signalForTest(12);
259
260 commitTransaction(layer.get());
261
262 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000263 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000264 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
265
266 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000267 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000268 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
269
270 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000271 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000272 // Buffers are presented only at latch time.
273 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
274
275 bool computeVisisbleRegions;
276 layer->updateTexImage(computeVisisbleRegions, 15, 0);
277
278 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
279 }
280
Adithya Srinivasan95619432021-02-08 21:52:51 +0000281 void PendingSurfaceFramesRemovedAfterClassification() {
282 sp<BufferStateLayer> layer = createBufferStateLayer();
283
284 sp<Fence> fence1(new Fence());
285 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri617752f2021-04-15 16:27:01 +0000286 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan95619432021-02-08 21:52:51 +0000287 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800288 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000289 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
290 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
291
292 sp<Fence> fence2(new Fence());
293 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri617752f2021-04-15 16:27:01 +0000294 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan95619432021-02-08 21:52:51 +0000295 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800296 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000297 acquireFence2->signalForTest(12);
298
299 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
300 auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
301
302 commitTransaction(layer.get());
303 bool computeVisisbleRegions;
304 layer->updateTexImage(computeVisisbleRegions, 15, 0);
305
306 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
307 // pendingJankClassifications.
308 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
309 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
310 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
311 layer->releasePendingBuffer(25);
312
313 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
314 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000315
316 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
317 sp<BufferStateLayer> layer = createBufferStateLayer();
318
319 sp<Fence> fence1(new Fence());
320 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri617752f2021-04-15 16:27:01 +0000321 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000322 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800323 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000324 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
325 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
326 const auto droppedSurfaceFrame1 = layer->mCurrentState.bufferSurfaceFrameTX;
327
328 sp<Fence> fence2(new Fence());
329 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri617752f2021-04-15 16:27:01 +0000330 sp<GraphicBuffer> buffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000331 auto dropStartTime1 = systemTime();
332 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800333 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
334 nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000335 auto dropEndTime1 = systemTime();
336 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
337 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
338 const auto droppedSurfaceFrame2 = layer->mCurrentState.bufferSurfaceFrameTX;
339
340 sp<Fence> fence3(new Fence());
341 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Alec Mouri617752f2021-04-15 16:27:01 +0000342 sp<GraphicBuffer> buffer3{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000343 auto dropStartTime2 = systemTime();
344 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800345 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000346 auto dropEndTime2 = systemTime();
347 acquireFence3->signalForTest(12);
348
349 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
350 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
351 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
352
353 commitTransaction(layer.get());
354 bool computeVisisbleRegions;
355 layer->updateTexImage(computeVisisbleRegions, 15, 0);
356
357 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000358 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000359 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
360 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
361 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
362 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
363
364 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000365 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000366 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
367 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
368 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
369 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
370
371 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000372 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000373 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
374 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000375
376 void MultipleCommitsBeforeLatch() {
377 sp<BufferStateLayer> layer = createBufferStateLayer();
378 uint32_t surfaceFramesPendingClassification = 0;
379 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
380 for (int i = 0; i < 10; i += 2) {
381 sp<Fence> fence1(new Fence());
Alec Mouri617752f2021-04-15 16:27:01 +0000382 sp<GraphicBuffer> buffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)};
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000383 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800384 {/*vsyncId*/ 1, /*inputEventId*/ 0},
385 nullptr /* releaseBufferCallback */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000386 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
387 /*inputEventId*/ 0},
388 10);
389 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
390 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
391 auto& bufferlessSurfaceFrame =
392 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
393 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
394
395 commitTransaction(layer.get());
396 surfaceFramesPendingClassification += 2;
397 EXPECT_EQ(surfaceFramesPendingClassification,
398 layer->mPendingJankClassifications.size());
399 }
400
401 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
402 bool computeVisisbleRegions;
403 layer->updateTexImage(computeVisisbleRegions, 15, 0);
404 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
405 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
406 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
407 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
408 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
409 }
410 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
411 /*displayDeadlineDelta*/ 0,
412 /*displayPresentDelta*/ 0);
413
414 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
415 ASSERT_EQ(10u, surfaceFramesPendingClassification);
416 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
417
418 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
419 // bufferlessSurfaceFrame presented
420 for (uint32_t i = 0; i < 8; i += 2) {
421 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
422 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
423 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
424 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
425 }
426 {
427 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
428 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
429 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
430 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
431 }
432
433 layer->releasePendingBuffer(25);
434
435 // There shouldn't be any pending classifications. Everything should have been cleared.
436 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
437 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000438};
439
440TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
441 PresentedSurfaceFrameForBufferlessTransaction();
442}
443
444TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
445 PresentedSurfaceFrameForBufferTransaction();
446}
447
448TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
449 DroppedSurfaceFrameForBufferTransaction();
450}
451
452TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
453 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
454}
455
456TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
457 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
458}
459
460TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
461 MultipleSurfaceFramesPresentedTogether();
462}
463
Adithya Srinivasan95619432021-02-08 21:52:51 +0000464TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
465 PendingSurfaceFramesRemovedAfterClassification();
466}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000467
468TEST_F(TransactionSurfaceFrameTest,
469 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
470 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
471}
472
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000473TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
474 MultipleCommitsBeforeLatch();
475}
476
Robert Carr0758e5d2021-03-11 22:15:04 -0800477} // namespace android