blob: 46733b9a83352ca99ca01a94238642bb0c2d2d0f [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"
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000031
32namespace android {
33
34using testing::_;
35using testing::Mock;
36using testing::Return;
Dominik Laskowskifb281c52023-02-11 14:24:19 -050037
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000038using PresentState = frametimeline::SurfaceFrame::PresentState;
39
40class TransactionSurfaceFrameTest : public testing::Test {
41public:
42 TransactionSurfaceFrameTest() {
43 const ::testing::TestInfo* const test_info =
44 ::testing::UnitTest::GetInstance()->current_test_info();
45 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Dominik Laskowskifb281c52023-02-11 14:24:19 -050046 mFlinger.setupMockScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080047 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
chaviwba4320c2021-09-15 15:20:53 -050048 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000049 }
50
51 ~TransactionSurfaceFrameTest() {
52 const ::testing::TestInfo* const test_info =
53 ::testing::UnitTest::GetInstance()->current_test_info();
54 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
55 }
56
Patrick Williams83f36b22022-09-14 17:57:35 +000057 sp<Layer> createLayer() {
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000058 sp<Client> client;
Patrick Williams83f36b22022-09-14 17:57:35 +000059 LayerCreationArgs args(mFlinger.flinger(), client, "layer", 0, LayerMetadata());
60 return sp<Layer>::make(args);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000061 }
62
Vishnu Nairc1d19d72023-08-10 12:35:11 -070063 void commitTransaction(Layer* layer) { layer->commitTransaction(); }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000064
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000065 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050066 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -080067
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000068 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000069
70 void PresentedSurfaceFrameForBufferlessTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +000071 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -080072 FrameTimelineInfo ftInfo;
73 ftInfo.vsyncId = 1;
74 ftInfo.inputEventId = 0;
75 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -070076 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
77 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
78 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000079 commitTransaction(layer.get());
80 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +000081 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000082 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
83 }
84
85 void PresentedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +000086 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -070087 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000088 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -050089 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -050090 bufferData.acquireFence = fence;
91 bufferData.frameNumber = 1;
92 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
93 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -080094 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
95 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
96 1ULL /* bufferId */,
97 HAL_PIXEL_FORMAT_RGBA_8888,
98 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -080099 FrameTimelineInfo ftInfo;
100 ftInfo.vsyncId = 1;
101 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900102 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000103 acquireFence->signalForTest(12);
104
105 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700106 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
107 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
108 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000109 // Buffers are presented only at latch time.
110 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
111
Vishnu Nair397a0e32022-07-26 00:01:48 +0000112 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000113
114 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000115 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000116 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
117 }
118
119 void DroppedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000120 sp<Layer> layer = createLayer();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000121
Ady Abrahamd11bade2022-08-01 16:18:03 -0700122 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000123 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500124 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500125 bufferData.acquireFence = fence1;
126 bufferData.frameNumber = 1;
127 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
128 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800129 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
130 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
131 1ULL /* bufferId */,
132 HAL_PIXEL_FORMAT_RGBA_8888,
133 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800134 FrameTimelineInfo ftInfo;
135 ftInfo.vsyncId = 1;
136 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900137 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700138 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
139 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
140 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000141
Ady Abrahamd11bade2022-08-01 16:18:03 -0700142 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000143 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000144 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500145 bufferData.acquireFence = fence2;
146 bufferData.frameNumber = 1;
147 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
148 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800149 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
150 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
151 2ULL /* bufferId */,
152 HAL_PIXEL_FORMAT_RGBA_8888,
153 0ULL /*usage*/);
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900154 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, ftInfo);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000155 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000156 acquireFence2->signalForTest(12);
157
Robert Carr6a160312021-05-17 12:08:20 -0700158 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
159 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
160 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000161
162 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000163 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000164
165 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000166 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000167 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000168 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
169 auto dropTime = droppedSurfaceFrame->getDropTime();
170 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000171
172 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000173 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000174 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
175 }
176
177 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000178 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800179 FrameTimelineInfo ftInfo;
180 ftInfo.vsyncId = 1;
181 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000182
Huihong Luo3bdef862022-03-03 11:57:19 -0800183 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000184
Robert Carr6a160312021-05-17 12:08:20 -0700185 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
186 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000187
Ady Abrahamd11bade2022-08-01 16:18:03 -0700188 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000189 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500190 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500191 bufferData.acquireFence = fence;
192 bufferData.frameNumber = 1;
193 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
194 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800195 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
196 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
197 1ULL /* bufferId */,
198 HAL_PIXEL_FORMAT_RGBA_8888,
199 0ULL /*usage*/);
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900200 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000201 acquireFence->signalForTest(12);
202
Robert Carr6a160312021-05-17 12:08:20 -0700203 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
204 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
205 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000206
207 commitTransaction(layer.get());
208 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000209 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000210 // Buffers are presented only at latch time.
211 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
212
Vishnu Nair397a0e32022-07-26 00:01:48 +0000213 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000214
215 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
216 }
217
218 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000219 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700220 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000221 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500222 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500223 bufferData.acquireFence = fence;
224 bufferData.frameNumber = 1;
225 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
226 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800227 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
228 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
229 1ULL /* bufferId */,
230 HAL_PIXEL_FORMAT_RGBA_8888,
231 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800232 FrameTimelineInfo ftInfo;
233 ftInfo.vsyncId = 1;
234 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900235 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700236 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
237 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000238
Huihong Luo3bdef862022-03-03 11:57:19 -0800239 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700240 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
241 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000242 }
243
244 void MultipleSurfaceFramesPresentedTogether() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000245 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800246 FrameTimelineInfo ftInfo;
247 ftInfo.vsyncId = 1;
248 ftInfo.inputEventId = 0;
249 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700250 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
251 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000252 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700253 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000254
Huihong Luo3bdef862022-03-03 11:57:19 -0800255 FrameTimelineInfo ftInfo2;
256 ftInfo2.vsyncId = 4;
257 ftInfo2.inputEventId = 0;
258 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700259 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
260 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
261 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000262
Ady Abrahamd11bade2022-08-01 16:18:03 -0700263 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000264 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500265 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500266 bufferData.acquireFence = fence;
267 bufferData.frameNumber = 1;
268 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
269 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800270 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
271 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
272 1ULL /* bufferId */,
273 HAL_PIXEL_FORMAT_RGBA_8888,
274 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800275 FrameTimelineInfo ftInfo3;
276 ftInfo3.vsyncId = 3;
277 ftInfo3.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900278 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700279 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
280 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
281 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000282
283 acquireFence->signalForTest(12);
284
285 commitTransaction(layer.get());
286
287 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000288 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000289 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
290
291 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000292 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000293 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
294
295 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000296 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000297 // Buffers are presented only at latch time.
298 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
299
Vishnu Nair397a0e32022-07-26 00:01:48 +0000300 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000301
302 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
303 }
304
Adithya Srinivasan95619432021-02-08 21:52:51 +0000305 void PendingSurfaceFramesRemovedAfterClassification() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000306 sp<Layer> layer = createLayer();
Adithya Srinivasan95619432021-02-08 21:52:51 +0000307
Ady Abrahamd11bade2022-08-01 16:18:03 -0700308 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000309 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500310 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500311 bufferData.acquireFence = fence1;
312 bufferData.frameNumber = 1;
313 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
314 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800315 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
316 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
317 1ULL /* bufferId */,
318 HAL_PIXEL_FORMAT_RGBA_8888,
319 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800320 FrameTimelineInfo ftInfo;
321 ftInfo.vsyncId = 1;
322 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900323 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700324 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
325 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000326
Ady Abrahamd11bade2022-08-01 16:18:03 -0700327 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000328 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500329 bufferData.acquireFence = fence2;
330 bufferData.frameNumber = 1;
331 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
332 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800333 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
334 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
335 1ULL /* bufferId */,
336 HAL_PIXEL_FORMAT_RGBA_8888,
337 0ULL /*usage*/);
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900338 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000339 acquireFence2->signalForTest(12);
340
Robert Carr6a160312021-05-17 12:08:20 -0700341 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
342 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000343
344 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000345 layer->updateTexImage(15);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000346
347 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
348 // pendingJankClassifications.
349 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200350 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000351 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
352 layer->releasePendingBuffer(25);
353
354 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
355 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000356
357 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000358 sp<Layer> layer = createLayer();
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000359
Ady Abrahamd11bade2022-08-01 16:18:03 -0700360 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000361 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500362 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500363 bufferData.acquireFence = fence1;
364 bufferData.frameNumber = 1;
365 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
366 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800367 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
368 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
369 1ULL /* bufferId */,
370 HAL_PIXEL_FORMAT_RGBA_8888,
371 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800372 FrameTimelineInfo ftInfo;
373 ftInfo.vsyncId = 1;
374 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900375 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700376 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
377 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
378 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000379
Ady Abrahamd11bade2022-08-01 16:18:03 -0700380 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000381 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000382 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500383 bufferData.acquireFence = fence2;
384 bufferData.frameNumber = 1;
385 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
386 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800387 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
388 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
389 1ULL /* bufferId */,
390 HAL_PIXEL_FORMAT_RGBA_8888,
391 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800392 FrameTimelineInfo ftInfoInv;
393 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
394 ftInfoInv.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900395 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000396 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700397 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
398 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
399 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000400
Ady Abrahamd11bade2022-08-01 16:18:03 -0700401 sp<Fence> fence3(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000402 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000403 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500404 bufferData.acquireFence = fence3;
405 bufferData.frameNumber = 1;
406 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
407 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800408 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
409 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
410 1ULL /* bufferId */,
411 HAL_PIXEL_FORMAT_RGBA_8888,
412 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800413 FrameTimelineInfo ftInfo2;
414 ftInfo2.vsyncId = 2;
415 ftInfo2.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900416 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000417 auto dropEndTime2 = systemTime();
418 acquireFence3->signalForTest(12);
419
Robert Carr6a160312021-05-17 12:08:20 -0700420 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
421 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
422 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000423
424 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000425 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000426
427 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000428 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000429 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
430 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
431 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
432 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
433
434 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000435 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000436 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
437 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
438 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
439 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
440
441 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000442 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000443 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
444 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000445
446 void MultipleCommitsBeforeLatch() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000447 sp<Layer> layer = createLayer();
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000448 uint32_t surfaceFramesPendingClassification = 0;
449 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
450 for (int i = 0; i < 10; i += 2) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700451 sp<Fence> fence(sp<Fence>::make());
chaviwba4320c2021-09-15 15:20:53 -0500452 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500453 bufferData.acquireFence = fence;
454 bufferData.frameNumber = 1;
455 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
456 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800457 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
458 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
459 1ULL /* bufferId */,
460 HAL_PIXEL_FORMAT_RGBA_8888,
461 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800462 FrameTimelineInfo ftInfo;
463 ftInfo.vsyncId = 1;
464 ftInfo.inputEventId = 0;
Nergi Rahardi39f510f2024-05-23 15:16:54 +0900465 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo);
Huihong Luo3bdef862022-03-03 11:57:19 -0800466 FrameTimelineInfo ftInfo2;
467 ftInfo2.vsyncId = 2;
468 ftInfo2.inputEventId = 0;
469 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700470 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
471 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000472 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700473 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000474 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
475
476 commitTransaction(layer.get());
477 surfaceFramesPendingClassification += 2;
478 EXPECT_EQ(surfaceFramesPendingClassification,
479 layer->mPendingJankClassifications.size());
480 }
481
482 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000483 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000484 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
485 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
486 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200487 surfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000488 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
489 }
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200490 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000491 /*displayDeadlineDelta*/ 0,
492 /*displayPresentDelta*/ 0);
493
494 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
495 ASSERT_EQ(10u, surfaceFramesPendingClassification);
496 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
497
498 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
499 // bufferlessSurfaceFrame presented
500 for (uint32_t i = 0; i < 8; i += 2) {
501 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
502 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
503 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
504 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
505 }
506 {
507 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
508 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
509 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
510 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
511 }
512
513 layer->releasePendingBuffer(25);
514
515 // There shouldn't be any pending classifications. Everything should have been cleared.
516 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
517 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000518};
519
520TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
521 PresentedSurfaceFrameForBufferlessTransaction();
522}
523
524TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
525 PresentedSurfaceFrameForBufferTransaction();
526}
527
528TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
529 DroppedSurfaceFrameForBufferTransaction();
530}
531
532TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
533 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
534}
535
536TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
537 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
538}
539
540TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
541 MultipleSurfaceFramesPresentedTogether();
542}
543
Adithya Srinivasan95619432021-02-08 21:52:51 +0000544TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
545 PendingSurfaceFramesRemovedAfterClassification();
546}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000547
548TEST_F(TransactionSurfaceFrameTest,
549 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
550 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
551}
552
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000553TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
554 MultipleCommitsBeforeLatch();
555}
556
Robert Carr0758e5d2021-03-11 22:15:04 -0800557} // namespace android