blob: c1123cd6e8b2e04193e4c1f57a0c14b28de4b2ff [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>());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000049 }
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
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000094 TestableSurfaceFlinger mFlinger;
Alec Mouria90a5702021-04-16 16:36:21 +000095 renderengine::mock::RenderEngine mRenderEngine;
Dominik Laskowski13948602021-03-08 20:48:28 -080096
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000097 FenceToFenceTimeMap fenceFactory;
98 client_cache_t mClientCache;
99
100 void PresentedSurfaceFrameForBufferlessTransaction() {
101 sp<BufferStateLayer> layer = createBufferStateLayer();
102 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
103 10);
104 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
105 ASSERT_TRUE(layer->mCurrentState.bufferSurfaceFrameTX == nullptr);
106 const auto surfaceFrame = layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
107 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);
Alec Mouria90a5702021-04-16 16:36:21 +0000117 const auto buffer = std::make_shared<
118 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
119 1, 0),
120 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000121 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800122 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000123 acquireFence->signalForTest(12);
124
125 commitTransaction(layer.get());
126 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
127 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
128 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
129 // Buffers are presented only at latch time.
130 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
131
132 bool computeVisisbleRegions;
133 layer->updateTexImage(computeVisisbleRegions, 15, 0);
134
135 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000136 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000137 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
138 }
139
140 void DroppedSurfaceFrameForBufferTransaction() {
141 sp<BufferStateLayer> layer = createBufferStateLayer();
142
143 sp<Fence> fence1(new Fence());
144 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000145 const auto buffer1 = std::make_shared<
146 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
147 1, 0),
148 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000149 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800150 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000151 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
152 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
153 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
154
155 sp<Fence> fence2(new Fence());
156 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000157 const auto buffer2 = std::make_shared<
158 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
159 1, 0),
160 mRenderEngine, false);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000161 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000162 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800163 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000164 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000165 acquireFence2->signalForTest(12);
166
167 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
168 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
169 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
170
171 commitTransaction(layer.get());
172 bool computeVisisbleRegions;
173 layer->updateTexImage(computeVisisbleRegions, 15, 0);
174
175 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000176 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000177 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000178 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
179 auto dropTime = droppedSurfaceFrame->getDropTime();
180 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000181
182 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000183 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000184 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
185 }
186
187 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
188 sp<BufferStateLayer> layer = createBufferStateLayer();
189
190 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
191 10);
192
193 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
194 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
195
196 sp<Fence> fence(new Fence());
197 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000198 const auto buffer = std::make_shared<
199 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
200 1, 0),
201 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000202 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800203 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000204 acquireFence->signalForTest(12);
205
206 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
207 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
208 const auto& surfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
209
210 commitTransaction(layer.get());
211 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000212 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000213 // Buffers are presented only at latch time.
214 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
215
216 bool computeVisisbleRegions;
217 layer->updateTexImage(computeVisisbleRegions, 15, 0);
218
219 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
220 }
221
222 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
223 sp<BufferStateLayer> layer = createBufferStateLayer();
224 sp<Fence> fence(new Fence());
225 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000226 const auto buffer = std::make_shared<
227 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
228 1, 0),
229 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000230 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800231 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000232 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
233 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
234
235 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
236 10);
237 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
238 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
239 }
240
241 void MultipleSurfaceFramesPresentedTogether() {
242 sp<BufferStateLayer> layer = createBufferStateLayer();
243 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
244 10);
245 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
246 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
247 const auto bufferlessSurfaceFrame1 =
248 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
249
250 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
251 10);
252 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
253 ASSERT_EQ(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
254 const auto bufferlessSurfaceFrame2 = layer->mCurrentState.bufferlessSurfaceFramesTX[4];
255
256 sp<Fence> fence(new Fence());
257 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000258 const auto buffer = std::make_shared<
259 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
260 1, 0),
261 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000262 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800263 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000264 EXPECT_EQ(2u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
265 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
266 const auto& bufferSurfaceFrameTX = layer->mCurrentState.bufferSurfaceFrameTX;
267
268 acquireFence->signalForTest(12);
269
270 commitTransaction(layer.get());
271
272 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000273 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000274 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
275
276 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000277 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000278 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
279
280 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000281 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000282 // Buffers are presented only at latch time.
283 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
284
285 bool computeVisisbleRegions;
286 layer->updateTexImage(computeVisisbleRegions, 15, 0);
287
288 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
289 }
290
Adithya Srinivasan95619432021-02-08 21:52:51 +0000291 void PendingSurfaceFramesRemovedAfterClassification() {
292 sp<BufferStateLayer> layer = createBufferStateLayer();
293
294 sp<Fence> fence1(new Fence());
295 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000296 const auto buffer1 = std::make_shared<
297 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
298 1, 0),
299 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000300 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800301 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000302 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
303 const auto droppedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
304
305 sp<Fence> fence2(new Fence());
306 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000307 const auto buffer2 = std::make_shared<
308 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
309 1, 0),
310 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000311 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800312 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000313 acquireFence2->signalForTest(12);
314
315 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
316 auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
317
318 commitTransaction(layer.get());
319 bool computeVisisbleRegions;
320 layer->updateTexImage(computeVisisbleRegions, 15, 0);
321
322 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
323 // pendingJankClassifications.
324 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
325 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
326 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
327 layer->releasePendingBuffer(25);
328
329 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
330 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000331
332 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
333 sp<BufferStateLayer> layer = createBufferStateLayer();
334
335 sp<Fence> fence1(new Fence());
336 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000337 const auto buffer1 = std::make_shared<
338 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
339 1, 0),
340 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000341 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800342 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000343 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
344 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
345 const auto droppedSurfaceFrame1 = layer->mCurrentState.bufferSurfaceFrameTX;
346
347 sp<Fence> fence2(new Fence());
348 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000349 const auto buffer2 = std::make_shared<
350 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
351 1, 0),
352 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000353 auto dropStartTime1 = systemTime();
354 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800355 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
356 nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000357 auto dropEndTime1 = systemTime();
358 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
359 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
360 const auto droppedSurfaceFrame2 = layer->mCurrentState.bufferSurfaceFrameTX;
361
362 sp<Fence> fence3(new Fence());
363 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Alec Mouria90a5702021-04-16 16:36:21 +0000364 const auto buffer3 = std::make_shared<
365 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
366 1, 0),
367 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000368 auto dropStartTime2 = systemTime();
369 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800370 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000371 auto dropEndTime2 = systemTime();
372 acquireFence3->signalForTest(12);
373
374 EXPECT_EQ(0u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
375 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
376 const auto& presentedSurfaceFrame = layer->mCurrentState.bufferSurfaceFrameTX;
377
378 commitTransaction(layer.get());
379 bool computeVisisbleRegions;
380 layer->updateTexImage(computeVisisbleRegions, 15, 0);
381
382 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000383 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000384 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
385 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
386 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
387 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
388
389 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000390 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000391 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
392 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
393 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
394 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
395
396 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000397 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000398 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
399 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000400
401 void MultipleCommitsBeforeLatch() {
402 sp<BufferStateLayer> layer = createBufferStateLayer();
403 uint32_t surfaceFramesPendingClassification = 0;
404 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
405 for (int i = 0; i < 10; i += 2) {
406 sp<Fence> fence1(new Fence());
Alec Mouria90a5702021-04-16 16:36:21 +0000407 const auto buffer1 = std::make_shared<
408 renderengine::ExternalTexture>(new GraphicBuffer(1, 1,
409 HAL_PIXEL_FORMAT_RGBA_8888, 1,
410 0),
411 mRenderEngine, false);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000412 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800413 {/*vsyncId*/ 1, /*inputEventId*/ 0},
414 nullptr /* releaseBufferCallback */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000415 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
416 /*inputEventId*/ 0},
417 10);
418 ASSERT_NE(nullptr, layer->mCurrentState.bufferSurfaceFrameTX);
419 EXPECT_EQ(1u, layer->mCurrentState.bufferlessSurfaceFramesTX.size());
420 auto& bufferlessSurfaceFrame =
421 layer->mCurrentState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
422 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
423
424 commitTransaction(layer.get());
425 surfaceFramesPendingClassification += 2;
426 EXPECT_EQ(surfaceFramesPendingClassification,
427 layer->mPendingJankClassifications.size());
428 }
429
430 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
431 bool computeVisisbleRegions;
432 layer->updateTexImage(computeVisisbleRegions, 15, 0);
433 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
434 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
435 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
436 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
437 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
438 }
439 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
440 /*displayDeadlineDelta*/ 0,
441 /*displayPresentDelta*/ 0);
442
443 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
444 ASSERT_EQ(10u, surfaceFramesPendingClassification);
445 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
446
447 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
448 // bufferlessSurfaceFrame presented
449 for (uint32_t i = 0; i < 8; i += 2) {
450 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
451 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
452 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
453 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
454 }
455 {
456 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
457 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
458 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
459 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
460 }
461
462 layer->releasePendingBuffer(25);
463
464 // There shouldn't be any pending classifications. Everything should have been cleared.
465 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
466 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000467};
468
469TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
470 PresentedSurfaceFrameForBufferlessTransaction();
471}
472
473TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
474 PresentedSurfaceFrameForBufferTransaction();
475}
476
477TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
478 DroppedSurfaceFrameForBufferTransaction();
479}
480
481TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
482 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
483}
484
485TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
486 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
487}
488
489TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
490 MultipleSurfaceFramesPresentedTogether();
491}
492
Adithya Srinivasan95619432021-02-08 21:52:51 +0000493TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
494 PendingSurfaceFramesRemovedAfterClassification();
495}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000496
497TEST_F(TransactionSurfaceFrameTest,
498 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
499 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
500}
501
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000502TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
503 MultipleCommitsBeforeLatch();
504}
505
Robert Carr0758e5d2021-03-11 22:15:04 -0800506} // namespace android