blob: 9a68d75d552ea39e9e06a64a3146791c53ccec4b [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;
Vishnu Nair39a74a92024-07-29 19:01:50 +000075 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10,
76 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -070077 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
78 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
79 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000080 commitTransaction(layer.get());
81 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +000082 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000083 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
84 }
85
86 void PresentedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +000087 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -070088 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000089 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -050090 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -050091 bufferData.acquireFence = fence;
92 bufferData.frameNumber = 1;
93 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
94 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -080095 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
96 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
97 1ULL /* bufferId */,
98 HAL_PIXEL_FORMAT_RGBA_8888,
99 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800100 FrameTimelineInfo ftInfo;
101 ftInfo.vsyncId = 1;
102 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000103 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo,
104 gui::GameMode::Unsupported);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000105 acquireFence->signalForTest(12);
106
107 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700108 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
109 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
110 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000111 // Buffers are presented only at latch time.
112 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
113
Vishnu Nair397a0e32022-07-26 00:01:48 +0000114 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000115
116 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000117 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000118 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
119 }
120
121 void DroppedSurfaceFrameForBufferTransaction() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000122 sp<Layer> layer = createLayer();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000123
Ady Abrahamd11bade2022-08-01 16:18:03 -0700124 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000125 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500126 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500127 bufferData.acquireFence = fence1;
128 bufferData.frameNumber = 1;
129 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
130 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800131 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
132 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
133 1ULL /* bufferId */,
134 HAL_PIXEL_FORMAT_RGBA_8888,
135 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800136 FrameTimelineInfo ftInfo;
137 ftInfo.vsyncId = 1;
138 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000139 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, ftInfo,
140 gui::GameMode::Unsupported);
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*/);
Vishnu Nair39a74a92024-07-29 19:01:50 +0000157 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, ftInfo,
158 gui::GameMode::Unsupported);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000159 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000160 acquireFence2->signalForTest(12);
161
Robert Carr6a160312021-05-17 12:08:20 -0700162 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
163 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
164 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000165
166 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000167 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000168
169 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000170 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000171 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000172 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
173 auto dropTime = droppedSurfaceFrame->getDropTime();
174 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000175
176 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000177 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000178 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
179 }
180
181 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000182 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800183 FrameTimelineInfo ftInfo;
184 ftInfo.vsyncId = 1;
185 ftInfo.inputEventId = 0;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000186
Vishnu Nair39a74a92024-07-29 19:01:50 +0000187 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10,
188 gui::GameMode::Unsupported);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000189
Robert Carr6a160312021-05-17 12:08:20 -0700190 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
191 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000192
Ady Abrahamd11bade2022-08-01 16:18:03 -0700193 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000194 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500195 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500196 bufferData.acquireFence = fence;
197 bufferData.frameNumber = 1;
198 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
199 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800200 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
201 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
202 1ULL /* bufferId */,
203 HAL_PIXEL_FORMAT_RGBA_8888,
204 0ULL /*usage*/);
Vishnu Nair39a74a92024-07-29 19:01:50 +0000205 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo,
206 gui::GameMode::Unsupported);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000207 acquireFence->signalForTest(12);
208
Robert Carr6a160312021-05-17 12:08:20 -0700209 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
210 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
211 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000212
213 commitTransaction(layer.get());
214 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000215 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000216 // Buffers are presented only at latch time.
217 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
218
Vishnu Nair397a0e32022-07-26 00:01:48 +0000219 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000220
221 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
222 }
223
224 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000225 sp<Layer> layer = createLayer();
Ady Abrahamd11bade2022-08-01 16:18:03 -0700226 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000227 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500228 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500229 bufferData.acquireFence = fence;
230 bufferData.frameNumber = 1;
231 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
232 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800233 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
234 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
235 1ULL /* bufferId */,
236 HAL_PIXEL_FORMAT_RGBA_8888,
237 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800238 FrameTimelineInfo ftInfo;
239 ftInfo.vsyncId = 1;
240 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000241 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo,
242 gui::GameMode::Unsupported);
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
Vishnu Nair39a74a92024-07-29 19:01:50 +0000246 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10,
247 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700248 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
249 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000250 }
251
252 void MultipleSurfaceFramesPresentedTogether() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000253 sp<Layer> layer = createLayer();
Huihong Luo3bdef862022-03-03 11:57:19 -0800254 FrameTimelineInfo ftInfo;
255 ftInfo.vsyncId = 1;
256 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000257 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo, 10,
258 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700259 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
260 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000261 const auto bufferlessSurfaceFrame1 =
Robert Carr6a160312021-05-17 12:08:20 -0700262 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000263
Huihong Luo3bdef862022-03-03 11:57:19 -0800264 FrameTimelineInfo ftInfo2;
265 ftInfo2.vsyncId = 4;
266 ftInfo2.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000267 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10,
268 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700269 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
270 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
271 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000272
Ady Abrahamd11bade2022-08-01 16:18:03 -0700273 sp<Fence> fence(sp<Fence>::make());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000274 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
chaviwba4320c2021-09-15 15:20:53 -0500275 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500276 bufferData.acquireFence = fence;
277 bufferData.frameNumber = 1;
278 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
279 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800280 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
281 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
282 1ULL /* bufferId */,
283 HAL_PIXEL_FORMAT_RGBA_8888,
284 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800285 FrameTimelineInfo ftInfo3;
286 ftInfo3.vsyncId = 3;
287 ftInfo3.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000288 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo3,
289 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700290 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
291 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
292 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000293
294 acquireFence->signalForTest(12);
295
296 commitTransaction(layer.get());
297
298 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000299 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000300 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
301
302 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000303 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000304 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
305
306 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000307 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000308 // Buffers are presented only at latch time.
309 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
310
Vishnu Nair397a0e32022-07-26 00:01:48 +0000311 layer->updateTexImage(15);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000312
313 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
314 }
315
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000316 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000317 sp<Layer> layer = createLayer();
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000318
Ady Abrahamd11bade2022-08-01 16:18:03 -0700319 sp<Fence> fence1(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000320 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
chaviwba4320c2021-09-15 15:20:53 -0500321 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500322 bufferData.acquireFence = fence1;
323 bufferData.frameNumber = 1;
324 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
325 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800326 std::shared_ptr<renderengine::ExternalTexture> externalTexture1 = std::make_shared<
327 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
328 1ULL /* bufferId */,
329 HAL_PIXEL_FORMAT_RGBA_8888,
330 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800331 FrameTimelineInfo ftInfo;
332 ftInfo.vsyncId = 1;
333 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000334 layer->setBuffer(externalTexture1, bufferData, 10, 20, false, ftInfo,
335 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700336 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
337 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
338 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000339
Ady Abrahamd11bade2022-08-01 16:18:03 -0700340 sp<Fence> fence2(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000341 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000342 auto dropStartTime1 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500343 bufferData.acquireFence = fence2;
344 bufferData.frameNumber = 1;
345 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
346 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800347 std::shared_ptr<renderengine::ExternalTexture> externalTexture2 = std::make_shared<
348 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
349 1ULL /* bufferId */,
350 HAL_PIXEL_FORMAT_RGBA_8888,
351 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800352 FrameTimelineInfo ftInfoInv;
353 ftInfoInv.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
354 ftInfoInv.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000355 layer->setBuffer(externalTexture2, bufferData, 10, 20, false, ftInfoInv,
356 gui::GameMode::Unsupported);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000357 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700358 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
359 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
360 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000361
Ady Abrahamd11bade2022-08-01 16:18:03 -0700362 sp<Fence> fence3(sp<Fence>::make());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000363 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000364 auto dropStartTime2 = systemTime();
chaviwba4320c2021-09-15 15:20:53 -0500365 bufferData.acquireFence = fence3;
366 bufferData.frameNumber = 1;
367 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
368 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800369 std::shared_ptr<renderengine::ExternalTexture> externalTexture3 = std::make_shared<
370 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
371 1ULL /* bufferId */,
372 HAL_PIXEL_FORMAT_RGBA_8888,
373 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800374 FrameTimelineInfo ftInfo2;
375 ftInfo2.vsyncId = 2;
376 ftInfo2.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000377 layer->setBuffer(externalTexture3, bufferData, 10, 20, false, ftInfo2,
378 gui::GameMode::Unsupported);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000379 auto dropEndTime2 = systemTime();
380 acquireFence3->signalForTest(12);
381
Robert Carr6a160312021-05-17 12:08:20 -0700382 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
383 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
384 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000385
386 commitTransaction(layer.get());
Vishnu Nair397a0e32022-07-26 00:01:48 +0000387 layer->updateTexImage(15);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000388
389 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000390 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000391 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
392 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
393 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
394 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
395
396 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000397 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000398 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
399 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
400 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
401 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
402
403 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000404 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000405 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
406 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000407
408 void MultipleCommitsBeforeLatch() {
Patrick Williams83f36b22022-09-14 17:57:35 +0000409 sp<Layer> layer = createLayer();
Pascal Mütschardd56514e2024-05-24 17:37:13 +0200410 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> surfaceFrames;
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000411 for (int i = 0; i < 10; i += 2) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700412 sp<Fence> fence(sp<Fence>::make());
chaviwba4320c2021-09-15 15:20:53 -0500413 BufferData bufferData;
chaviwba4320c2021-09-15 15:20:53 -0500414 bufferData.acquireFence = fence;
415 bufferData.frameNumber = 1;
416 bufferData.flags |= BufferData::BufferDataChange::fenceChanged;
417 bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800418 std::shared_ptr<renderengine::ExternalTexture> externalTexture = std::make_shared<
419 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
420 1ULL /* bufferId */,
421 HAL_PIXEL_FORMAT_RGBA_8888,
422 0ULL /*usage*/);
Huihong Luo3bdef862022-03-03 11:57:19 -0800423 FrameTimelineInfo ftInfo;
424 ftInfo.vsyncId = 1;
425 ftInfo.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000426 layer->setBuffer(externalTexture, bufferData, 10, 20, false, ftInfo,
427 gui::GameMode::Unsupported);
Huihong Luo3bdef862022-03-03 11:57:19 -0800428 FrameTimelineInfo ftInfo2;
429 ftInfo2.vsyncId = 2;
430 ftInfo2.inputEventId = 0;
Vishnu Nair39a74a92024-07-29 19:01:50 +0000431 layer->setFrameTimelineVsyncForBufferlessTransaction(ftInfo2, 10,
432 gui::GameMode::Unsupported);
Robert Carr6a160312021-05-17 12:08:20 -0700433 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
434 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Pascal Mütschardd56514e2024-05-24 17:37:13 +0200435
436 surfaceFrames.push_back(layer->mDrawingState.bufferSurfaceFrameTX);
437 surfaceFrames.push_back(
438 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2));
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000439
440 commitTransaction(layer.get());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000441 }
442
443 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Vishnu Nair397a0e32022-07-26 00:01:48 +0000444 layer->updateTexImage(15);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000445 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
446 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
Pascal Mütschardd56514e2024-05-24 17:37:13 +0200447 // The odd indices are the bufferless frames.
448 for (uint32_t i = 1; i < 10; i += 2) {
449 surfaceFrames[i]->onPresent(20, JankType::None, 90_Hz, 90_Hz,
450 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000451 }
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200452 presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz,
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000453 /*displayDeadlineDelta*/ 0,
454 /*displayPresentDelta*/ 0);
455
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000456 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
457 // bufferlessSurfaceFrame presented
458 for (uint32_t i = 0; i < 8; i += 2) {
Pascal Mütschardd56514e2024-05-24 17:37:13 +0200459 auto bufferSurfaceFrame = surfaceFrames[i];
460 auto bufferlessSurfaceFrame = surfaceFrames[i + 1];
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000461 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
462 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
463 }
464 {
Pascal Mütschardd56514e2024-05-24 17:37:13 +0200465 auto bufferSurfaceFrame = surfaceFrames[8];
466 auto bufferlessSurfaceFrame = surfaceFrames[9];
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000467 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
468 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
469 }
470
471 layer->releasePendingBuffer(25);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000472 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000473};
474
475TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
476 PresentedSurfaceFrameForBufferlessTransaction();
477}
478
479TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
480 PresentedSurfaceFrameForBufferTransaction();
481}
482
483TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
484 DroppedSurfaceFrameForBufferTransaction();
485}
486
487TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
488 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
489}
490
491TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
492 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
493}
494
495TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
496 MultipleSurfaceFramesPresentedTogether();
497}
498
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000499TEST_F(TransactionSurfaceFrameTest,
500 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
501 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
502}
503
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000504TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
505 MultipleCommitsBeforeLatch();
506}
507
Robert Carr0758e5d2021-03-11 22:15:04 -0800508} // namespace android