blob: 6d583036fa496da029cb2d6e58d89480f4cab4fb [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
143 bool computeVisisbleRegions;
144 layer->updateTexImage(computeVisisbleRegions, 15, 0);
145
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() {
152 sp<BufferStateLayer> layer = createBufferStateLayer();
153
154 sp<Fence> fence1(new Fence());
155 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
174 sp<Fence> fence2(new Fence());
175 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());
195 bool computeVisisbleRegions;
196 layer->updateTexImage(computeVisisbleRegions, 15, 0);
197
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
221 sp<Fence> fence(new Fence());
222 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
246 bool computeVisisbleRegions;
247 layer->updateTexImage(computeVisisbleRegions, 15, 0);
248
249 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
250 }
251
252 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
253 sp<BufferStateLayer> layer = createBufferStateLayer();
254 sp<Fence> fence(new Fence());
255 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500256 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500257 bufferData.acquireFence = fence;
258 bufferData.frameNumber = 1;
259 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
260 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800261 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
262 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
263 1ULL /* bufferId */,
264 HAL_PIXEL_FORMAT_RGBA_8888,
265 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800266 FrameTimelineInfo ftInfo;
267 ftInfo.vsyncId = 1;
268 ftInfo.inputEventId = 0;
269 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700270 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
271 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000272
Huihong Luo3bdef862022-03-03 11:57:19 -0800273 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700274 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
275 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000276 }
277
278 void MultipleSurfaceFramesPresentedTogether() {
279 sp<BufferStateLayer> layer = createBufferStateLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800280 FrameTimelineInfo ftInfo;
281 ftInfo.vsyncId = 1;
282 ftInfo.inputEventId = 0;
283 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700284 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
285 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000286 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700287 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000288
Huihong Luo3bdef862022-03-03 11:57:19 -0800289 FrameTimelineInfo ftInfo2;
290 ftInfo2.vsyncId = 4;
291 ftInfo2.inputEventId = 0;
292 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700293 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
294 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
295 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000296
297 sp<Fence> fence(new Fence());
298 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500299 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500300 bufferData.acquireFence = fence;
301 bufferData.frameNumber = 1;
302 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
303 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800304 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
305 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
306 1ULL /* bufferId */,
307 HAL_PIXEL_FORMAT_RGBA_8888,
308 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800309 FrameTimelineInfo ftInfo3;
310 ftInfo3.vsyncId = 3;
311 ftInfo3.inputEventId = 0;
312 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700313 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
314 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
315 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000316
317 acquireFence->signalForTest(12);
318
319 commitTransaction(layer.get());
320
321 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000322 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000323 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
324
325 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000326 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000327 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
328
329 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000330 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000331 // Buffers are presented only at latch time.
332 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
333
334 bool computeVisisbleRegions;
335 layer->updateTexImage(computeVisisbleRegions, 15, 0);
336
337 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
338 }
339
Adithya Srinivasan95619432021-02-08 21:52:51 +0000340 void PendingSurfaceFramesRemovedAfterClassification() {
341 sp<BufferStateLayer> layer = createBufferStateLayer();
342
343 sp<Fence> fence1(new Fence());
344 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500345 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500346 bufferData.acquireFence = fence1;
347 bufferData.frameNumber = 1;
348 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
349 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800350 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
351 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
352 1ULL /* bufferId */,
353 HAL_PIXEL_FORMAT_RGBA_8888,
354 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800355 FrameTimelineInfo ftInfo;
356 ftInfo.vsyncId = 1;
357 ftInfo.inputEventId = 0;
358 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700359 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
360 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000361
362 sp<Fence> fence2(new Fence());
363 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500364 bufferData.acquireFence = fence2;
365 bufferData.frameNumber = 1;
366 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
367 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800368 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
369 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
370 1ULL /* bufferId */,
371 HAL_PIXEL_FORMAT_RGBA_8888,
372 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800373 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000374 acquireFence2->signalForTest(12);
375
Robert Carr6a160312021-05-17 12:08:20 -0700376 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
377 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000378
379 commitTransaction(layer.get());
380 bool computeVisisbleRegions;
381 layer->updateTexImage(computeVisisbleRegions, 15, 0);
382
383 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
384 // pendingJankClassifications.
385 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700386 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000387 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
388 layer->releasePendingBuffer(25);
389
390 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
391 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000392
393 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
394 sp<BufferStateLayer> layer = createBufferStateLayer();
395
396 sp<Fence> fence1(new Fence());
397 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500398 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500399 bufferData.acquireFence = fence1;
400 bufferData.frameNumber = 1;
401 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
402 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800403 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
404 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
405 1ULL /* bufferId */,
406 HAL_PIXEL_FORMAT_RGBA_8888,
407 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800408 FrameTimelineInfo ftInfo;
409 ftInfo.vsyncId = 1;
410 ftInfo.inputEventId = 0;
411 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700412 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
413 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
414 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000415
416 sp<Fence> fence2(new Fence());
417 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000418 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500419 bufferData.acquireFence = fence2;
420 bufferData.frameNumber = 1;
421 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
422 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800423 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
424 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
425 1ULL /* bufferId */,
426 HAL_PIXEL_FORMAT_RGBA_8888,
427 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800428 FrameTimelineInfo ftInfoInv;
429 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
430 ftInfoInv.inputEventId = 0;
431 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000432 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700433 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
434 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
435 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000436
437 sp<Fence> fence3(new Fence());
438 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000439 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500440 bufferData.acquireFence = fence3;
441 bufferData.frameNumber = 1;
442 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
443 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800444 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
445 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
446 1ULL /* bufferId */,
447 HAL_PIXEL_FORMAT_RGBA_8888,
448 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800449 FrameTimelineInfo ftInfo2;
450 ftInfo2.vsyncId = 2;
451 ftInfo2.inputEventId = 0;
452 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000453 auto dropEndTime2 = systemTime();
454 acquireFence3->signalForTest(12);
455
Robert Carr6a160312021-05-17 12:08:20 -0700456 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
457 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
458 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000459
460 commitTransaction(layer.get());
461 bool computeVisisbleRegions;
462 layer->updateTexImage(computeVisisbleRegions, 15, 0);
463
464 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000465 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000466 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
467 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
468 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
469 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
470
471 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000472 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000473 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
474 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
475 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
476 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
477
478 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000479 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000480 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
481 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000482
483 void MultipleCommitsBeforeLatch() {
484 sp<BufferStateLayer> layer = createBufferStateLayer();
485 uint32_t surfaceFramesPendingClassification = 0;
486 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
487 for (int i = 0; i < 10; i += 2) {
chaviwba4320c2021-09-15 15:20:53 -0500488 sp<Fence> fence(new Fence());
chaviwba4320c2021-09-15 15:20:53 -0500489 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500490 bufferData.acquireFence = fence;
491 bufferData.frameNumber = 1;
492 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
493 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800494 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
495 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
496 1ULL /* bufferId */,
497 HAL_PIXEL_FORMAT_RGBA_8888,
498 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800499 FrameTimelineInfo ftInfo;
500 ftInfo.vsyncId = 1;
501 ftInfo.inputEventId = 0;
502 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
503 FrameTimelineInfo ftInfo2;
504 ftInfo2.vsyncId = 2;
505 ftInfo2.inputEventId = 0;
506 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700507 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
508 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000509 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700510 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000511 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
512
513 commitTransaction(layer.get());
514 surfaceFramesPendingClassification += 2;
515 EXPECT_EQ(surfaceFramesPendingClassification,
516 layer->mPendingJankClassifications.size());
517 }
518
519 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
520 bool computeVisisbleRegions;
521 layer->updateTexImage(computeVisisbleRegions, 15, 0);
522 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
523 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
524 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700525 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000526 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
527 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700528 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000529 /*displayDeadlineDelta*/ 0,
530 /*displayPresentDelta*/ 0);
531
532 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
533 ASSERT_EQ(10u, surfaceFramesPendingClassification);
534 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
535
536 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
537 // bufferlessSurfaceFrame presented
538 for (uint32_t i = 0; i < 8; i += 2) {
539 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
540 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
541 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
542 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
543 }
544 {
545 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
546 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
547 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
548 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
549 }
550
551 layer->releasePendingBuffer(25);
552
553 // There shouldn't be any pending classifications. Everything should have been cleared.
554 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
555 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000556};
557
558TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
559 PresentedSurfaceFrameForBufferlessTransaction();
560}
561
562TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
563 PresentedSurfaceFrameForBufferTransaction();
564}
565
566TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
567 DroppedSurfaceFrameForBufferTransaction();
568}
569
570TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
571 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
572}
573
574TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
575 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
576}
577
578TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
579 MultipleSurfaceFramesPresentedTogether();
580}
581
Adithya Srinivasan95619432021-02-08 21:52:51 +0000582TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
583 PendingSurfaceFramesRemovedAfterClassification();
584}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000585
586TEST_F(TransactionSurfaceFrameTest,
587 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
588 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
589}
590
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000591TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
592 MultipleCommitsBeforeLatch();
593}
594
Robert Carr0758e5d2021-03-11 22:15:04 -0800595} // namespace android