blob: 5bb4c92a8ec0712786968855577c26a0268722b1 [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>
Vishnu Nairdbbe3852022-01-12 20:22:11 -080025#include <renderengine/mock/FakeExternalTexture.h>
Alec Mouria90a5702021-04-16 16:36:21 +000026#include <renderengine/mock/RenderEngine.h>
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000027#include <utils/String8.h>
28
29#include "TestableSurfaceFlinger.h"
30#include "mock/DisplayHardware/MockComposer.h"
31#include "mock/MockEventThread.h"
32#include "mock/MockVsyncController.h"
33
34namespace android {
35
36using testing::_;
37using testing::Mock;
38using testing::Return;
39using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
40using PresentState = frametimeline::SurfaceFrame::PresentState;
41
42class TransactionSurfaceFrameTest : public testing::Test {
43public:
44 TransactionSurfaceFrameTest() {
45 const ::testing::TestInfo* const test_info =
46 ::testing::UnitTest::GetInstance()->current_test_info();
47 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
48 setupScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080049 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
chaviwba4320c2021-09-15 15:20:53 -050050 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000051 }
52
53 ~TransactionSurfaceFrameTest() {
54 const ::testing::TestInfo* const test_info =
55 ::testing::UnitTest::GetInstance()->current_test_info();
56 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
57 }
58
59 sp<BufferStateLayer> createBufferStateLayer() {
60 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080061 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 0,
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000062 LayerMetadata());
63 return new BufferStateLayer(args);
64 }
65
66 void commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -070067 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080068 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000069 }
70
71 void setupScheduler() {
72 auto eventThread = std::make_unique<mock::EventThread>();
73 auto sfEventThread = std::make_unique<mock::EventThread>();
74
75 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
76 EXPECT_CALL(*eventThread, createEventConnection(_, _))
77 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
78 ResyncCallback())));
79
80 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
81 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
82 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
83 ResyncCallback())));
84
85 auto vsyncController = std::make_unique<mock::VsyncController>();
86 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
87
88 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
89 EXPECT_CALL(*vsyncTracker, currentPeriod())
90 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
91 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
92 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
93 std::move(eventThread), std::move(sfEventThread));
94 }
95
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000096 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050097 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -080098
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000099 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000100
101 void PresentedSurfaceFrameForBufferlessTransaction() {
102 sp<BufferStateLayer> layer = createBufferStateLayer();
103 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
104 10);
Robert Carr6a160312021-05-17 12:08:20 -0700105 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
106 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
107 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000108 commitTransaction(layer.get());
109 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000110 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000111 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
112 }
113
114 void PresentedSurfaceFrameForBufferTransaction() {
115 sp<BufferStateLayer> layer = createBufferStateLayer();
116 sp<Fence> fence(new Fence());
117 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500118 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500119 bufferData.acquireFence = fence;
120 bufferData.frameNumber = 1;
121 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
122 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800123 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
124 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
125 1ULL /* bufferId */,
126 HAL_PIXEL_FORMAT_RGBA_8888,
127 0ULL /*usage*/);
128 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500129 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000130 acquireFence->signalForTest(12);
131
132 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700133 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
134 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
135 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000136 // Buffers are presented only at latch time.
137 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
138
139 bool computeVisisbleRegions;
140 layer->updateTexImage(computeVisisbleRegions, 15, 0);
141
142 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000143 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000144 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
145 }
146
147 void DroppedSurfaceFrameForBufferTransaction() {
148 sp<BufferStateLayer> layer = createBufferStateLayer();
149
150 sp<Fence> fence1(new Fence());
151 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500152 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500153 bufferData.acquireFence = fence1;
154 bufferData.frameNumber = 1;
155 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
156 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800157 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
158 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
159 1ULL /* bufferId */,
160 HAL_PIXEL_FORMAT_RGBA_8888,
161 0ULL /*usage*/);
162 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500163 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700164 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
165 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
166 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000167
168 sp<Fence> fence2(new Fence());
169 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000170 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500171 bufferData.acquireFence = fence2;
172 bufferData.frameNumber = 1;
173 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
174 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800175 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
176 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
177 2ULL /* bufferId */,
178 HAL_PIXEL_FORMAT_RGBA_8888,
179 0ULL /*usage*/);
180 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500181 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000182 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000183 acquireFence2->signalForTest(12);
184
Robert Carr6a160312021-05-17 12:08:20 -0700185 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
186 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
187 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000188
189 commitTransaction(layer.get());
190 bool computeVisisbleRegions;
191 layer->updateTexImage(computeVisisbleRegions, 15, 0);
192
193 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000194 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000195 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000196 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
197 auto dropTime = droppedSurfaceFrame->getDropTime();
198 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000199
200 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000201 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000202 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
203 }
204
205 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
206 sp<BufferStateLayer> layer = createBufferStateLayer();
207
208 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
209 10);
210
Robert Carr6a160312021-05-17 12:08:20 -0700211 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
212 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000213
214 sp<Fence> fence(new Fence());
215 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500216 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500217 bufferData.acquireFence = fence;
218 bufferData.frameNumber = 1;
219 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
220 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800221 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
222 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
223 1ULL /* bufferId */,
224 HAL_PIXEL_FORMAT_RGBA_8888,
225 0ULL /*usage*/);
226 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500227 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000228 acquireFence->signalForTest(12);
229
Robert Carr6a160312021-05-17 12:08:20 -0700230 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
231 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
232 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000233
234 commitTransaction(layer.get());
235 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000236 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000237 // Buffers are presented only at latch time.
238 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
239
240 bool computeVisisbleRegions;
241 layer->updateTexImage(computeVisisbleRegions, 15, 0);
242
243 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
244 }
245
246 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
247 sp<BufferStateLayer> layer = createBufferStateLayer();
248 sp<Fence> fence(new Fence());
249 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500250 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500251 bufferData.acquireFence = fence;
252 bufferData.frameNumber = 1;
253 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
254 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800255 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
256 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
257 1ULL /* bufferId */,
258 HAL_PIXEL_FORMAT_RGBA_8888,
259 0ULL /*usage*/);
260 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500261 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700262 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
263 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000264
265 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
266 10);
Robert Carr6a160312021-05-17 12:08:20 -0700267 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
268 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000269 }
270
271 void MultipleSurfaceFramesPresentedTogether() {
272 sp<BufferStateLayer> layer = createBufferStateLayer();
273 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
274 10);
Robert Carr6a160312021-05-17 12:08:20 -0700275 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
276 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000277 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700278 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000279
280 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
281 10);
Robert Carr6a160312021-05-17 12:08:20 -0700282 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
283 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
284 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000285
286 sp<Fence> fence(new Fence());
287 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500288 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500289 bufferData.acquireFence = fence;
290 bufferData.frameNumber = 1;
291 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
292 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800293 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
294 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
295 1ULL /* bufferId */,
296 HAL_PIXEL_FORMAT_RGBA_8888,
297 0ULL /*usage*/);
298 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500299 {/*vsyncId*/ 3, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700300 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
301 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
302 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000303
304 acquireFence->signalForTest(12);
305
306 commitTransaction(layer.get());
307
308 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000309 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000310 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
311
312 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000313 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000314 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
315
316 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000317 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000318 // Buffers are presented only at latch time.
319 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
320
321 bool computeVisisbleRegions;
322 layer->updateTexImage(computeVisisbleRegions, 15, 0);
323
324 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
325 }
326
Adithya Srinivasan95619432021-02-08 21:52:51 +0000327 void PendingSurfaceFramesRemovedAfterClassification() {
328 sp<BufferStateLayer> layer = createBufferStateLayer();
329
330 sp<Fence> fence1(new Fence());
331 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500332 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500333 bufferData.acquireFence = fence1;
334 bufferData.frameNumber = 1;
335 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
336 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800337 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
338 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
339 1ULL /* bufferId */,
340 HAL_PIXEL_FORMAT_RGBA_8888,
341 0ULL /*usage*/);
342 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500343 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700344 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
345 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000346
347 sp<Fence> fence2(new Fence());
348 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500349 bufferData.acquireFence = fence2;
350 bufferData.frameNumber = 1;
351 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
352 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800353 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
354 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
355 1ULL /* bufferId */,
356 HAL_PIXEL_FORMAT_RGBA_8888,
357 0ULL /*usage*/);
358 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500359 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasan95619432021-02-08 21:52:51 +0000360 acquireFence2->signalForTest(12);
361
Robert Carr6a160312021-05-17 12:08:20 -0700362 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
363 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000364
365 commitTransaction(layer.get());
366 bool computeVisisbleRegions;
367 layer->updateTexImage(computeVisisbleRegions, 15, 0);
368
369 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
370 // pendingJankClassifications.
371 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700372 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000373 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
374 layer->releasePendingBuffer(25);
375
376 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
377 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000378
379 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
380 sp<BufferStateLayer> layer = createBufferStateLayer();
381
382 sp<Fence> fence1(new Fence());
383 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500384 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500385 bufferData.acquireFence = fence1;
386 bufferData.frameNumber = 1;
387 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
388 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800389 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
390 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
391 1ULL /* bufferId */,
392 HAL_PIXEL_FORMAT_RGBA_8888,
393 0ULL /*usage*/);
394 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500395 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Robert Carr6a160312021-05-17 12:08:20 -0700396 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
397 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
398 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000399
400 sp<Fence> fence2(new Fence());
401 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000402 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500403 bufferData.acquireFence = fence2;
404 bufferData.frameNumber = 1;
405 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
406 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800407 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
408 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
409 1ULL /* bufferId */,
410 HAL_PIXEL_FORMAT_RGBA_8888,
411 0ULL /*usage*/);
412 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500413 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0});
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000414 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700415 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
416 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
417 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000418
419 sp<Fence> fence3(new Fence());
420 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000421 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500422 bufferData.acquireFence = fence3;
423 bufferData.frameNumber = 1;
424 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
425 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800426 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
427 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
428 1ULL /* bufferId */,
429 HAL_PIXEL_FORMAT_RGBA_8888,
430 0ULL /*usage*/);
431 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500432 {/*vsyncId*/ 2, /*inputEventId*/ 0});
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000433 auto dropEndTime2 = systemTime();
434 acquireFence3->signalForTest(12);
435
Robert Carr6a160312021-05-17 12:08:20 -0700436 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
437 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
438 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000439
440 commitTransaction(layer.get());
441 bool computeVisisbleRegions;
442 layer->updateTexImage(computeVisisbleRegions, 15, 0);
443
444 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000445 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000446 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
447 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
448 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
449 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
450
451 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000452 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000453 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
454 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
455 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
456 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
457
458 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000459 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000460 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
461 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000462
463 void MultipleCommitsBeforeLatch() {
464 sp<BufferStateLayer> layer = createBufferStateLayer();
465 uint32_t surfaceFramesPendingClassification = 0;
466 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
467 for (int i = 0; i < 10; i += 2) {
chaviwba4320c2021-09-15 15:20:53 -0500468 sp<Fence> fence(new Fence());
chaviwba4320c2021-09-15 15:20:53 -0500469 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500470 bufferData.acquireFence = fence;
471 bufferData.frameNumber = 1;
472 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
473 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800474 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
475 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
476 1ULL /* bufferId */,
477 HAL_PIXEL_FORMAT_RGBA_8888,
478 0ULL /*usage*/);
479 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt,
chaviwba4320c2021-09-15 15:20:53 -0500480 {/*vsyncId*/ 1, /*inputEventId*/ 0});
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000481 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
482 /*inputEventId*/ 0},
483 10);
Robert Carr6a160312021-05-17 12:08:20 -0700484 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
485 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000486 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700487 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000488 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
489
490 commitTransaction(layer.get());
491 surfaceFramesPendingClassification += 2;
492 EXPECT_EQ(surfaceFramesPendingClassification,
493 layer->mPendingJankClassifications.size());
494 }
495
496 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
497 bool computeVisisbleRegions;
498 layer->updateTexImage(computeVisisbleRegions, 15, 0);
499 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
500 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
501 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700502 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000503 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
504 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700505 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000506 /*displayDeadlineDelta*/ 0,
507 /*displayPresentDelta*/ 0);
508
509 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
510 ASSERT_EQ(10u, surfaceFramesPendingClassification);
511 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
512
513 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
514 // bufferlessSurfaceFrame presented
515 for (uint32_t i = 0; i < 8; i += 2) {
516 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
517 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
518 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
519 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
520 }
521 {
522 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
523 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
524 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
525 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
526 }
527
528 layer->releasePendingBuffer(25);
529
530 // There shouldn't be any pending classifications. Everything should have been cleared.
531 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
532 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000533};
534
535TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
536 PresentedSurfaceFrameForBufferlessTransaction();
537}
538
539TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
540 PresentedSurfaceFrameForBufferTransaction();
541}
542
543TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
544 DroppedSurfaceFrameForBufferTransaction();
545}
546
547TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
548 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
549}
550
551TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
552 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
553}
554
555TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
556 MultipleSurfaceFramesPresentedTogether();
557}
558
Adithya Srinivasan95619432021-02-08 21:52:51 +0000559TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
560 PendingSurfaceFramesRemovedAfterClassification();
561}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000562
563TEST_F(TransactionSurfaceFrameTest,
564 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
565 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
566}
567
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000568TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
569 MultipleCommitsBeforeLatch();
570}
571
Robert Carr0758e5d2021-03-11 22:15:04 -0800572} // namespace android