blob: 2a7921f66191be79bfb9adfd80598b66eb59e543 [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>
25#include <renderengine/mock/RenderEngine.h>
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000026#include <utils/String8.h>
27
28#include "TestableSurfaceFlinger.h"
29#include "mock/DisplayHardware/MockComposer.h"
30#include "mock/MockEventThread.h"
31#include "mock/MockVsyncController.h"
32
33namespace android {
34
35using testing::_;
36using testing::Mock;
37using testing::Return;
38using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
39using PresentState = frametimeline::SurfaceFrame::PresentState;
40
41class TransactionSurfaceFrameTest : public testing::Test {
42public:
43 TransactionSurfaceFrameTest() {
44 const ::testing::TestInfo* const test_info =
45 ::testing::UnitTest::GetInstance()->current_test_info();
46 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
47 setupScheduler();
Dominik Laskowski13948602021-03-08 20:48:28 -080048 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
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
57 sp<BufferStateLayer> createBufferStateLayer() {
58 sp<Client> client;
59 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", 100, 100, 0,
60 LayerMetadata());
61 return new BufferStateLayer(args);
62 }
63
64 void commitTransaction(Layer* layer) {
Robert Carr6a160312021-05-17 12:08:20 -070065 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080066 layer->commitTransaction(c);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000067 }
68
69 void setupScheduler() {
70 auto eventThread = std::make_unique<mock::EventThread>();
71 auto sfEventThread = std::make_unique<mock::EventThread>();
72
73 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
74 EXPECT_CALL(*eventThread, createEventConnection(_, _))
75 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
76 ResyncCallback())));
77
78 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
79 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
80 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
81 ResyncCallback())));
82
83 auto vsyncController = std::make_unique<mock::VsyncController>();
84 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
85
86 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
87 EXPECT_CALL(*vsyncTracker, currentPeriod())
88 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
89 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
90 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
91 std::move(eventThread), std::move(sfEventThread));
92 }
93
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000094 TestableSurfaceFlinger mFlinger;
Alec Mouria90a5702021-04-16 16:36:21 +000095 renderengine::mock::RenderEngine mRenderEngine;
Dominik Laskowski13948602021-03-08 20:48:28 -080096
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000097 FenceToFenceTimeMap fenceFactory;
98 client_cache_t mClientCache;
99
100 void PresentedSurfaceFrameForBufferlessTransaction() {
101 sp<BufferStateLayer> layer = createBufferStateLayer();
102 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
103 10);
Robert Carr6a160312021-05-17 12:08:20 -0700104 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
105 ASSERT_TRUE(layer->mDrawingState.bufferSurfaceFrameTX == nullptr);
106 const auto surfaceFrame = layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*token*/ 1);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000107 commitTransaction(layer.get());
108 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000109 EXPECT_EQ(false, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000110 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
111 }
112
113 void PresentedSurfaceFrameForBufferTransaction() {
114 sp<BufferStateLayer> layer = createBufferStateLayer();
115 sp<Fence> fence(new Fence());
116 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000117 const auto buffer = std::make_shared<
118 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
119 1, 0),
120 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000121 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500122 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
123 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000124 acquireFence->signalForTest(12);
125
126 commitTransaction(layer.get());
Robert Carr6a160312021-05-17 12:08:20 -0700127 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
128 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
129 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000130 // Buffers are presented only at latch time.
131 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
132
133 bool computeVisisbleRegions;
134 layer->updateTexImage(computeVisisbleRegions, 15, 0);
135
136 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000137 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000138 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
139 }
140
141 void DroppedSurfaceFrameForBufferTransaction() {
142 sp<BufferStateLayer> layer = createBufferStateLayer();
143
144 sp<Fence> fence1(new Fence());
145 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000146 const auto buffer1 = std::make_shared<
147 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
148 1, 0),
149 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000150 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500151 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
152 nullptr /* releaseBufferEndpoint */);
Robert Carr6a160312021-05-17 12:08:20 -0700153 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
154 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
155 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000156
157 sp<Fence> fence2(new Fence());
158 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000159 const auto buffer2 = std::make_shared<
160 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
161 1, 0),
162 mRenderEngine, false);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000163 nsecs_t start = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000164 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500165 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
166 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000167 nsecs_t end = systemTime();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000168 acquireFence2->signalForTest(12);
169
Robert Carr6a160312021-05-17 12:08:20 -0700170 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
171 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
172 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000173
174 commitTransaction(layer.get());
175 bool computeVisisbleRegions;
176 layer->updateTexImage(computeVisisbleRegions, 15, 0);
177
178 EXPECT_EQ(1, droppedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000179 EXPECT_EQ(true, droppedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000180 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame->getPresentState());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000181 EXPECT_EQ(0u, droppedSurfaceFrame->getActuals().endTime);
182 auto dropTime = droppedSurfaceFrame->getDropTime();
183 EXPECT_TRUE(dropTime > start && dropTime < end);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000184
185 EXPECT_EQ(1, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000186 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000187 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
188 }
189
190 void BufferlessSurfaceFramePromotedToBufferSurfaceFrame() {
191 sp<BufferStateLayer> layer = createBufferStateLayer();
192
193 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
194 10);
195
Robert Carr6a160312021-05-17 12:08:20 -0700196 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
197 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000198
199 sp<Fence> fence(new Fence());
200 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000201 const auto buffer = std::make_shared<
202 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
203 1, 0),
204 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000205 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500206 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
207 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000208 acquireFence->signalForTest(12);
209
Robert Carr6a160312021-05-17 12:08:20 -0700210 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
211 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
212 const auto surfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000213
214 commitTransaction(layer.get());
215 EXPECT_EQ(1, surfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000216 EXPECT_EQ(true, surfaceFrame->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000217 // Buffers are presented only at latch time.
218 EXPECT_EQ(PresentState::Unknown, surfaceFrame->getPresentState());
219
220 bool computeVisisbleRegions;
221 layer->updateTexImage(computeVisisbleRegions, 15, 0);
222
223 EXPECT_EQ(PresentState::Presented, surfaceFrame->getPresentState());
224 }
225
226 void BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists() {
227 sp<BufferStateLayer> layer = createBufferStateLayer();
228 sp<Fence> fence(new Fence());
229 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000230 const auto buffer = std::make_shared<
231 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
232 1, 0),
233 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000234 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500235 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
236 nullptr /* releaseBufferEndpoint */);
Robert Carr6a160312021-05-17 12:08:20 -0700237 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
238 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000239
240 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
241 10);
Robert Carr6a160312021-05-17 12:08:20 -0700242 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
243 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000244 }
245
246 void MultipleSurfaceFramesPresentedTogether() {
247 sp<BufferStateLayer> layer = createBufferStateLayer();
248 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 1, /*inputEventId*/ 0},
249 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
255 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 4, /*inputEventId*/ 0},
256 10);
Robert Carr6a160312021-05-17 12:08:20 -0700257 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
258 ASSERT_EQ(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
259 const auto bufferlessSurfaceFrame2 = layer->mDrawingState.bufferlessSurfaceFramesTX[4];
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000260
261 sp<Fence> fence(new Fence());
262 auto acquireFence = fenceFactory.createFenceTimeForTest(fence);
Alec Mouria90a5702021-04-16 16:36:21 +0000263 const auto buffer = std::make_shared<
264 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
265 1, 0),
266 mRenderEngine, false);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000267 layer->setBuffer(buffer, fence, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500268 {/*vsyncId*/ 3, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
269 nullptr /* releaseBufferEndpoint */);
Robert Carr6a160312021-05-17 12:08:20 -0700270 EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
271 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
272 const auto bufferSurfaceFrameTX = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000273
274 acquireFence->signalForTest(12);
275
276 commitTransaction(layer.get());
277
278 EXPECT_EQ(1, bufferlessSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000279 EXPECT_EQ(false, bufferlessSurfaceFrame1->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000280 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame1->getPresentState());
281
282 EXPECT_EQ(4, bufferlessSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000283 EXPECT_EQ(false, bufferlessSurfaceFrame2->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000284 EXPECT_EQ(PresentState::Presented, bufferlessSurfaceFrame2->getPresentState());
285
286 EXPECT_EQ(3, bufferSurfaceFrameTX->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000287 EXPECT_EQ(true, bufferSurfaceFrameTX->getIsBuffer());
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000288 // Buffers are presented only at latch time.
289 EXPECT_EQ(PresentState::Unknown, bufferSurfaceFrameTX->getPresentState());
290
291 bool computeVisisbleRegions;
292 layer->updateTexImage(computeVisisbleRegions, 15, 0);
293
294 EXPECT_EQ(PresentState::Presented, bufferSurfaceFrameTX->getPresentState());
295 }
296
Adithya Srinivasan95619432021-02-08 21:52:51 +0000297 void PendingSurfaceFramesRemovedAfterClassification() {
298 sp<BufferStateLayer> layer = createBufferStateLayer();
299
300 sp<Fence> fence1(new Fence());
301 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000302 const auto buffer1 = std::make_shared<
303 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
304 1, 0),
305 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000306 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500307 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
308 nullptr /* releaseBufferEndpoint */);
Robert Carr6a160312021-05-17 12:08:20 -0700309 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
310 const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000311
312 sp<Fence> fence2(new Fence());
313 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000314 const auto buffer2 = std::make_shared<
315 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
316 1, 0),
317 mRenderEngine, false);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000318 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500319 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
320 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasan95619432021-02-08 21:52:51 +0000321 acquireFence2->signalForTest(12);
322
Robert Carr6a160312021-05-17 12:08:20 -0700323 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
324 auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan95619432021-02-08 21:52:51 +0000325
326 commitTransaction(layer.get());
327 bool computeVisisbleRegions;
328 layer->updateTexImage(computeVisisbleRegions, 15, 0);
329
330 // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in
331 // pendingJankClassifications.
332 EXPECT_EQ(2u, layer->mPendingJankClassifications.size());
333 presentedSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
334 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
335 layer->releasePendingBuffer(25);
336
337 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
338 }
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000339
340 void BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer() {
341 sp<BufferStateLayer> layer = createBufferStateLayer();
342
343 sp<Fence> fence1(new Fence());
344 auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1);
Alec Mouria90a5702021-04-16 16:36:21 +0000345 const auto buffer1 = std::make_shared<
346 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
347 1, 0),
348 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000349 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500350 {/*vsyncId*/ 1, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
351 nullptr /* releaseBufferEndpoint */);
Robert Carr6a160312021-05-17 12:08:20 -0700352 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
353 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
354 const auto droppedSurfaceFrame1 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000355
356 sp<Fence> fence2(new Fence());
357 auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2);
Alec Mouria90a5702021-04-16 16:36:21 +0000358 const auto buffer2 = std::make_shared<
359 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
360 1, 0),
361 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000362 auto dropStartTime1 = systemTime();
363 layer->setBuffer(buffer2, fence2, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800364 {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0},
chaviw0b06a8d2021-08-06 11:49:08 -0500365 nullptr /* releaseBufferCallback */, nullptr /* releaseBufferEndpoint */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000366 auto dropEndTime1 = systemTime();
Robert Carr6a160312021-05-17 12:08:20 -0700367 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
368 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
369 const auto droppedSurfaceFrame2 = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000370
371 sp<Fence> fence3(new Fence());
372 auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3);
Alec Mouria90a5702021-04-16 16:36:21 +0000373 const auto buffer3 = std::make_shared<
374 renderengine::ExternalTexture>(new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888,
375 1, 0),
376 mRenderEngine, false);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000377 auto dropStartTime2 = systemTime();
378 layer->setBuffer(buffer3, fence3, 10, 20, false, mClientCache, 1, std::nullopt,
chaviw0b06a8d2021-08-06 11:49:08 -0500379 {/*vsyncId*/ 2, /*inputEventId*/ 0}, nullptr /* releaseBufferCallback */,
380 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000381 auto dropEndTime2 = systemTime();
382 acquireFence3->signalForTest(12);
383
Robert Carr6a160312021-05-17 12:08:20 -0700384 EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
385 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
386 const auto presentedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000387
388 commitTransaction(layer.get());
389 bool computeVisisbleRegions;
390 layer->updateTexImage(computeVisisbleRegions, 15, 0);
391
392 EXPECT_EQ(1, droppedSurfaceFrame1->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000393 EXPECT_EQ(true, droppedSurfaceFrame1->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000394 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame1->getPresentState());
395 EXPECT_EQ(0u, droppedSurfaceFrame1->getActuals().endTime);
396 auto dropTime1 = droppedSurfaceFrame1->getDropTime();
397 EXPECT_TRUE(dropTime1 > dropStartTime1 && dropTime1 < dropEndTime1);
398
399 EXPECT_EQ(FrameTimelineInfo::INVALID_VSYNC_ID, droppedSurfaceFrame2->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000400 EXPECT_EQ(true, droppedSurfaceFrame2->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000401 EXPECT_EQ(PresentState::Dropped, droppedSurfaceFrame2->getPresentState());
402 EXPECT_EQ(0u, droppedSurfaceFrame2->getActuals().endTime);
403 auto dropTime2 = droppedSurfaceFrame2->getDropTime();
404 EXPECT_TRUE(dropTime2 > dropStartTime2 && dropTime2 < dropEndTime2);
405
406 EXPECT_EQ(2, presentedSurfaceFrame->getToken());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000407 EXPECT_EQ(true, presentedSurfaceFrame->getIsBuffer());
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000408 EXPECT_EQ(PresentState::Presented, presentedSurfaceFrame->getPresentState());
409 }
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000410
411 void MultipleCommitsBeforeLatch() {
412 sp<BufferStateLayer> layer = createBufferStateLayer();
413 uint32_t surfaceFramesPendingClassification = 0;
414 std::vector<std::shared_ptr<frametimeline::SurfaceFrame>> bufferlessSurfaceFrames;
415 for (int i = 0; i < 10; i += 2) {
416 sp<Fence> fence1(new Fence());
Alec Mouria90a5702021-04-16 16:36:21 +0000417 const auto buffer1 = std::make_shared<
418 renderengine::ExternalTexture>(new GraphicBuffer(1, 1,
419 HAL_PIXEL_FORMAT_RGBA_8888, 1,
420 0),
421 mRenderEngine, false);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000422 layer->setBuffer(buffer1, fence1, 10, 20, false, mClientCache, 1, std::nullopt,
Vishnu Nair1506b182021-02-22 14:35:15 -0800423 {/*vsyncId*/ 1, /*inputEventId*/ 0},
chaviw0b06a8d2021-08-06 11:49:08 -0500424 nullptr /* releaseBufferCallback */,
425 nullptr /* releaseBufferEndpoint */);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000426 layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2,
427 /*inputEventId*/ 0},
428 10);
Robert Carr6a160312021-05-17 12:08:20 -0700429 ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX);
430 EXPECT_EQ(1u, layer->mDrawingState.bufferlessSurfaceFramesTX.size());
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000431 auto& bufferlessSurfaceFrame =
Robert Carr6a160312021-05-17 12:08:20 -0700432 layer->mDrawingState.bufferlessSurfaceFramesTX.at(/*vsyncId*/ 2);
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000433 bufferlessSurfaceFrames.push_back(bufferlessSurfaceFrame);
434
435 commitTransaction(layer.get());
436 surfaceFramesPendingClassification += 2;
437 EXPECT_EQ(surfaceFramesPendingClassification,
438 layer->mPendingJankClassifications.size());
439 }
440
441 auto presentedBufferSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX;
442 bool computeVisisbleRegions;
443 layer->updateTexImage(computeVisisbleRegions, 15, 0);
444 // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame.
445 // Since we don't have access to DisplayFrame here, trigger an onPresent directly.
446 for (auto& surfaceFrame : bufferlessSurfaceFrames) {
447 surfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
448 /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0);
449 }
450 presentedBufferSurfaceFrame->onPresent(20, JankType::None, Fps::fromPeriodNsecs(11),
451 /*displayDeadlineDelta*/ 0,
452 /*displayPresentDelta*/ 0);
453
454 // There should be 10 bufferlessSurfaceFrames and 1 bufferSurfaceFrame
455 ASSERT_EQ(10u, surfaceFramesPendingClassification);
456 ASSERT_EQ(surfaceFramesPendingClassification, layer->mPendingJankClassifications.size());
457
458 // For the frames upto 8, the bufferSurfaceFrame should have been dropped while the
459 // bufferlessSurfaceFrame presented
460 for (uint32_t i = 0; i < 8; i += 2) {
461 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[i];
462 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[i + 1];
463 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Dropped);
464 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
465 }
466 {
467 auto& bufferSurfaceFrame = layer->mPendingJankClassifications[8u];
468 auto& bufferlessSurfaceFrame = layer->mPendingJankClassifications[9u];
469 EXPECT_EQ(bufferSurfaceFrame->getPresentState(), PresentState::Presented);
470 EXPECT_EQ(bufferlessSurfaceFrame->getPresentState(), PresentState::Presented);
471 }
472
473 layer->releasePendingBuffer(25);
474
475 // There shouldn't be any pending classifications. Everything should have been cleared.
476 EXPECT_EQ(0u, layer->mPendingJankClassifications.size());
477 }
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000478};
479
480TEST_F(TransactionSurfaceFrameTest, PresentedBufferlessSurfaceFrame) {
481 PresentedSurfaceFrameForBufferlessTransaction();
482}
483
484TEST_F(TransactionSurfaceFrameTest, PresentedBufferSurfaceFrame) {
485 PresentedSurfaceFrameForBufferTransaction();
486}
487
488TEST_F(TransactionSurfaceFrameTest, DroppedBufferSurfaceFrame) {
489 DroppedSurfaceFrameForBufferTransaction();
490}
491
492TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFramePromotedToBufferSurfaceFrame) {
493 BufferlessSurfaceFramePromotedToBufferSurfaceFrame();
494}
495
496TEST_F(TransactionSurfaceFrameTest, BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists) {
497 BufferlessSurfaceFrameNotCreatedIfBufferSufaceFrameExists();
498}
499
500TEST_F(TransactionSurfaceFrameTest, MultipleSurfaceFramesPresentedTogether) {
501 MultipleSurfaceFramesPresentedTogether();
502}
503
Adithya Srinivasan95619432021-02-08 21:52:51 +0000504TEST_F(TransactionSurfaceFrameTest, PendingSurfaceFramesRemovedAfterClassification) {
505 PendingSurfaceFramesRemovedAfterClassification();
506}
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000507
508TEST_F(TransactionSurfaceFrameTest,
509 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer) {
510 BufferSurfaceFrame_ReplaceValidTokenBufferWithInvalidTokenBuffer();
511}
512
Adithya Srinivasand11eb6b2021-03-09 18:46:28 +0000513TEST_F(TransactionSurfaceFrameTest, MultipleCommitsBeforeLatch) {
514 MultipleCommitsBeforeLatch();
515}
516
Robert Carr0758e5d2021-03-11 22:15:04 -0800517} // namespace android