blob: 704340deac1b64660b640571bc80977d1d01d005 [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>
Alec Mouria90a5702021-04-16 16:36:21 +000024#include <renderengine/ExternalTexture.h>
25#include <renderengine/mock/RenderEngine.h>
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000026#include <utils/String8.h>
27
28#include "TestableSurfaceFlinger.h"
29#include "mock/DisplayHardware/MockComposer.h"
30#include "mock/MockEventThread.h"
31#include "mock/MockVsyncController.h"
32
33namespace android {
34
35using testing::_;
36using testing::Mock;
37using testing::Return;
38using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
39using PresentState = frametimeline::SurfaceFrame::PresentState;
40
41class TransactionSurfaceFrameTest : public testing::Test {
42public:
43 TransactionSurfaceFrameTest() {
44 const ::testing::TestInfo* const test_info =
45 ::testing::UnitTest::GetInstance()->current_test_info();
46 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
47 setupScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080048 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
chaviwba4320c2021-09-15 15:20:53 -050049 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000050 }
51
52 ~TransactionSurfaceFrameTest() {
53 const ::testing::TestInfo* const test_info =
54 ::testing::UnitTest::GetInstance()->current_test_info();
55 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
56 }
57
58 sp<BufferStateLayer> createBufferStateLayer() {
59 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080060 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 0,
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000061 LayerMetadata());
62 return new BufferStateLayer(args);
63 }
64
65 void commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -070066 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080067 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000068 }
69
70 void setupScheduler() {
71 auto eventThread = std::make_unique<mock::EventThread>();
72 auto sfEventThread = std::make_unique<mock::EventThread>();
73
74 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
75 EXPECT_CALL(*eventThread, createEventConnection(_, _))
76 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
77 ResyncCallback())));
78
79 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
80 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
81 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
82 ResyncCallback())));
83
84 auto vsyncController = std::make_unique<mock::VsyncController>();
85 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
86
87 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
88 EXPECT_CALL(*vsyncTracker, currentPeriod())
89 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
90 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
91 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
92 std::move(eventThread), std::move(sfEventThread));
93 }
94
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000095 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050096 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -080097
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000098 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000099
100 void PresentedSurfaceFrameForBufferlessTransaction() {
101 sp<BufferStateLayer> layer = createBufferStateLayer();
102 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
103 10);
Robert Carr6a160312021-05-17 12:08:20 -0700104 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
105 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
106 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000107 commitTransaction(layer.get());
108 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000109 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000110 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
111 }
112
113 void PresentedSurfaceFrameForBufferTransaction() {
114 sp<BufferStateLayer> layer = createBufferStateLayer();
115 sp<Fence> fence(new Fence());
116 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500117 const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
118 BufferData bufferData;
119 bufferData.buffer = buffer;
120 bufferData.acquireFence = fence;
121 bufferData.frameNumber = 1;
122 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
123 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
124 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
125 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000126 acquireFence->signalForTest(12);
127
128 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700129 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
130 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
131 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000132 // Buffers are presented only at latch time.
133 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
134
135 bool computeVisisbleRegions;
136 layer->updateTexImage(computeVisisbleRegions, 15, 0);
137
138 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000139 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000140 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
141 }
142
143 void DroppedSurfaceFrameForBufferTransaction() {
144 sp<BufferStateLayer> layer = createBufferStateLayer();
145
146 sp<Fence> fence1(new Fence());
147 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500148 const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
149 BufferData bufferData;
150 bufferData.buffer = buffer1;
151 bufferData.acquireFence = fence1;
152 bufferData.frameNumber = 1;
153 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
154 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
155 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
156 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700157 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
158 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
159 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000160
161 sp<Fence> fence2(new Fence());
162 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500163 const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000164 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500165 bufferData.buffer = buffer2;
166 bufferData.acquireFence = fence2;
167 bufferData.frameNumber = 1;
168 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
169 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
170 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
171 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000172 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000173 acquireFence2->signalForTest(12);
174
Robert Carr6a160312021-05-17 12:08:20 -0700175 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
176 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
177 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000178
179 commitTransaction(layer.get());
180 bool computeVisisbleRegions;
181 layer->updateTexImage(computeVisisbleRegions, 15, 0);
182
183 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000184 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000185 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000186 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
187 auto dropTime = droppedSurfaceFrame->getDropTime();
188 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000189
190 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000191 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000192 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
193 }
194
195 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
196 sp<BufferStateLayer> layer = createBufferStateLayer();
197
198 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
199 10);
200
Robert Carr6a160312021-05-17 12:08:20 -0700201 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
202 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000203
204 sp<Fence> fence(new Fence());
205 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500206 const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
207 BufferData bufferData;
208 bufferData.buffer = buffer;
209 bufferData.acquireFence = fence;
210 bufferData.frameNumber = 1;
211 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
212 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
213 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
214 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000215 acquireFence->signalForTest(12);
216
Robert Carr6a160312021-05-17 12:08:20 -0700217 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
218 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
219 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000220
221 commitTransaction(layer.get());
222 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000223 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000224 // Buffers are presented only at latch time.
225 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
226
227 bool computeVisisbleRegions;
228 layer->updateTexImage(computeVisisbleRegions, 15, 0);
229
230 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
231 }
232
233 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
234 sp<BufferStateLayer> layer = createBufferStateLayer();
235 sp<Fence> fence(new Fence());
236 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500237 const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
238 BufferData bufferData;
239 bufferData.buffer = buffer;
240 bufferData.acquireFence = fence;
241 bufferData.frameNumber = 1;
242 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
243 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
244 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
245 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700246 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
247 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000248
249 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
250 10);
Robert Carr6a160312021-05-17 12:08:20 -0700251 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
252 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000253 }
254
255 void MultipleSurfaceFramesPresentedTogether() {
256 sp<BufferStateLayer> layer = createBufferStateLayer();
257 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
258 10);
Robert Carr6a160312021-05-17 12:08:20 -0700259 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
260 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000261 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700262 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000263
264 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
265 10);
Robert Carr6a160312021-05-17 12:08:20 -0700266 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
267 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
268 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000269
270 sp<Fence> fence(new Fence());
271 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500272 const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
273 BufferData bufferData;
274 bufferData.buffer = buffer;
275 bufferData.acquireFence = fence;
276 bufferData.frameNumber = 1;
277 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
278 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
279 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
280 {/*vsyncId*/ 3, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700281 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
282 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
283 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000284
285 acquireFence->signalForTest(12);
286
287 commitTransaction(layer.get());
288
289 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000290 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000291 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
292
293 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000294 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000295 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
296
297 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000298 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000299 // Buffers are presented only at latch time.
300 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
301
302 bool computeVisisbleRegions;
303 layer->updateTexImage(computeVisisbleRegions, 15, 0);
304
305 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
306 }
307
Adithya Srinivasan95619432021-02-08 21:52:51 +0000308 void PendingSurfaceFramesRemovedAfterClassification() {
309 sp<BufferStateLayer> layer = createBufferStateLayer();
310
311 sp<Fence> fence1(new Fence());
312 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500313 const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
314 BufferData bufferData;
315 bufferData.buffer = buffer1;
316 bufferData.acquireFence = fence1;
317 bufferData.frameNumber = 1;
318 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
319 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
320 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
321 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700322 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
323 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000324
325 sp<Fence> fence2(new Fence());
326 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500327 const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
328 bufferData.buffer = buffer2;
329 bufferData.acquireFence = fence2;
330 bufferData.frameNumber = 1;
331 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
332 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
333 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
334 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasan95619432021-02-08 21:52:51 +0000335 acquireFence2->signalForTest(12);
336
Robert Carr6a160312021-05-17 12:08:20 -0700337 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
338 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000339
340 commitTransaction(layer.get());
341 bool computeVisisbleRegions;
342 layer->updateTexImage(computeVisisbleRegions, 15, 0);
343
344 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
345 // pendingJankClassifications.
346 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700347 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000348 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
349 layer->releasePendingBuffer(25);
350
351 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
352 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000353
354 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
355 sp<BufferStateLayer> layer = createBufferStateLayer();
356
357 sp<Fence> fence1(new Fence());
358 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500359 const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
360 BufferData bufferData;
361 bufferData.buffer = buffer1;
362 bufferData.acquireFence = fence1;
363 bufferData.frameNumber = 1;
364 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
365 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
366 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
367 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700368 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
369 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
370 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000371
372 sp<Fence> fence2(new Fence());
373 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500374 const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000375 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500376 bufferData.buffer = buffer2;
377 bufferData.acquireFence = fence2;
378 bufferData.frameNumber = 1;
379 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
380 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
381 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
382 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0});
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000383 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700384 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
385 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
386 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000387
388 sp<Fence> fence3(new Fence());
389 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
chaviwba4320c2021-09-15 15:20:53 -0500390 const auto buffer3 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000391 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500392 bufferData.buffer = buffer3;
393 bufferData.acquireFence = fence3;
394 bufferData.frameNumber = 1;
395 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
396 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
397 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
398 {/*vsyncId*/ 2, /*inputEventId*/ 0});
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000399 auto dropEndTime2 = systemTime();
400 acquireFence3->signalForTest(12);
401
Robert Carr6a160312021-05-17 12:08:20 -0700402 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
403 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
404 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000405
406 commitTransaction(layer.get());
407 bool computeVisisbleRegions;
408 layer->updateTexImage(computeVisisbleRegions, 15, 0);
409
410 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000411 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000412 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
413 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
414 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
415 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
416
417 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000418 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000419 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
420 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
421 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
422 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
423
424 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000425 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000426 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
427 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000428
429 void MultipleCommitsBeforeLatch() {
430 sp<BufferStateLayer> layer = createBufferStateLayer();
431 uint32_t surfaceFramesPendingClassification = 0;
432 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
433 for (int i = 0; i < 10; i += 2) {
chaviwba4320c2021-09-15 15:20:53 -0500434 sp<Fence> fence(new Fence());
435 const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0);
436 BufferData bufferData;
437 bufferData.buffer = buffer;
438 bufferData.acquireFence = fence;
439 bufferData.frameNumber = 1;
440 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
441 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
442 layer->setBuffer(bufferData, 10, 20, false, std::nullopt,
443 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000444 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
445 /*inputEventId*/ 0},
446 10);
Robert Carr6a160312021-05-17 12:08:20 -0700447 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
448 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000449 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700450 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000451 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
452
453 commitTransaction(layer.get());
454 surfaceFramesPendingClassification += 2;
455 EXPECT_EQ(surfaceFramesPendingClassification,
456 layer->mPendingJankClassifications.size());
457 }
458
459 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
460 bool computeVisisbleRegions;
461 layer->updateTexImage(computeVisisbleRegions, 15, 0);
462 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
463 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
464 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700465 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000466 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
467 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700468 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000469 /*displayDeadlineDelta*/ 0,
470 /*displayPresentDelta*/ 0);
471
472 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
473 ASSERT_EQ(10u, surfaceFramesPendingClassification);
474 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
475
476 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
477 // bufferlessSurfaceFrame presented
478 for (uint32_t i = 0; i < 8; i += 2) {
479 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
480 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
481 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
482 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
483 }
484 {
485 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
486 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
487 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
488 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
489 }
490
491 layer->releasePendingBuffer(25);
492
493 // There shouldn't be any pending classifications. Everything should have been cleared.
494 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
495 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000496};
497
498TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
499 PresentedSurfaceFrameForBufferlessTransaction();
500}
501
502TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
503 PresentedSurfaceFrameForBufferTransaction();
504}
505
506TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
507 DroppedSurfaceFrameForBufferTransaction();
508}
509
510TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
511 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
512}
513
514TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
515 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
516}
517
518TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
519 MultipleSurfaceFramesPresentedTogether();
520}
521
Adithya Srinivasan95619432021-02-08 21:52:51 +0000522TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
523 PendingSurfaceFramesRemovedAfterClassification();
524}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000525
526TEST_F(TransactionSurfaceFrameTest,
527 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
528 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
529}
530
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000531TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
532 MultipleCommitsBeforeLatch();
533}
534
Robert Carr0758e5d2021-03-11 22:15:04 -0800535} // namespace android