blob: e943644834f99b082cf853e531c6e88d7aeb90be [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();
Huihong Luo3bdef862022-03-03 11:57:19 -0800103 FrameTimelineInfo ftInfo;
104 ftInfo.vsyncId = 1;
105 ftInfo.inputEventId = 0;
106 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700107 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
108 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
109 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000110 commitTransaction(layer.get());
111 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000112 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000113 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
114 }
115
116 void PresentedSurfaceFrameForBufferTransaction() {
117 sp<BufferStateLayer> layer = createBufferStateLayer();
118 sp<Fence> fence(new Fence());
119 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500120 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500121 bufferData.acquireFence = fence;
122 bufferData.frameNumber = 1;
123 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
124 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800125 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
126 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
127 1ULL /* bufferId */,
128 HAL_PIXEL_FORMAT_RGBA_8888,
129 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800130 FrameTimelineInfo ftInfo;
131 ftInfo.vsyncId = 1;
132 ftInfo.inputEventId = 0;
133 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000134 acquireFence->signalForTest(12);
135
136 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700137 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
138 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
139 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000140 // Buffers are presented only at latch time.
141 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
142
Vishnu Nair397a0e32022-07-26 00:01:48 +0000143 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000144
145 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000146 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000147 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
148 }
149
150 void DroppedSurfaceFrameForBufferTransaction() {
151 sp<BufferStateLayer> layer = createBufferStateLayer();
152
153 sp<Fence> fence1(new Fence());
154 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500155 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500156 bufferData.acquireFence = fence1;
157 bufferData.frameNumber = 1;
158 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
159 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800160 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
161 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
162 1ULL /* bufferId */,
163 HAL_PIXEL_FORMAT_RGBA_8888,
164 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800165 FrameTimelineInfo ftInfo;
166 ftInfo.vsyncId = 1;
167 ftInfo.inputEventId = 0;
168 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700169 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
170 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
171 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000172
173 sp<Fence> fence2(new Fence());
174 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000175 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500176 bufferData.acquireFence = fence2;
177 bufferData.frameNumber = 1;
178 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
179 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800180 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
181 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
182 2ULL /* bufferId */,
183 HAL_PIXEL_FORMAT_RGBA_8888,
184 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800185 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000186 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000187 acquireFence2->signalForTest(12);
188
Robert Carr6a160312021-05-17 12:08:20 -0700189 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
190 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
191 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000192
193 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000194 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000195
196 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000197 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000198 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000199 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
200 auto dropTime = droppedSurfaceFrame->getDropTime();
201 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000202
203 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000204 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000205 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
206 }
207
208 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
209 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800210 FrameTimelineInfo ftInfo;
211 ftInfo.vsyncId = 1;
212 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000213
Huihong Luo3bdef862022-03-03 11:57:19 -0800214 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000215
Robert Carr6a160312021-05-17 12:08:20 -0700216 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
217 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000218
219 sp<Fence> fence(new Fence());
220 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500221 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500222 bufferData.acquireFence = fence;
223 bufferData.frameNumber = 1;
224 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
225 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800226 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
227 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
228 1ULL /* bufferId */,
229 HAL_PIXEL_FORMAT_RGBA_8888,
230 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800231 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000232 acquireFence->signalForTest(12);
233
Robert Carr6a160312021-05-17 12:08:20 -0700234 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
235 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
236 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000237
238 commitTransaction(layer.get());
239 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000240 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000241 // Buffers are presented only at latch time.
242 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
243
Vishnu Nair397a0e32022-07-26 00:01:48 +0000244 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000245
246 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
247 }
248
249 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
250 sp<BufferStateLayer> layer = createBufferStateLayer();
251 sp<Fence> fence(new Fence());
252 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500253 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500254 bufferData.acquireFence = fence;
255 bufferData.frameNumber = 1;
256 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
257 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800258 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
259 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
260 1ULL /* bufferId */,
261 HAL_PIXEL_FORMAT_RGBA_8888,
262 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800263 FrameTimelineInfo ftInfo;
264 ftInfo.vsyncId = 1;
265 ftInfo.inputEventId = 0;
266 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
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
Huihong Luo3bdef862022-03-03 11:57:19 -0800270 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700271 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
272 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000273 }
274
275 void MultipleSurfaceFramesPresentedTogether() {
276 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800277 FrameTimelineInfo ftInfo;
278 ftInfo.vsyncId = 1;
279 ftInfo.inputEventId = 0;
280 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700281 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
282 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000283 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700284 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000285
Huihong Luo3bdef862022-03-03 11:57:19 -0800286 FrameTimelineInfo ftInfo2;
287 ftInfo2.vsyncId = 4;
288 ftInfo2.inputEventId = 0;
289 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700290 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
291 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
292 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000293
294 sp<Fence> fence(new Fence());
295 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500296 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500297 bufferData.acquireFence = fence;
298 bufferData.frameNumber = 1;
299 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
300 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800301 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
302 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
303 1ULL /* bufferId */,
304 HAL_PIXEL_FORMAT_RGBA_8888,
305 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800306 FrameTimelineInfo ftInfo3;
307 ftInfo3.vsyncId = 3;
308 ftInfo3.inputEventId = 0;
309 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700310 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
311 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
312 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000313
314 acquireFence->signalForTest(12);
315
316 commitTransaction(layer.get());
317
318 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000319 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000320 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
321
322 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000323 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000324 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
325
326 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000327 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000328 // Buffers are presented only at latch time.
329 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
330
Vishnu Nair397a0e32022-07-26 00:01:48 +0000331 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000332
333 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
334 }
335
Adithya Srinivasan95619432021-02-08 21:52:51 +0000336 void PendingSurfaceFramesRemovedAfterClassification() {
337 sp<BufferStateLayer> layer = createBufferStateLayer();
338
339 sp<Fence> fence1(new Fence());
340 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500341 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500342 bufferData.acquireFence = fence1;
343 bufferData.frameNumber = 1;
344 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
345 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800346 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
347 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
348 1ULL /* bufferId */,
349 HAL_PIXEL_FORMAT_RGBA_8888,
350 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800351 FrameTimelineInfo ftInfo;
352 ftInfo.vsyncId = 1;
353 ftInfo.inputEventId = 0;
354 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700355 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
356 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000357
358 sp<Fence> fence2(new Fence());
359 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500360 bufferData.acquireFence = fence2;
361 bufferData.frameNumber = 1;
362 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
363 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800364 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
365 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
366 1ULL /* bufferId */,
367 HAL_PIXEL_FORMAT_RGBA_8888,
368 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800369 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000370 acquireFence2->signalForTest(12);
371
Robert Carr6a160312021-05-17 12:08:20 -0700372 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
373 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000374
375 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000376 layer->updateTexImage(15);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000377
378 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
379 // pendingJankClassifications.
380 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700381 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000382 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
383 layer->releasePendingBuffer(25);
384
385 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
386 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000387
388 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
389 sp<BufferStateLayer> layer = createBufferStateLayer();
390
391 sp<Fence> fence1(new Fence());
392 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500393 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500394 bufferData.acquireFence = fence1;
395 bufferData.frameNumber = 1;
396 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
397 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800398 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
399 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
400 1ULL /* bufferId */,
401 HAL_PIXEL_FORMAT_RGBA_8888,
402 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800403 FrameTimelineInfo ftInfo;
404 ftInfo.vsyncId = 1;
405 ftInfo.inputEventId = 0;
406 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700407 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
408 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
409 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000410
411 sp<Fence> fence2(new Fence());
412 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000413 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500414 bufferData.acquireFence = fence2;
415 bufferData.frameNumber = 1;
416 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
417 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800418 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
419 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
420 1ULL /* bufferId */,
421 HAL_PIXEL_FORMAT_RGBA_8888,
422 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800423 FrameTimelineInfo ftInfoInv;
424 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
425 ftInfoInv.inputEventId = 0;
426 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000427 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700428 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
429 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
430 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000431
432 sp<Fence> fence3(new Fence());
433 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000434 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500435 bufferData.acquireFence = fence3;
436 bufferData.frameNumber = 1;
437 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
438 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800439 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
440 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
441 1ULL /* bufferId */,
442 HAL_PIXEL_FORMAT_RGBA_8888,
443 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800444 FrameTimelineInfo ftInfo2;
445 ftInfo2.vsyncId = 2;
446 ftInfo2.inputEventId = 0;
447 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000448 auto dropEndTime2 = systemTime();
449 acquireFence3->signalForTest(12);
450
Robert Carr6a160312021-05-17 12:08:20 -0700451 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
452 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
453 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000454
455 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000456 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000457
458 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000459 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000460 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
461 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
462 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
463 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
464
465 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000466 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000467 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
468 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
469 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
470 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
471
472 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000473 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000474 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
475 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000476
477 void MultipleCommitsBeforeLatch() {
478 sp<BufferStateLayer> layer = createBufferStateLayer();
479 uint32_t surfaceFramesPendingClassification = 0;
480 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
481 for (int i = 0; i < 10; i += 2) {
chaviwba4320c2021-09-15 15:20:53 -0500482 sp<Fence> fence(new Fence());
chaviwba4320c2021-09-15 15:20:53 -0500483 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500484 bufferData.acquireFence = fence;
485 bufferData.frameNumber = 1;
486 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
487 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800488 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
489 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
490 1ULL /* bufferId */,
491 HAL_PIXEL_FORMAT_RGBA_8888,
492 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800493 FrameTimelineInfo ftInfo;
494 ftInfo.vsyncId = 1;
495 ftInfo.inputEventId = 0;
496 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
497 FrameTimelineInfo ftInfo2;
498 ftInfo2.vsyncId = 2;
499 ftInfo2.inputEventId = 0;
500 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700501 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
502 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000503 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700504 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000505 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
506
507 commitTransaction(layer.get());
508 surfaceFramesPendingClassification += 2;
509 EXPECT_EQ(surfaceFramesPendingClassification,
510 layer->mPendingJankClassifications.size());
511 }
512
513 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000514 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000515 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
516 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
517 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700518 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000519 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
520 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700521 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000522 /*displayDeadlineDelta*/ 0,
523 /*displayPresentDelta*/ 0);
524
525 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
526 ASSERT_EQ(10u, surfaceFramesPendingClassification);
527 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
528
529 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
530 // bufferlessSurfaceFrame presented
531 for (uint32_t i = 0; i < 8; i += 2) {
532 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
533 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
534 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
535 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
536 }
537 {
538 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
539 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
540 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
541 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
542 }
543
544 layer->releasePendingBuffer(25);
545
546 // There shouldn't be any pending classifications. Everything should have been cleared.
547 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
548 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000549};
550
551TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
552 PresentedSurfaceFrameForBufferlessTransaction();
553}
554
555TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
556 PresentedSurfaceFrameForBufferTransaction();
557}
558
559TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
560 DroppedSurfaceFrameForBufferTransaction();
561}
562
563TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
564 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
565}
566
567TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
568 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
569}
570
571TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
572 MultipleSurfaceFramesPresentedTogether();
573}
574
Adithya Srinivasan95619432021-02-08 21:52:51 +0000575TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
576 PendingSurfaceFramesRemovedAfterClassification();
577}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000578
579TEST_F(TransactionSurfaceFrameTest,
580 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
581 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
582}
583
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000584TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
585 MultipleCommitsBeforeLatch();
586}
587
Robert Carr0758e5d2021-03-11 22:15:04 -0800588} // namespace android