blob: e2c64917dc72a0a3f6cb9b58452aa6f09feb3897 [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
63 void commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -070064 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080065 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000066 }
67
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000068 TestableSurfaceFlinger mFlinger;
chaviwba4320c2021-09-15 15:20:53 -050069 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
Dominik Laskowski13948602021-03-08 20:48:28 -080070
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000071 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000072
73 void PresentedSurfaceFrameForBufferlessTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +000074 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -080075 FrameTimelineInfo ftInfo;
76 ftInfo.vsyncId = 1;
77 ftInfo.inputEventId = 0;
78 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -070079 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
80 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
81 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000082 commitTransaction(layer.get());
83 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +000084 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000085 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
86 }
87
88 void PresentedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +000089 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -070090 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000091 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -050092 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -050093 bufferData.acquireFence = fence;
94 bufferData.frameNumber = 1;
95 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
96 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -080097 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
98 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
99 1ULL /* bufferId */,
100 HAL_PIXEL_FORMAT_RGBA_8888,
101 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800102 FrameTimelineInfo ftInfo;
103 ftInfo.vsyncId = 1;
104 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700105 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000106 acquireFence->signalForTest(12);
107
108 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700109 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
110 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
111 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000112 // Buffers are presented only at latch time.
113 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
114
Vishnu Nair397a0e32022-07-26 00:01:48 +0000115 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000116
117 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000118 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000119 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
120 }
121
122 void DroppedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000123 sp<Layer> layer = createLayer();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000124
Ady Abrahamd11bade2022-08-01 16:18:03 -0700125 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000126 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500127 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500128 bufferData.acquireFence = fence1;
129 bufferData.frameNumber = 1;
130 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
131 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800132 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
133 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
134 1ULL /* bufferId */,
135 HAL_PIXEL_FORMAT_RGBA_8888,
136 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800137 FrameTimelineInfo ftInfo;
138 ftInfo.vsyncId = 1;
139 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700140 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700141 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
142 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
143 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000144
Ady Abrahamd11bade2022-08-01 16:18:03 -0700145 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000146 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000147 nsecs_t start = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500148 bufferData.acquireFence = fence2;
149 bufferData.frameNumber = 1;
150 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
151 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800152 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
153 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
154 2ULL /* bufferId */,
155 HAL_PIXEL_FORMAT_RGBA_8888,
156 0ULL /*usage*/);
Brian Lindahl439afad2022-11-14 11:16:55 -0700157 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000158 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000159 acquireFence2->signalForTest(12);
160
Robert Carr6a160312021-05-17 12:08:20 -0700161 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
162 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
163 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000164
165 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000166 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000167
168 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000169 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000170 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000171 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
172 auto dropTime = droppedSurfaceFrame->getDropTime();
173 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000174
175 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000176 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000177 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
178 }
179
180 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000181 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800182 FrameTimelineInfo ftInfo;
183 ftInfo.vsyncId = 1;
184 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000185
Huihong Luo3bdef862022-03-03 11:57:19 -0800186 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000187
Robert Carr6a160312021-05-17 12:08:20 -0700188 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
189 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000190
Ady Abrahamd11bade2022-08-01 16:18:03 -0700191 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000192 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500193 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500194 bufferData.acquireFence = fence;
195 bufferData.frameNumber = 1;
196 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
197 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800198 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
199 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
200 1ULL /* bufferId */,
201 HAL_PIXEL_FORMAT_RGBA_8888,
202 0ULL /*usage*/);
Brian Lindahl439afad2022-11-14 11:16:55 -0700203 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000204 acquireFence->signalForTest(12);
205
Robert Carr6a160312021-05-17 12:08:20 -0700206 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
207 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
208 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000209
210 commitTransaction(layer.get());
211 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000212 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000213 // Buffers are presented only at latch time.
214 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
215
Vishnu Nair397a0e32022-07-26 00:01:48 +0000216 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000217
218 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
219 }
220
221 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000222 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700223 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000224 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500225 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500226 bufferData.acquireFence = fence;
227 bufferData.frameNumber = 1;
228 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
229 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800230 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
231 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
232 1ULL /* bufferId */,
233 HAL_PIXEL_FORMAT_RGBA_8888,
234 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800235 FrameTimelineInfo ftInfo;
236 ftInfo.vsyncId = 1;
237 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700238 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700239 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
240 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000241
Huihong Luo3bdef862022-03-03 11:57:19 -0800242 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700243 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
244 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000245 }
246
247 void MultipleSurfaceFramesPresentedTogether() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000248 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800249 FrameTimelineInfo ftInfo;
250 ftInfo.vsyncId = 1;
251 ftInfo.inputEventId = 0;
252 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700253 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
254 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000255 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700256 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000257
Huihong Luo3bdef862022-03-03 11:57:19 -0800258 FrameTimelineInfo ftInfo2;
259 ftInfo2.vsyncId = 4;
260 ftInfo2.inputEventId = 0;
261 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700262 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
263 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
264 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000265
Ady Abrahamd11bade2022-08-01 16:18:03 -0700266 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000267 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500268 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500269 bufferData.acquireFence = fence;
270 bufferData.frameNumber = 1;
271 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
272 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800273 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
274 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
275 1ULL /* bufferId */,
276 HAL_PIXEL_FORMAT_RGBA_8888,
277 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800278 FrameTimelineInfo ftInfo3;
279 ftInfo3.vsyncId = 3;
280 ftInfo3.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700281 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo3);
Robert Carr6a160312021-05-17 12:08:20 -0700282 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
283 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
284 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000285
286 acquireFence->signalForTest(12);
287
288 commitTransaction(layer.get());
289
290 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000291 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000292 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
293
294 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000295 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000296 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
297
298 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000299 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000300 // Buffers are presented only at latch time.
301 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
302
Vishnu Nair397a0e32022-07-26 00:01:48 +0000303 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000304
305 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
306 }
307
Adithya Srinivasan95619432021-02-08 21:52:51 +0000308 void PendingSurfaceFramesRemovedAfterClassification() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000309 sp<Layer> layer = createLayer();
Adithya Srinivasan95619432021-02-08 21:52:51 +0000310
Ady Abrahamd11bade2022-08-01 16:18:03 -0700311 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000312 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500313 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500314 bufferData.acquireFence = fence1;
315 bufferData.frameNumber = 1;
316 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
317 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800318 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
319 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
320 1ULL /* bufferId */,
321 HAL_PIXEL_FORMAT_RGBA_8888,
322 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800323 FrameTimelineInfo ftInfo;
324 ftInfo.vsyncId = 1;
325 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700326 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700327 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
328 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000329
Ady Abrahamd11bade2022-08-01 16:18:03 -0700330 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan95619432021-02-08 21:52:51 +0000331 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
chaviwba4320c2021-09-15 15:20:53 -0500332 bufferData.acquireFence = fence2;
333 bufferData.frameNumber = 1;
334 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
335 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800336 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
337 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
338 1ULL /* bufferId */,
339 HAL_PIXEL_FORMAT_RGBA_8888,
340 0ULL /*usage*/);
Brian Lindahl439afad2022-11-14 11:16:55 -0700341 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfo);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000342 acquireFence2->signalForTest(12);
343
Robert Carr6a160312021-05-17 12:08:20 -0700344 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
345 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000346
347 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000348 layer->updateTexImage(15);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000349
350 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
351 // pendingJankClassifications.
352 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700353 presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasan95619432021-02-08 21:52:51 +0000354 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
355 layer->releasePendingBuffer(25);
356
357 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
358 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000359
360 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000361 sp<Layer> layer = createLayer();
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000362
Ady Abrahamd11bade2022-08-01 16:18:03 -0700363 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000364 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500365 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500366 bufferData.acquireFence = fence1;
367 bufferData.frameNumber = 1;
368 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
369 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800370 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
371 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
372 1ULL /* bufferId */,
373 HAL_PIXEL_FORMAT_RGBA_8888,
374 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800375 FrameTimelineInfo ftInfo;
376 ftInfo.vsyncId = 1;
377 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700378 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, ftInfo);
Robert Carr6a160312021-05-17 12:08:20 -0700379 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
380 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
381 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000382
Ady Abrahamd11bade2022-08-01 16:18:03 -0700383 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000384 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000385 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500386 bufferData.acquireFence = fence2;
387 bufferData.frameNumber = 1;
388 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
389 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800390 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
391 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
392 1ULL /* bufferId */,
393 HAL_PIXEL_FORMAT_RGBA_8888,
394 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800395 FrameTimelineInfo ftInfoInv;
396 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
397 ftInfoInv.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700398 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, ftInfoInv);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000399 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700400 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
401 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
402 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000403
Ady Abrahamd11bade2022-08-01 16:18:03 -0700404 sp<Fence> fence3(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000405 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000406 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500407 bufferData.acquireFence = fence3;
408 bufferData.frameNumber = 1;
409 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
410 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800411 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
412 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
413 1ULL /* bufferId */,
414 HAL_PIXEL_FORMAT_RGBA_8888,
415 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800416 FrameTimelineInfo ftInfo2;
417 ftInfo2.vsyncId = 2;
418 ftInfo2.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700419 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, ftInfo2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000420 auto dropEndTime2 = systemTime();
421 acquireFence3->signalForTest(12);
422
Robert Carr6a160312021-05-17 12:08:20 -0700423 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
424 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
425 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000426
427 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000428 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000429
430 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000431 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000432 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
433 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
434 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
435 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
436
437 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000438 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000439 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
440 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
441 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
442 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
443
444 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000445 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000446 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
447 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000448
449 void MultipleCommitsBeforeLatch() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000450 sp<Layer> layer = createLayer();
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000451 uint32_t surfaceFramesPendingClassification = 0;
452 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
453 for (int i = 0; i < 10; i += 2) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700454 sp<Fence> fence(sp<Fence>::make());
chaviwba4320c2021-09-15 15:20:53 -0500455 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500456 bufferData.acquireFence = fence;
457 bufferData.frameNumber = 1;
458 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
459 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800460 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
461 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
462 1ULL /* bufferId */,
463 HAL_PIXEL_FORMAT_RGBA_8888,
464 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800465 FrameTimelineInfo ftInfo;
466 ftInfo.vsyncId = 1;
467 ftInfo.inputEventId = 0;
Brian Lindahl439afad2022-11-14 11:16:55 -0700468 layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, ftInfo);
Huihong Luo3bdef862022-03-03 11:57:19 -0800469 FrameTimelineInfo ftInfo2;
470 ftInfo2.vsyncId = 2;
471 ftInfo2.inputEventId = 0;
472 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10);
Robert Carr6a160312021-05-17 12:08:20 -0700473 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
474 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000475 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700476 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000477 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
478
479 commitTransaction(layer.get());
480 surfaceFramesPendingClassification += 2;
481 EXPECT_EQ(surfaceFramesPendingClassification,
482 layer->mPendingJankClassifications.size());
483 }
484
485 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000486 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000487 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
488 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
489 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700490 surfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000491 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
492 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000494 /*displayDeadlineDelta*/ 0,
495 /*displayPresentDelta*/ 0);
496
497 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
498 ASSERT_EQ(10u, surfaceFramesPendingClassification);
499 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
500
501 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
502 // bufferlessSurfaceFrame presented
503 for (uint32_t i = 0; i < 8; i += 2) {
504 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
505 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
506 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
507 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
508 }
509 {
510 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
511 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
512 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
513 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
514 }
515
516 layer->releasePendingBuffer(25);
517
518 // There shouldn't be any pending classifications. Everything should have been cleared.
519 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
520 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000521};
522
523TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
524 PresentedSurfaceFrameForBufferlessTransaction();
525}
526
527TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
528 PresentedSurfaceFrameForBufferTransaction();
529}
530
531TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
532 DroppedSurfaceFrameForBufferTransaction();
533}
534
535TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
536 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
537}
538
539TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
540 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
541}
542
543TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
544 MultipleSurfaceFramesPresentedTogether();
545}
546
Adithya Srinivasan95619432021-02-08 21:52:51 +0000547TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
548 PendingSurfaceFramesRemovedAfterClassification();
549}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000550
551TEST_F(TransactionSurfaceFrameTest,
552 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
553 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
554}
555
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000556TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
557 MultipleCommitsBeforeLatch();
558}
559
Robert Carr0758e5d2021-03-11 22:15:04 -0800560} // namespace android