blob: ae03db43a75385d0169fbd1a05388227fbf497e5 [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
Patrick Williams83f36b22022-09-14 17:57:35 +000059 sp<Layer> createLayer() {
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000060 sp<Client> client;
Patrick Williams83f36b22022-09-14 17:57:35 +000061 LayerCreationArgs args(mFlinger.flinger(), client, "layer", 0, LayerMetadata());
62 return sp<Layer>::make(args);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000063 }
64
65 void commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -070066 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080067 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000068 }
69
70 void setupScheduler() {
71 auto eventThread = std::make_unique<mock::EventThread>();
72 auto sfEventThread = std::make_unique<mock::EventThread>();
73
74 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
75 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070076 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
77 mock::EventThread::kCallingUid,
78 ResyncCallback())));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000079
80 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
81 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070082 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
83 mock::EventThread::kCallingUid,
84 ResyncCallback())));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000085
86 auto vsyncController = std::make_unique<mock::VsyncController>();
87 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
88
89 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
90 EXPECT_CALL(*vsyncTracker, currentPeriod())
91 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
92 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
93 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
94 std::move(eventThread), std::move(sfEventThread));
95 }
96
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000097 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050098 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -080099
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000100 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000101
102 void PresentedSurfaceFrameForBufferlessTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000103 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800104 FrameTimelineInfo ftInfo;
105 ftInfo.vsyncId = 1;
106 ftInfo.inputEventId = 0;
107 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700108 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
109 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
110 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000111 commitTransaction(layer.get());
112 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000113 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000114 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
115 }
116
117 void PresentedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000118 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700119 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000120 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500121 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500122 bufferData.acquireFence = fence;
123 bufferData.frameNumber = 1;
124 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
125 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800126 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
127 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
128 1ULL /* bufferId */,
129 HAL_PIXEL_FORMAT_RGBA_8888,
130 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800131 FrameTimelineInfo ftInfo;
132 ftInfo.vsyncId = 1;
133 ftInfo.inputEventId = 0;
134 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000135 acquireFence->signalForTest(12);
136
137 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700138 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
139 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
140 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000141 // Buffers are presented only at latch time.
142 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
143
Vishnu Nair397a0e32022-07-26 00:01:48 +0000144 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000145
146 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000147 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000148 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
149 }
150
151 void DroppedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000152 sp<Layer> layer = createLayer();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000153
Ady Abrahamd11bade2022-08-01 16:18:03 -0700154 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000155 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500156 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500157 bufferData.acquireFence = fence1;
158 bufferData.frameNumber = 1;
159 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
160 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800161 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
162 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
163 1ULL /* bufferId */,
164 HAL_PIXEL_FORMAT_RGBA_8888,
165 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800166 FrameTimelineInfo ftInfo;
167 ftInfo.vsyncId = 1;
168 ftInfo.inputEventId = 0;
169 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700170 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
171 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
172 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000173
Ady Abrahamd11bade2022-08-01 16:18:03 -0700174 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000175 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000176 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500177 bufferData.acquireFence = fence2;
178 bufferData.frameNumber = 1;
179 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
180 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800181 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
182 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
183 2ULL /* bufferId */,
184 HAL_PIXEL_FORMAT_RGBA_8888,
185 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800186 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000187 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000188 acquireFence2->signalForTest(12);
189
Robert Carr6a160312021-05-17 12:08:20 -0700190 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
191 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
192 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000193
194 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000195 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000196
197 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000198 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000199 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000200 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
201 auto dropTime = droppedSurfaceFrame->getDropTime();
202 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000203
204 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000205 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000206 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
207 }
208
209 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000210 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800211 FrameTimelineInfo ftInfo;
212 ftInfo.vsyncId = 1;
213 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000214
Huihong Luo3bdef862022-03-03 11:57:19 -0800215 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000216
Robert Carr6a160312021-05-17 12:08:20 -0700217 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
218 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000219
Ady Abrahamd11bade2022-08-01 16:18:03 -0700220 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000221 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500222 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500223 bufferData.acquireFence = fence;
224 bufferData.frameNumber = 1;
225 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
226 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800227 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
228 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
229 1ULL /* bufferId */,
230 HAL_PIXEL_FORMAT_RGBA_8888,
231 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800232 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000233 acquireFence->signalForTest(12);
234
Robert Carr6a160312021-05-17 12:08:20 -0700235 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
236 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
237 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000238
239 commitTransaction(layer.get());
240 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000241 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000242 // Buffers are presented only at latch time.
243 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
244
Vishnu Nair397a0e32022-07-26 00:01:48 +0000245 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000246
247 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
248 }
249
250 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000251 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700252 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000253 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500254 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500255 bufferData.acquireFence = fence;
256 bufferData.frameNumber = 1;
257 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
258 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800259 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
260 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
261 1ULL /* bufferId */,
262 HAL_PIXEL_FORMAT_RGBA_8888,
263 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800264 FrameTimelineInfo ftInfo;
265 ftInfo.vsyncId = 1;
266 ftInfo.inputEventId = 0;
267 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700268 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
269 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000270
Huihong Luo3bdef862022-03-03 11:57:19 -0800271 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700272 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
273 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000274 }
275
276 void MultipleSurfaceFramesPresentedTogether() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000277 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800278 FrameTimelineInfo ftInfo;
279 ftInfo.vsyncId = 1;
280 ftInfo.inputEventId = 0;
281 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700282 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
283 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000284 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700285 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000286
Huihong Luo3bdef862022-03-03 11:57:19 -0800287 FrameTimelineInfo ftInfo2;
288 ftInfo2.vsyncId = 4;
289 ftInfo2.inputEventId = 0;
290 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700291 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
292 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
293 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000294
Ady Abrahamd11bade2022-08-01 16:18:03 -0700295 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000296 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500297 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500298 bufferData.acquireFence = fence;
299 bufferData.frameNumber = 1;
300 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
301 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800302 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
303 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
304 1ULL /* bufferId */,
305 HAL_PIXEL_FORMAT_RGBA_8888,
306 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800307 FrameTimelineInfo ftInfo3;
308 ftInfo3.vsyncId = 3;
309 ftInfo3.inputEventId = 0;
310 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700311 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
312 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
313 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000314
315 acquireFence->signalForTest(12);
316
317 commitTransaction(layer.get());
318
319 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000320 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000321 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
322
323 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000324 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000325 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
326
327 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000328 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000329 // Buffers are presented only at latch time.
330 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
331
Vishnu Nair397a0e32022-07-26 00:01:48 +0000332 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000333
334 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
335 }
336
Adithya Srinivasan95619432021-02-08 21:52:51 +0000337 void PendingSurfaceFramesRemovedAfterClassification() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000338 sp<Layer> layer = createLayer();
Adithya Srinivasan95619432021-02-08 21:52:51 +0000339
Ady Abrahamd11bade2022-08-01 16:18:03 -0700340 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000341 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500342 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500343 bufferData.acquireFence = fence1;
344 bufferData.frameNumber = 1;
345 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
346 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800347 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
348 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
349 1ULL /* bufferId */,
350 HAL_PIXEL_FORMAT_RGBA_8888,
351 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800352 FrameTimelineInfo ftInfo;
353 ftInfo.vsyncId = 1;
354 ftInfo.inputEventId = 0;
355 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700356 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
357 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000358
Ady Abrahamd11bade2022-08-01 16:18:03 -0700359 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000360 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500361 bufferData.acquireFence = fence2;
362 bufferData.frameNumber = 1;
363 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
364 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800365 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
366 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
367 1ULL /* bufferId */,
368 HAL_PIXEL_FORMAT_RGBA_8888,
369 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800370 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000371 acquireFence2->signalForTest(12);
372
Robert Carr6a160312021-05-17 12:08:20 -0700373 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
374 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000375
376 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000377 layer->updateTexImage(15);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000378
379 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
380 // pendingJankClassifications.
381 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000383 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
384 layer->releasePendingBuffer(25);
385
386 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
387 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000388
389 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000390 sp<Layer> layer = createLayer();
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000391
Ady Abrahamd11bade2022-08-01 16:18:03 -0700392 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000393 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500394 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500395 bufferData.acquireFence = fence1;
396 bufferData.frameNumber = 1;
397 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
398 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800399 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
400 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
401 1ULL /* bufferId */,
402 HAL_PIXEL_FORMAT_RGBA_8888,
403 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800404 FrameTimelineInfo ftInfo;
405 ftInfo.vsyncId = 1;
406 ftInfo.inputEventId = 0;
407 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700408 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
409 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
410 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000411
Ady Abrahamd11bade2022-08-01 16:18:03 -0700412 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000413 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000414 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500415 bufferData.acquireFence = fence2;
416 bufferData.frameNumber = 1;
417 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
418 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800419 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
420 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
421 1ULL /* bufferId */,
422 HAL_PIXEL_FORMAT_RGBA_8888,
423 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800424 FrameTimelineInfo ftInfoInv;
425 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
426 ftInfoInv.inputEventId = 0;
427 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000428 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700429 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
430 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
431 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000432
Ady Abrahamd11bade2022-08-01 16:18:03 -0700433 sp<Fence> fence3(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000434 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000435 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500436 bufferData.acquireFence = fence3;
437 bufferData.frameNumber = 1;
438 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
439 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800440 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
441 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
442 1ULL /* bufferId */,
443 HAL_PIXEL_FORMAT_RGBA_8888,
444 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800445 FrameTimelineInfo ftInfo2;
446 ftInfo2.vsyncId = 2;
447 ftInfo2.inputEventId = 0;
448 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000449 auto dropEndTime2 = systemTime();
450 acquireFence3->signalForTest(12);
451
Robert Carr6a160312021-05-17 12:08:20 -0700452 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
453 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
454 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000455
456 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000457 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000458
459 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000460 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000461 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
462 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
463 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
464 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
465
466 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000467 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000468 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
469 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
470 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
471 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
472
473 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000474 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000475 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
476 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000477
478 void MultipleCommitsBeforeLatch() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000479 sp<Layer> layer = createLayer();
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000480 uint32_t surfaceFramesPendingClassification = 0;
481 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
482 for (int i = 0; i < 10; i += 2) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700483 sp<Fence> fence(sp<Fence>::make());
chaviwba4320c2021-09-15 15:20:53 -0500484 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500485 bufferData.acquireFence = fence;
486 bufferData.frameNumber = 1;
487 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
488 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800489 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
490 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
491 1ULL /* bufferId */,
492 HAL_PIXEL_FORMAT_RGBA_8888,
493 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800494 FrameTimelineInfo ftInfo;
495 ftInfo.vsyncId = 1;
496 ftInfo.inputEventId = 0;
497 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
498 FrameTimelineInfo ftInfo2;
499 ftInfo2.vsyncId = 2;
500 ftInfo2.inputEventId = 0;
501 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700502 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
503 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000504 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700505 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000506 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
507
508 commitTransaction(layer.get());
509 surfaceFramesPendingClassification += 2;
510 EXPECT_EQ(surfaceFramesPendingClassification,
511 layer->mPendingJankClassifications.size());
512 }
513
514 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000515 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000516 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
517 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
518 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700519 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000520 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
521 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700522 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000523 /*displayDeadlineDelta*/ 0,
524 /*displayPresentDelta*/ 0);
525
526 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
527 ASSERT_EQ(10u, surfaceFramesPendingClassification);
528 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
529
530 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
531 // bufferlessSurfaceFrame presented
532 for (uint32_t i = 0; i < 8; i += 2) {
533 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
534 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
535 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
536 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
537 }
538 {
539 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
540 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
541 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
542 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
543 }
544
545 layer->releasePendingBuffer(25);
546
547 // There shouldn't be any pending classifications. Everything should have been cleared.
548 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
549 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000550};
551
552TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
553 PresentedSurfaceFrameForBufferlessTransaction();
554}
555
556TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
557 PresentedSurfaceFrameForBufferTransaction();
558}
559
560TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
561 DroppedSurfaceFrameForBufferTransaction();
562}
563
564TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
565 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
566}
567
568TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
569 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
570}
571
572TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
573 MultipleSurfaceFramesPresentedTogether();
574}
575
Adithya Srinivasan95619432021-02-08 21:52:51 +0000576TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
577 PendingSurfaceFramesRemovedAfterClassification();
578}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000579
580TEST_F(TransactionSurfaceFrameTest,
581 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
582 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
583}
584
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000585TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
586 MultipleCommitsBeforeLatch();
587}
588
Robert Carr0758e5d2021-03-11 22:15:04 -0800589} // namespace android