blob: 6ff6e908fa32e7db96ccfaa9c0081c9fdeb7d93f [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 Mouri2daef3c2021-04-02 16:29:27 -070024#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();
48 setupComposer(0);
49 }
50
51 ~TransactionSurfaceFrameTest() {
52 const ::testing::TestInfo* const test_info =
53 ::testing::UnitTest::GetInstance()->current_test_info();
54 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
55 }
56
57 sp<BufferStateLayer> createBufferStateLayer() {
58 sp<Client> client;
59 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 100, 100, 0,
60 LayerMetadata());
61 return new BufferStateLayer(args);
62 }
63
64 void commitTransaction(Layer* layer) {
65 layer->pushPendingState();
66 // After pushing the state, the currentState should not store any BufferlessSurfaceFrames
67 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
68 auto c = layer->getCurrentState();
69 if (layer->applyPendingStates(&c)) {
70 layer->commitTransaction(c);
71 }
72 }
73
74 void setupScheduler() {
75 auto eventThread = std::make_unique<mock::EventThread>();
76 auto sfEventThread = std::make_unique<mock::EventThread>();
77
78 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
79 EXPECT_CALL(*eventThread, createEventConnection(_, _))
80 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
81 ResyncCallback())));
82
83 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
84 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
85 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
86 ResyncCallback())));
87
88 auto vsyncController = std::make_unique<mock::VsyncController>();
89 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
90
91 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
92 EXPECT_CALL(*vsyncTracker, currentPeriod())
93 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
94 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
95 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
96 std::move(eventThread), std::move(sfEventThread));
97 }
98
99 void setupComposer(uint32_t virtualDisplayCount) {
100 mComposer = new Hwc2::mock::Composer();
101 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
102 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
103
104 Mock::VerifyAndClear(mComposer);
105 }
106
107 TestableSurfaceFlinger mFlinger;
108 Hwc2::mock::Composer* mComposer = nullptr;
Alec Mouri2daef3c2021-04-02 16:29:27 -0700109 renderengine::mock::RenderEngine mRenderEngine;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000110 FenceToFenceTimeMap fenceFactory;
111 client_cache_t mClientCache;
112
113 void PresentedSurfaceFrameForBufferlessTransaction() {
114 sp<BufferStateLayer> layer = createBufferStateLayer();
115 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
116 10);
117 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
118 ASSERT_TRUE(layer->mCurrentState.bufferSurfaceFrameTX == nullptr);
119 const auto surfaceFrame = layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
120 commitTransaction(layer.get());
121 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000122 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000123 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
124 }
125
126 void PresentedSurfaceFrameForBufferTransaction() {
127 sp<BufferStateLayer> layer = createBufferStateLayer();
128 sp<Fence> fence(new Fence());
129 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700130 const auto buffer = std::make_shared<
131 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
132 1, 0),
133 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000134 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800135 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000136 acquireFence->signalForTest(12);
137
138 commitTransaction(layer.get());
139 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
140 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
141 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
142 // Buffers are presented only at latch time.
143 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
144
145 bool computeVisisbleRegions;
146 layer->updateTexImage(computeVisisbleRegions, 15, 0);
147
148 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000149 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000150 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
151 }
152
153 void DroppedSurfaceFrameForBufferTransaction() {
154 sp<BufferStateLayer> layer = createBufferStateLayer();
155
156 sp<Fence> fence1(new Fence());
157 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700158 const auto buffer1 = std::make_shared<
159 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
160 1, 0),
161 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000162 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800163 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000164 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
165 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
166 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
167
168 sp<Fence> fence2(new Fence());
169 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700170 const auto buffer2 = std::make_shared<
171 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
172 1, 0),
173 mRenderEngine, false);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000174 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000175 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800176 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000177 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000178 acquireFence2->signalForTest(12);
179
180 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
181 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
182 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
183
184 commitTransaction(layer.get());
185 bool computeVisisbleRegions;
186 layer->updateTexImage(computeVisisbleRegions, 15, 0);
187
188 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000189 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000190 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000191 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
192 auto dropTime = droppedSurfaceFrame->getDropTime();
193 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000194
195 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000196 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000197 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
198 }
199
200 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
201 sp<BufferStateLayer> layer = createBufferStateLayer();
202
203 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
204 10);
205
206 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
207 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
208
209 sp<Fence> fence(new Fence());
210 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700211 const auto buffer = std::make_shared<
212 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
213 1, 0),
214 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000215 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800216 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000217 acquireFence->signalForTest(12);
218
219 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
220 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
221 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
222
223 commitTransaction(layer.get());
224 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000225 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000226 // Buffers are presented only at latch time.
227 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
228
229 bool computeVisisbleRegions;
230 layer->updateTexImage(computeVisisbleRegions, 15, 0);
231
232 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
233 }
234
235 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
236 sp<BufferStateLayer> layer = createBufferStateLayer();
237 sp<Fence> fence(new Fence());
238 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700239 const auto buffer = std::make_shared<
240 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
241 1, 0),
242 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000243 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800244 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000245 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
246 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
247
248 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
249 10);
250 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
251 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
252 }
253
254 void MultipleSurfaceFramesPresentedTogether() {
255 sp<BufferStateLayer> layer = createBufferStateLayer();
256 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
257 10);
258 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
259 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
260 const auto bufferlessSurfaceFrame1 =
261 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
262
263 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
264 10);
265 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
266 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
267 const auto bufferlessSurfaceFrame2 = layer->mCurrentState.bufferlessSurfaceFramesTX[4];
268
269 sp<Fence> fence(new Fence());
270 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700271 const auto buffer = std::make_shared<
272 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
273 1, 0),
274 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000275 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800276 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000277 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
278 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
279 const auto& bufferSurfaceFrameTX = layer->mCurrentState.bufferSurfaceFrameTX;
280
281 acquireFence->signalForTest(12);
282
283 commitTransaction(layer.get());
284
285 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000286 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000287 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
288
289 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000290 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000291 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
292
293 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000294 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000295 // Buffers are presented only at latch time.
296 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
297
298 bool computeVisisbleRegions;
299 layer->updateTexImage(computeVisisbleRegions, 15, 0);
300
301 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
302 }
303
304 void MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken() {
305 sp<BufferStateLayer> layer = createBufferStateLayer();
306 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
307 10);
308 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
309 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
310 const auto bufferlessSurfaceFrame1 =
311 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
312
313 layer->pushPendingState();
314 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
315
316 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2, /*inputEventId*/ 0},
317 12);
318 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
319 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
320 const auto bufferlessSurfaceFrame2 =
321 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 2);
322
323 commitTransaction(layer.get());
324
325 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000326 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000327 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
328 EXPECT_EQ(10, bufferlessSurfaceFrame1->getActuals().endTime);
329
330 EXPECT_EQ(2, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000331 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000332 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
333 EXPECT_EQ(12, bufferlessSurfaceFrame2->getActuals().endTime);
334 }
335
336 void MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken() {
337 sp<BufferStateLayer> layer = createBufferStateLayer();
338 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
339 10);
340 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
341 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
342 const auto bufferlessSurfaceFrame1 =
343 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
344
345 layer->pushPendingState();
346 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
347
348 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
349 12);
350 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
351 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
352 const auto bufferlessSurfaceFrame2 =
353 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
354
355 commitTransaction(layer.get());
356
357 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000358 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000359 EXPECT_EQ(PresentState::Unknown, bufferlessSurfaceFrame1->getPresentState());
360
361 EXPECT_EQ(1, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000362 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000363 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
364 EXPECT_EQ(12, bufferlessSurfaceFrame2->getActuals().endTime);
365 }
Adithya Srinivasan95619432021-02-08 21:52:51 +0000366
367 void PendingSurfaceFramesRemovedAfterClassification() {
368 sp<BufferStateLayer> layer = createBufferStateLayer();
369
370 sp<Fence> fence1(new Fence());
371 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700372 const auto buffer1 = std::make_shared<
373 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
374 1, 0),
375 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000376 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800377 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000378 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
379 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
380
381 sp<Fence> fence2(new Fence());
382 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700383 const auto buffer2 = std::make_shared<
384 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
385 1, 0),
386 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000387 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800388 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000389 acquireFence2->signalForTest(12);
390
391 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
392 auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
393
394 commitTransaction(layer.get());
395 bool computeVisisbleRegions;
396 layer->updateTexImage(computeVisisbleRegions, 15, 0);
397
398 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
399 // pendingJankClassifications.
400 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
401 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
402 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
403 layer->releasePendingBuffer(25);
404
405 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
406 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000407
408 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
409 sp<BufferStateLayer> layer = createBufferStateLayer();
410
411 sp<Fence> fence1(new Fence());
412 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700413 const auto buffer1 = std::make_shared<
414 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
415 1, 0),
416 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000417 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800418 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000419 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
420 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
421 const auto droppedSurfaceFrame1 = layer->mCurrentState.bufferSurfaceFrameTX;
422
423 sp<Fence> fence2(new Fence());
424 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700425 const auto buffer2 = std::make_shared<
426 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
427 1, 0),
428 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000429 auto dropStartTime1 = systemTime();
430 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800431 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
432 nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000433 auto dropEndTime1 = systemTime();
434 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
435 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
436 const auto droppedSurfaceFrame2 = layer->mCurrentState.bufferSurfaceFrameTX;
437
438 sp<Fence> fence3(new Fence());
439 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Alec Mouri2daef3c2021-04-02 16:29:27 -0700440 const auto buffer3 = std::make_shared<
441 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
442 1, 0),
443 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000444 auto dropStartTime2 = systemTime();
445 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800446 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000447 auto dropEndTime2 = systemTime();
448 acquireFence3->signalForTest(12);
449
450 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
451 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
452 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
453
454 commitTransaction(layer.get());
455 bool computeVisisbleRegions;
456 layer->updateTexImage(computeVisisbleRegions, 15, 0);
457
458 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000459 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000460 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
461 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
462 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
463 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
464
465 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000466 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000467 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
468 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
469 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
470 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
471
472 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000473 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000474 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
475 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000476
477 void MultipleCommitsBeforeLatch() {
478 sp<BufferStateLayer> layer = createBufferStateLayer();
479 uint32_t surfaceFramesPendingClassification = 0;
480 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
481 for (int i = 0; i < 10; i += 2) {
482 sp<Fence> fence1(new Fence());
Alec Mouri2daef3c2021-04-02 16:29:27 -0700483 const auto buffer1 = std::make_shared<
484 renderengine::ExternalTexture>(new GraphicBuffer(1, 1,
485 HAL_PIXEL_FORMAT_RGBA_8888, 1,
486 0),
487 mRenderEngine, false);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000488 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800489 {/*vsyncId*/ 1, /*inputEventId*/ 0},
490 nullptr /* releaseBufferCallback */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000491 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
492 /*inputEventId*/ 0},
493 10);
494 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
495 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
496 auto& bufferlessSurfaceFrame =
497 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
498 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
499
500 commitTransaction(layer.get());
501 surfaceFramesPendingClassification += 2;
502 EXPECT_EQ(surfaceFramesPendingClassification,
503 layer->mPendingJankClassifications.size());
504 }
505
506 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
507 bool computeVisisbleRegions;
508 layer->updateTexImage(computeVisisbleRegions, 15, 0);
509 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
510 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
511 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
512 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
513 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
514 }
515 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
516 /*displayDeadlineDelta*/ 0,
517 /*displayPresentDelta*/ 0);
518
519 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
520 ASSERT_EQ(10u, surfaceFramesPendingClassification);
521 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
522
523 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
524 // bufferlessSurfaceFrame presented
525 for (uint32_t i = 0; i < 8; i += 2) {
526 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
527 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
528 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
529 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
530 }
531 {
532 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
533 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
534 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
535 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
536 }
537
538 layer->releasePendingBuffer(25);
539
540 // There shouldn't be any pending classifications. Everything should have been cleared.
541 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
542 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000543};
544
545TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
546 PresentedSurfaceFrameForBufferlessTransaction();
547}
548
549TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
550 PresentedSurfaceFrameForBufferTransaction();
551}
552
553TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
554 DroppedSurfaceFrameForBufferTransaction();
555}
556
557TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
558 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
559}
560
561TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
562 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
563}
564
565TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
566 MultipleSurfaceFramesPresentedTogether();
567}
568
569TEST_F(TransactionSurfaceFrameTest,
570 MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken) {
571 MergePendingStates_BufferlessSurfaceFramesWithoutOverlappingToken();
572}
573
574TEST_F(TransactionSurfaceFrameTest,
575 MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken) {
576 MergePendingStates_BufferlessSurfaceFramesWithOverlappingToken();
577}
578
Adithya Srinivasan95619432021-02-08 21:52:51 +0000579TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
580 PendingSurfaceFramesRemovedAfterClassification();
581}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000582
583TEST_F(TransactionSurfaceFrameTest,
584 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
585 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
586}
587
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000588TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
589 MultipleCommitsBeforeLatch();
590}
591
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000592} // namespace android