blob: d5823c30898c3998a10d08774c8f2b44ef3ed6bc [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());
Ady Abrahamd11bade2022-08-01 16:18:03 -070063 return sp<BufferStateLayer>::make(args);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000064 }
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(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070077 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
78 mock::EventThread::kCallingUid,
79 ResyncCallback())));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000080
81 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
82 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070083 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
84 mock::EventThread::kCallingUid,
85 ResyncCallback())));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000086
87 auto vsyncController = std::make_unique<mock::VsyncController>();
88 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
89
90 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
91 EXPECT_CALL(*vsyncTracker, currentPeriod())
92 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
93 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
94 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
95 std::move(eventThread), std::move(sfEventThread));
96 }
97
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000098 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050099 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -0800100
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000101 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000102
103 void PresentedSurfaceFrameForBufferlessTransaction() {
104 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800105 FrameTimelineInfo ftInfo;
106 ftInfo.vsyncId = 1;
107 ftInfo.inputEventId = 0;
108 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700109 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
110 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
111 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000112 commitTransaction(layer.get());
113 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000114 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000115 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
116 }
117
118 void PresentedSurfaceFrameForBufferTransaction() {
119 sp<BufferStateLayer> layer = createBufferStateLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700120 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000121 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500122 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500123 bufferData.acquireFence = fence;
124 bufferData.frameNumber = 1;
125 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
126 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800127 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
128 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
129 1ULL /* bufferId */,
130 HAL_PIXEL_FORMAT_RGBA_8888,
131 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800132 FrameTimelineInfo ftInfo;
133 ftInfo.vsyncId = 1;
134 ftInfo.inputEventId = 0;
135 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000136 acquireFence->signalForTest(12);
137
138 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700139 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
140 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
141 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000142 // Buffers are presented only at latch time.
143 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
144
Vishnu Nair397a0e32022-07-26 00:01:48 +0000145 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000146
147 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000148 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000149 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
150 }
151
152 void DroppedSurfaceFrameForBufferTransaction() {
153 sp<BufferStateLayer> layer = createBufferStateLayer();
154
Ady Abrahamd11bade2022-08-01 16:18:03 -0700155 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000156 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500157 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500158 bufferData.acquireFence = fence1;
159 bufferData.frameNumber = 1;
160 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
161 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800162 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
163 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
164 1ULL /* bufferId */,
165 HAL_PIXEL_FORMAT_RGBA_8888,
166 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800167 FrameTimelineInfo ftInfo;
168 ftInfo.vsyncId = 1;
169 ftInfo.inputEventId = 0;
170 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700171 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
172 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
173 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000174
Ady Abrahamd11bade2022-08-01 16:18:03 -0700175 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000176 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000177 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500178 bufferData.acquireFence = fence2;
179 bufferData.frameNumber = 1;
180 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
181 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800182 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
183 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
184 2ULL /* bufferId */,
185 HAL_PIXEL_FORMAT_RGBA_8888,
186 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800187 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000188 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000189 acquireFence2->signalForTest(12);
190
Robert Carr6a160312021-05-17 12:08:20 -0700191 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
192 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
193 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000194
195 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000196 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000197
198 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000199 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000200 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000201 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
202 auto dropTime = droppedSurfaceFrame->getDropTime();
203 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000204
205 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000206 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000207 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
208 }
209
210 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
211 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800212 FrameTimelineInfo ftInfo;
213 ftInfo.vsyncId = 1;
214 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000215
Huihong Luo3bdef862022-03-03 11:57:19 -0800216 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000217
Robert Carr6a160312021-05-17 12:08:20 -0700218 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
219 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000220
Ady Abrahamd11bade2022-08-01 16:18:03 -0700221 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000222 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500223 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500224 bufferData.acquireFence = fence;
225 bufferData.frameNumber = 1;
226 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
227 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800228 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
229 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
230 1ULL /* bufferId */,
231 HAL_PIXEL_FORMAT_RGBA_8888,
232 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800233 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000234 acquireFence->signalForTest(12);
235
Robert Carr6a160312021-05-17 12:08:20 -0700236 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
237 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
238 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000239
240 commitTransaction(layer.get());
241 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000242 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000243 // Buffers are presented only at latch time.
244 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
245
Vishnu Nair397a0e32022-07-26 00:01:48 +0000246 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000247
248 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
249 }
250
251 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
252 sp<BufferStateLayer> layer = createBufferStateLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700253 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000254 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500255 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500256 bufferData.acquireFence = fence;
257 bufferData.frameNumber = 1;
258 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
259 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800260 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
261 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
262 1ULL /* bufferId */,
263 HAL_PIXEL_FORMAT_RGBA_8888,
264 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800265 FrameTimelineInfo ftInfo;
266 ftInfo.vsyncId = 1;
267 ftInfo.inputEventId = 0;
268 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700269 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
270 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000271
Huihong Luo3bdef862022-03-03 11:57:19 -0800272 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700273 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
274 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000275 }
276
277 void MultipleSurfaceFramesPresentedTogether() {
278 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800279 FrameTimelineInfo ftInfo;
280 ftInfo.vsyncId = 1;
281 ftInfo.inputEventId = 0;
282 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700283 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
284 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000285 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700286 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000287
Huihong Luo3bdef862022-03-03 11:57:19 -0800288 FrameTimelineInfo ftInfo2;
289 ftInfo2.vsyncId = 4;
290 ftInfo2.inputEventId = 0;
291 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700292 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
293 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
294 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000295
Ady Abrahamd11bade2022-08-01 16:18:03 -0700296 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000297 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500298 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500299 bufferData.acquireFence = fence;
300 bufferData.frameNumber = 1;
301 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
302 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800303 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
304 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
305 1ULL /* bufferId */,
306 HAL_PIXEL_FORMAT_RGBA_8888,
307 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800308 FrameTimelineInfo ftInfo3;
309 ftInfo3.vsyncId = 3;
310 ftInfo3.inputEventId = 0;
311 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700312 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
313 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
314 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000315
316 acquireFence->signalForTest(12);
317
318 commitTransaction(layer.get());
319
320 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000321 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000322 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
323
324 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000325 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000326 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
327
328 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000329 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000330 // Buffers are presented only at latch time.
331 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
332
Vishnu Nair397a0e32022-07-26 00:01:48 +0000333 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000334
335 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
336 }
337
Adithya Srinivasan95619432021-02-08 21:52:51 +0000338 void PendingSurfaceFramesRemovedAfterClassification() {
339 sp<BufferStateLayer> layer = createBufferStateLayer();
340
Ady Abrahamd11bade2022-08-01 16:18:03 -0700341 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000342 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500343 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500344 bufferData.acquireFence = fence1;
345 bufferData.frameNumber = 1;
346 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
347 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800348 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
349 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
350 1ULL /* bufferId */,
351 HAL_PIXEL_FORMAT_RGBA_8888,
352 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800353 FrameTimelineInfo ftInfo;
354 ftInfo.vsyncId = 1;
355 ftInfo.inputEventId = 0;
356 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700357 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
358 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000359
Ady Abrahamd11bade2022-08-01 16:18:03 -0700360 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000361 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500362 bufferData.acquireFence = fence2;
363 bufferData.frameNumber = 1;
364 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
365 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800366 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
367 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
368 1ULL /* bufferId */,
369 HAL_PIXEL_FORMAT_RGBA_8888,
370 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800371 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000372 acquireFence2->signalForTest(12);
373
Robert Carr6a160312021-05-17 12:08:20 -0700374 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
375 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000376
377 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000378 layer->updateTexImage(15);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000379
380 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
381 // pendingJankClassifications.
382 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700383 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000384 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
385 layer->releasePendingBuffer(25);
386
387 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
388 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000389
390 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
391 sp<BufferStateLayer> layer = createBufferStateLayer();
392
Ady Abrahamd11bade2022-08-01 16:18:03 -0700393 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000394 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500395 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500396 bufferData.acquireFence = fence1;
397 bufferData.frameNumber = 1;
398 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
399 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800400 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
401 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
402 1ULL /* bufferId */,
403 HAL_PIXEL_FORMAT_RGBA_8888,
404 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800405 FrameTimelineInfo ftInfo;
406 ftInfo.vsyncId = 1;
407 ftInfo.inputEventId = 0;
408 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700409 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
410 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
411 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000412
Ady Abrahamd11bade2022-08-01 16:18:03 -0700413 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000414 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000415 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500416 bufferData.acquireFence = fence2;
417 bufferData.frameNumber = 1;
418 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
419 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800420 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
421 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
422 1ULL /* bufferId */,
423 HAL_PIXEL_FORMAT_RGBA_8888,
424 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800425 FrameTimelineInfo ftInfoInv;
426 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
427 ftInfoInv.inputEventId = 0;
428 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000429 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700430 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
431 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
432 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000433
Ady Abrahamd11bade2022-08-01 16:18:03 -0700434 sp<Fence> fence3(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000435 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000436 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500437 bufferData.acquireFence = fence3;
438 bufferData.frameNumber = 1;
439 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
440 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800441 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
442 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
443 1ULL /* bufferId */,
444 HAL_PIXEL_FORMAT_RGBA_8888,
445 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800446 FrameTimelineInfo ftInfo2;
447 ftInfo2.vsyncId = 2;
448 ftInfo2.inputEventId = 0;
449 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000450 auto dropEndTime2 = systemTime();
451 acquireFence3->signalForTest(12);
452
Robert Carr6a160312021-05-17 12:08:20 -0700453 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
454 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
455 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000456
457 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000458 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000459
460 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000461 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000462 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
463 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
464 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
465 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
466
467 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000468 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000469 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
470 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
471 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
472 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
473
474 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000475 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000476 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
477 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000478
479 void MultipleCommitsBeforeLatch() {
480 sp<BufferStateLayer> layer = createBufferStateLayer();
481 uint32_t surfaceFramesPendingClassification = 0;
482 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
483 for (int i = 0; i < 10; i += 2) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700484 sp<Fence> fence(sp<Fence>::make());
chaviwba4320c2021-09-15 15:20:53 -0500485 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500486 bufferData.acquireFence = fence;
487 bufferData.frameNumber = 1;
488 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
489 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800490 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
491 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
492 1ULL /* bufferId */,
493 HAL_PIXEL_FORMAT_RGBA_8888,
494 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800495 FrameTimelineInfo ftInfo;
496 ftInfo.vsyncId = 1;
497 ftInfo.inputEventId = 0;
498 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
499 FrameTimelineInfo ftInfo2;
500 ftInfo2.vsyncId = 2;
501 ftInfo2.inputEventId = 0;
502 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700503 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
504 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000505 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700506 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000507 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
508
509 commitTransaction(layer.get());
510 surfaceFramesPendingClassification += 2;
511 EXPECT_EQ(surfaceFramesPendingClassification,
512 layer->mPendingJankClassifications.size());
513 }
514
515 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000516 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000517 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
518 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
519 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700520 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000521 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
522 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700523 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000524 /*displayDeadlineDelta*/ 0,
525 /*displayPresentDelta*/ 0);
526
527 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
528 ASSERT_EQ(10u, surfaceFramesPendingClassification);
529 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
530
531 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
532 // bufferlessSurfaceFrame presented
533 for (uint32_t i = 0; i < 8; i += 2) {
534 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
535 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
536 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
537 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
538 }
539 {
540 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
541 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
542 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
543 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
544 }
545
546 layer->releasePendingBuffer(25);
547
548 // There shouldn't be any pending classifications. Everything should have been cleared.
549 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
550 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000551};
552
553TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
554 PresentedSurfaceFrameForBufferlessTransaction();
555}
556
557TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
558 PresentedSurfaceFrameForBufferTransaction();
559}
560
561TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
562 DroppedSurfaceFrameForBufferTransaction();
563}
564
565TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
566 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
567}
568
569TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
570 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
571}
572
573TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
574 MultipleSurfaceFramesPresentedTogether();
575}
576
Adithya Srinivasan95619432021-02-08 21:52:51 +0000577TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
578 PendingSurfaceFramesRemovedAfterClassification();
579}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000580
581TEST_F(TransactionSurfaceFrameTest,
582 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
583 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
584}
585
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000586TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
587 MultipleCommitsBeforeLatch();
588}
589
Robert Carr0758e5d2021-03-11 22:15:04 -0800590} // namespace android