blob: b7917aa00edc789644dc9d8dab5711cc4a400bfb [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();
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) {
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000065 auto c = layer->getCurrentState();
Robert Carr0758e5d2021-03-11 22:15:04 -080066 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000067 }
68
69 void setupScheduler() {
70 auto eventThread = std::make_unique<mock::EventThread>();
71 auto sfEventThread = std::make_unique<mock::EventThread>();
72
73 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
74 EXPECT_CALL(*eventThread, createEventConnection(_, _))
75 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
76 ResyncCallback())));
77
78 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
79 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
80 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
81 ResyncCallback())));
82
83 auto vsyncController = std::make_unique<mock::VsyncController>();
84 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
85
86 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
87 EXPECT_CALL(*vsyncTracker, currentPeriod())
88 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
89 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
90 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
91 std::move(eventThread), std::move(sfEventThread));
92 }
93
94 void setupComposer(uint32_t virtualDisplayCount) {
95 mComposer = new Hwc2::mock::Composer();
96 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
97 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
98
99 Mock::VerifyAndClear(mComposer);
100 }
101
102 TestableSurfaceFlinger mFlinger;
103 Hwc2::mock::Composer* mComposer = nullptr;
Alec Mouria90a5702021-04-16 16:36:21 +0000104 renderengine::mock::RenderEngine mRenderEngine;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000105 FenceToFenceTimeMap fenceFactory;
106 client_cache_t mClientCache;
107
108 void PresentedSurfaceFrameForBufferlessTransaction() {
109 sp<BufferStateLayer> layer = createBufferStateLayer();
110 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
111 10);
112 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
113 ASSERT_TRUE(layer->mCurrentState.bufferSurfaceFrameTX == nullptr);
114 const auto surfaceFrame = layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
115 commitTransaction(layer.get());
116 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000117 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000118 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
119 }
120
121 void PresentedSurfaceFrameForBufferTransaction() {
122 sp<BufferStateLayer> layer = createBufferStateLayer();
123 sp<Fence> fence(new Fence());
124 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000125 const auto buffer = std::make_shared<
126 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
127 1, 0),
128 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000129 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800130 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000131 acquireFence->signalForTest(12);
132
133 commitTransaction(layer.get());
134 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
135 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
136 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
137 // Buffers are presented only at latch time.
138 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
139
140 bool computeVisisbleRegions;
141 layer->updateTexImage(computeVisisbleRegions, 15, 0);
142
143 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000144 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000145 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
146 }
147
148 void DroppedSurfaceFrameForBufferTransaction() {
149 sp<BufferStateLayer> layer = createBufferStateLayer();
150
151 sp<Fence> fence1(new Fence());
152 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000153 const auto buffer1 = std::make_shared<
154 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
155 1, 0),
156 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000157 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800158 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000159 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
160 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
161 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
162
163 sp<Fence> fence2(new Fence());
164 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000165 const auto buffer2 = std::make_shared<
166 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
167 1, 0),
168 mRenderEngine, false);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000169 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000170 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800171 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000172 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000173 acquireFence2->signalForTest(12);
174
175 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
176 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
177 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
178
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
201 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
202 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
203
204 sp<Fence> fence(new Fence());
205 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000206 const auto buffer = std::make_shared<
207 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
208 1, 0),
209 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000210 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800211 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000212 acquireFence->signalForTest(12);
213
214 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
215 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
216 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
217
218 commitTransaction(layer.get());
219 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000220 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000221 // Buffers are presented only at latch time.
222 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
223
224 bool computeVisisbleRegions;
225 layer->updateTexImage(computeVisisbleRegions, 15, 0);
226
227 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
228 }
229
230 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
231 sp<BufferStateLayer> layer = createBufferStateLayer();
232 sp<Fence> fence(new Fence());
233 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000234 const auto buffer = std::make_shared<
235 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
236 1, 0),
237 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000238 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800239 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000240 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
241 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
242
243 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
244 10);
245 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
246 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
247 }
248
249 void MultipleSurfaceFramesPresentedTogether() {
250 sp<BufferStateLayer> layer = createBufferStateLayer();
251 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
252 10);
253 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
254 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
255 const auto bufferlessSurfaceFrame1 =
256 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
257
258 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
259 10);
260 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
261 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
262 const auto bufferlessSurfaceFrame2 = layer->mCurrentState.bufferlessSurfaceFramesTX[4];
263
264 sp<Fence> fence(new Fence());
265 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000266 const auto buffer = std::make_shared<
267 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
268 1, 0),
269 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000270 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800271 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000272 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
273 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
274 const auto& bufferSurfaceFrameTX = layer->mCurrentState.bufferSurfaceFrameTX;
275
276 acquireFence->signalForTest(12);
277
278 commitTransaction(layer.get());
279
280 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000281 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000282 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
283
284 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000285 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000286 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
287
288 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000289 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000290 // Buffers are presented only at latch time.
291 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
292
293 bool computeVisisbleRegions;
294 layer->updateTexImage(computeVisisbleRegions, 15, 0);
295
296 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
297 }
298
Adithya Srinivasan95619432021-02-08 21:52:51 +0000299 void PendingSurfaceFramesRemovedAfterClassification() {
300 sp<BufferStateLayer> layer = createBufferStateLayer();
301
302 sp<Fence> fence1(new Fence());
303 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000304 const auto buffer1 = std::make_shared<
305 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
306 1, 0),
307 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000308 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800309 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000310 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
311 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
312
313 sp<Fence> fence2(new Fence());
314 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000315 const auto buffer2 = std::make_shared<
316 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
317 1, 0),
318 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000319 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800320 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000321 acquireFence2->signalForTest(12);
322
323 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
324 auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
325
326 commitTransaction(layer.get());
327 bool computeVisisbleRegions;
328 layer->updateTexImage(computeVisisbleRegions, 15, 0);
329
330 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
331 // pendingJankClassifications.
332 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
333 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
334 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
335 layer->releasePendingBuffer(25);
336
337 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
338 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000339
340 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
341 sp<BufferStateLayer> layer = createBufferStateLayer();
342
343 sp<Fence> fence1(new Fence());
344 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000345 const auto buffer1 = std::make_shared<
346 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
347 1, 0),
348 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000349 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800350 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000351 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
352 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
353 const auto droppedSurfaceFrame1 = layer->mCurrentState.bufferSurfaceFrameTX;
354
355 sp<Fence> fence2(new Fence());
356 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000357 const auto buffer2 = std::make_shared<
358 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
359 1, 0),
360 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000361 auto dropStartTime1 = systemTime();
362 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800363 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
364 nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000365 auto dropEndTime1 = systemTime();
366 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
367 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
368 const auto droppedSurfaceFrame2 = layer->mCurrentState.bufferSurfaceFrameTX;
369
370 sp<Fence> fence3(new Fence());
371 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Alec Mouria90a5702021-04-16 16:36:21 +0000372 const auto buffer3 = std::make_shared<
373 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
374 1, 0),
375 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000376 auto dropStartTime2 = systemTime();
377 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800378 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000379 auto dropEndTime2 = systemTime();
380 acquireFence3->signalForTest(12);
381
382 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
383 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
384 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
385
386 commitTransaction(layer.get());
387 bool computeVisisbleRegions;
388 layer->updateTexImage(computeVisisbleRegions, 15, 0);
389
390 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000391 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000392 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
393 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
394 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
395 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
396
397 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000398 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000399 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
400 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
401 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
402 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
403
404 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000405 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000406 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
407 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000408
409 void MultipleCommitsBeforeLatch() {
410 sp<BufferStateLayer> layer = createBufferStateLayer();
411 uint32_t surfaceFramesPendingClassification = 0;
412 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
413 for (int i = 0; i < 10; i += 2) {
414 sp<Fence> fence1(new Fence());
Alec Mouria90a5702021-04-16 16:36:21 +0000415 const auto buffer1 = std::make_shared<
416 renderengine::ExternalTexture>(new GraphicBuffer(1, 1,
417 HAL_PIXEL_FORMAT_RGBA_8888, 1,
418 0),
419 mRenderEngine, false);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000420 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800421 {/*vsyncId*/ 1, /*inputEventId*/ 0},
422 nullptr /* releaseBufferCallback */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000423 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
424 /*inputEventId*/ 0},
425 10);
426 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
427 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
428 auto& bufferlessSurfaceFrame =
429 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
430 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
431
432 commitTransaction(layer.get());
433 surfaceFramesPendingClassification += 2;
434 EXPECT_EQ(surfaceFramesPendingClassification,
435 layer->mPendingJankClassifications.size());
436 }
437
438 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
439 bool computeVisisbleRegions;
440 layer->updateTexImage(computeVisisbleRegions, 15, 0);
441 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
442 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
443 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
444 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
445 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
446 }
447 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
448 /*displayDeadlineDelta*/ 0,
449 /*displayPresentDelta*/ 0);
450
451 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
452 ASSERT_EQ(10u, surfaceFramesPendingClassification);
453 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
454
455 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
456 // bufferlessSurfaceFrame presented
457 for (uint32_t i = 0; i < 8; i += 2) {
458 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
459 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
460 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
461 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
462 }
463 {
464 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
465 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
466 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
467 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
468 }
469
470 layer->releasePendingBuffer(25);
471
472 // There shouldn't be any pending classifications. Everything should have been cleared.
473 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
474 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000475};
476
477TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
478 PresentedSurfaceFrameForBufferlessTransaction();
479}
480
481TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
482 PresentedSurfaceFrameForBufferTransaction();
483}
484
485TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
486 DroppedSurfaceFrameForBufferTransaction();
487}
488
489TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
490 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
491}
492
493TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
494 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
495}
496
497TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
498 MultipleSurfaceFramesPresentedTogether();
499}
500
Adithya Srinivasan95619432021-02-08 21:52:51 +0000501TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
502 PendingSurfaceFramesRemovedAfterClassification();
503}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000504
505TEST_F(TransactionSurfaceFrameTest,
506 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
507 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
508}
509
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000510TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
511 MultipleCommitsBeforeLatch();
512}
513
Robert Carr0758e5d2021-03-11 22:15:04 -0800514} // namespace android