blob: 71016db5386e22d46857d50c468a62f34c8937e1 [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 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
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Steven Thomas44685cb2019-07-23 16:19:31 -070031#include <gui/IProducerListener.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080032#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070033#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080034#include <gui/Surface.h>
35#include <gui/SurfaceComposerClient.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070036#include <hardware/hwcomposer_defs.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080037#include <private/android_filesystem_config.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070038#include <private/gui/ComposerService.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080039
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070040#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070041#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070042#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070043#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070044
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070045#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070046#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080047#include <sys/types.h>
48#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070049
Marissa Wall713b63f2018-10-17 15:42:43 -070050#include "BufferGenerator.h"
51
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070052namespace android {
53
Chia-I Wu718daf82017-10-20 11:57:17 -070054namespace {
55
56struct Color {
57 uint8_t r;
58 uint8_t g;
59 uint8_t b;
60 uint8_t a;
61
62 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070063 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070064 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070065 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070066 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070067 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070068};
69
70const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070071const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070072const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070073const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070074const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070075const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070076
Marissa Wall61c58622018-07-18 10:12:20 -070077using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070078using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070079
Chia-I Wu718daf82017-10-20 11:57:17 -070080std::ostream& operator<<(std::ostream& os, const Color& color) {
81 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
82 return os;
83}
84
85// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070086void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
87 const Color& color) {
88 Rect r(0, 0, buffer.width, buffer.height);
89 if (!r.intersect(rect, &r)) {
90 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070091 }
92
Marissa Wall61c58622018-07-18 10:12:20 -070093 int32_t width = r.right - r.left;
94 int32_t height = r.bottom - r.top;
95
96 for (int32_t row = 0; row < height; row++) {
97 uint8_t* dst =
98 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
99 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700100 dst[0] = color.r;
101 dst[1] = color.g;
102 dst[2] = color.b;
103 dst[3] = color.a;
104 dst += 4;
105 }
106 }
107}
108
Marissa Wall61c58622018-07-18 10:12:20 -0700109// Fill a region with the specified color.
110void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
111 Rect r(0, 0, buffer->width, buffer->height);
112 if (!r.intersect(rect, &r)) {
113 return;
114 }
115
116 int32_t width = r.right - r.left;
117 int32_t height = r.bottom - r.top;
118
119 uint8_t* pixels;
120 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
121 reinterpret_cast<void**>(&pixels));
122
123 for (int32_t row = 0; row < height; row++) {
124 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
125 for (int32_t column = 0; column < width; column++) {
126 dst[0] = color.r;
127 dst[1] = color.g;
128 dst[2] = color.b;
129 dst[3] = color.a;
130 dst += 4;
131 }
132 }
133 buffer->unlock();
134}
135
Chia-I Wu718daf82017-10-20 11:57:17 -0700136// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000137void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700138 const Color& color, uint8_t tolerance) {
139 int32_t x = rect.left;
140 int32_t y = rect.top;
141 int32_t width = rect.right - rect.left;
142 int32_t height = rect.bottom - rect.top;
143
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000144 int32_t bufferWidth = int32_t(outBuffer->getWidth());
145 int32_t bufferHeight = int32_t(outBuffer->getHeight());
146 if (x + width > bufferWidth) {
147 x = std::min(x, bufferWidth);
148 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700149 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000150 if (y + height > bufferHeight) {
151 y = std::min(y, bufferHeight);
152 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700153 }
154
155 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
156 uint8_t tmp = a >= b ? a - b : b - a;
157 return tmp <= tolerance;
158 };
159 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000160 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700161 for (int32_t i = 0; i < width; i++) {
162 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
163 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
164 << "pixel @ (" << x + i << ", " << y + j << "): "
165 << "expected (" << color << "), "
166 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
167 src += 4;
168 }
169 }
170}
171
172} // anonymous namespace
173
Robert Carr4cdc58f2017-08-23 14:22:20 -0700174using Transaction = SurfaceComposerClient::Transaction;
175
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700176// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700177static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
178 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800179 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700180 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800181 ASSERT_TRUE(s != nullptr);
182 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800183 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700184 for (int y = 0; y < outBuffer.height; y++) {
185 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700186 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700187 pixel[0] = r;
188 pixel[1] = g;
189 pixel[2] = b;
190 pixel[3] = 255;
191 }
192 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700193 if (unlock) {
194 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
195 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700196}
197
198// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
199// individual pixel values for testing purposes.
200class ScreenCapture : public RefBase {
201public:
chaviw0e3479f2018-09-10 16:49:30 -0700202 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800203 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
204 }
205
206 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800207 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700208 SurfaceComposerClient::Transaction().apply(true);
209
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000210 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800211 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700212 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000213 }
214
215 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
216 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
217 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
218 SurfaceComposerClient::Transaction().apply(true);
219
220 sp<GraphicBuffer> outBuffer;
221 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
222 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700223 }
224
Robert Carr578038f2018-03-09 12:25:24 -0800225 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
226 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
227 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
228 SurfaceComposerClient::Transaction().apply(true);
229
230 sp<GraphicBuffer> outBuffer;
231 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
232 *sc = std::make_unique<ScreenCapture>(outBuffer);
233 }
234
Robert Carr866455f2019-04-02 16:28:26 -0700235 static void captureChildLayersExcluding(
236 std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
237 std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>> excludeLayers) {
238 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
239 SurfaceComposerClient::Transaction().apply(true);
240
241 sp<GraphicBuffer> outBuffer;
242 ASSERT_EQ(NO_ERROR,
243 sf->captureLayers(parentHandle, &outBuffer, ui::Dataspace::V0_SRGB,
244 ui::PixelFormat::RGBA_8888, Rect::EMPTY_RECT, excludeLayers,
245 1.0f, true));
246 *sc = std::make_unique<ScreenCapture>(outBuffer);
247 }
248
Chia-I Wu718daf82017-10-20 11:57:17 -0700249 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000250 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
251 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700252 }
253
254 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000255 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700256 const bool leftBorder = rect.left > 0;
257 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000258 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
259 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700260
261 if (topBorder) {
262 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
263 if (leftBorder) {
264 top.left -= 1;
265 }
266 if (rightBorder) {
267 top.right += 1;
268 }
269 expectColor(top, color, tolerance);
270 }
271 if (leftBorder) {
272 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
273 expectColor(left, color, tolerance);
274 }
275 if (rightBorder) {
276 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
277 expectColor(right, color, tolerance);
278 }
279 if (bottomBorder) {
280 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
281 if (leftBorder) {
282 bottom.left -= 1;
283 }
284 if (rightBorder) {
285 bottom.right += 1;
286 }
287 expectColor(bottom, color, tolerance);
288 }
289 }
290
Chia-I Wu93853fe2017-11-02 08:30:27 -0700291 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
292 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
293 uint8_t tolerance = 0) {
294 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
295
296 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
297 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
298 // avoid checking borders due to unspecified filtering behavior
299 const int32_t offsetX = filtered ? 2 : 0;
300 const int32_t offsetY = filtered ? 2 : 0;
301 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
302 tolerance);
303 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
304 tolerance);
305 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
306 tolerance);
307 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
308 bottomRight, tolerance);
309 }
310
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700311 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000312 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
313 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700314 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
315 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700316 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
317 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700318 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700319 }
320 }
321
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700322 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700323
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700324 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700325
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700326 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700327
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800328 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000329 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700330 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700331
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000332 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700333
334private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000335 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800336 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700337};
338
Chia-I Wu718daf82017-10-20 11:57:17 -0700339class LayerTransactionTest : public ::testing::Test {
340protected:
341 void SetUp() override {
342 mClient = new SurfaceComposerClient;
343 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
344
345 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700346
347 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700348 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700349 }
350
chaviw0e3479f2018-09-10 16:49:30 -0700351 virtual void TearDown() {
352 mBlackBgSurface = 0;
353 mClient->dispose();
354 mClient = 0;
355 }
356
Marissa Wallfda30bb2018-10-12 11:34:28 -0700357 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
358 const char* name, uint32_t width, uint32_t height,
wukui117023412020-03-22 20:15:26 +0800359 uint32_t flags = 0, SurfaceControl* parent = nullptr,
360 PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
361 auto layer = createSurface(client, name, width, height, format, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700362
Vishnu Nair60356342018-11-13 13:00:45 -0800363 Transaction t;
364 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800365
366 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700367 if (error != NO_ERROR) {
368 ADD_FAILURE() << "failed to initialize SurfaceControl";
369 layer.clear();
370 }
371
372 return layer;
373 }
374
Vishnu Nair88a11f22018-11-28 18:30:57 -0800375 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
376 const char* name, uint32_t width, uint32_t height,
377 PixelFormat format, uint32_t flags,
378 SurfaceControl* parent = nullptr) {
379 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
380 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
381 return layer;
382 }
383
Marissa Wallfda30bb2018-10-12 11:34:28 -0700384 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
wukui117023412020-03-22 20:15:26 +0800385 uint32_t flags = 0, SurfaceControl* parent = nullptr,
386 PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
387 return createLayer(mClient, name, width, height, flags, parent, format);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700388 }
389
Vishnu Nairda9c85a2019-06-03 17:26:48 -0700390 sp<SurfaceControl> createColorLayer(const char* name, const Color& color,
391 SurfaceControl* parent = nullptr) {
392 auto colorLayer = createSurface(mClient, name, 0 /* buffer width */, 0 /* buffer height */,
393 PIXEL_FORMAT_RGBA_8888,
394 ISurfaceComposerClient::eFXSurfaceColor, parent);
395 asTransaction([&](Transaction& t) {
396 t.setColor(colorLayer, half3{color.r / 255.0f, color.g / 255.0f, color.b / 255.0f});
397 t.setAlpha(colorLayer, color.a / 255.0f);
398 });
399 return colorLayer;
400 }
401
Marissa Wall61c58622018-07-18 10:12:20 -0700402 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700403 // wait for previous transactions (such as setSize) to complete
404 Transaction().apply(true);
405
406 ANativeWindow_Buffer buffer = {};
407 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
408
409 return buffer;
410 }
411
Marissa Wall61c58622018-07-18 10:12:20 -0700412 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700413 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
414
415 // wait for the newly posted buffer to be latched
416 waitForLayerBuffers();
417 }
418
Marissa Wall61c58622018-07-18 10:12:20 -0700419 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
420 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700421 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700422 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
423 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
424 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700425 }
426
Marissa Wall61c58622018-07-18 10:12:20 -0700427 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
428 int32_t bufferWidth, int32_t bufferHeight) {
429 sp<GraphicBuffer> buffer =
430 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
431 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
432 BufferUsage::COMPOSER_OVERLAY,
433 "test");
434 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700435 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700436 }
437
438 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
439 int32_t bufferWidth, int32_t bufferHeight) {
440 switch (mLayerType) {
441 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
442 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
443 break;
444 case ISurfaceComposerClient::eFXSurfaceBufferState:
445 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
446 break;
447 default:
448 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
449 }
450 }
451
452 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
453 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700454 const Color& topRight, const Color& bottomLeft,
455 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700456 switch (mLayerType) {
457 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
458 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
459 bottomLeft, bottomRight);
460 break;
461 case ISurfaceComposerClient::eFXSurfaceBufferState:
462 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
463 bottomLeft, bottomRight);
464 break;
465 default:
466 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
467 }
468 }
469
470 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
471 int32_t bufferHeight, const Color& topLeft,
472 const Color& topRight, const Color& bottomLeft,
473 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700474 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700475 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
476 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700477
Marissa Wall61c58622018-07-18 10:12:20 -0700478 const int32_t halfW = bufferWidth / 2;
479 const int32_t halfH = bufferHeight / 2;
480 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
481 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
482 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
483 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
484 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700485
Marissa Wall61c58622018-07-18 10:12:20 -0700486 postBufferQueueLayerBuffer(layer);
487 }
488
489 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
490 int32_t bufferHeight, const Color& topLeft,
491 const Color& topRight, const Color& bottomLeft,
492 const Color& bottomRight) {
493 sp<GraphicBuffer> buffer =
494 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
495 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
496 BufferUsage::COMPOSER_OVERLAY,
497 "test");
498
499 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
500
501 const int32_t halfW = bufferWidth / 2;
502 const int32_t halfH = bufferHeight / 2;
503 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
504 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
505 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
506 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
507
508 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700509 }
510
chaviw0e3479f2018-09-10 16:49:30 -0700511 std::unique_ptr<ScreenCapture> screenshot() {
512 std::unique_ptr<ScreenCapture> screenshot;
513 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700514 return screenshot;
515 }
516
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800517 void asTransaction(const std::function<void(Transaction&)>& exec) {
518 Transaction t;
519 exec(t);
520 t.apply(true);
521 }
522
Marissa Wall713b63f2018-10-17 15:42:43 -0700523 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
524 static BufferGenerator bufferGenerator;
525 return bufferGenerator.get(outBuffer, outFence);
526 }
527
Chia-I Wu718daf82017-10-20 11:57:17 -0700528 sp<SurfaceComposerClient> mClient;
529
530 sp<IBinder> mDisplay;
531 uint32_t mDisplayWidth;
532 uint32_t mDisplayHeight;
533 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700534 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700535
536 // leave room for ~256 layers
537 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
538
chaviw0e3479f2018-09-10 16:49:30 -0700539 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700540 bool mColorManagementUsed;
541
Chia-I Wu718daf82017-10-20 11:57:17 -0700542private:
543 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800544 mDisplay = mClient->getInternalDisplayToken();
545 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700546
547 // get display width/height
548 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800549 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700550 mDisplayWidth = info.w;
551 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700552 mDisplayRect =
553 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700554
555 // After a new buffer is queued, SurfaceFlinger is notified and will
556 // latch the new buffer on next vsync. Let's heuristically wait for 3
557 // vsyncs.
558 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
559
560 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700561
Vishnu Nair88a11f22018-11-28 18:30:57 -0800562 mBlackBgSurface =
563 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
564 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700565
Chia-I Wu718daf82017-10-20 11:57:17 -0700566 // set layer stack (b/68888219)
567 Transaction t;
568 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800569 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700570 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
571 t.setColor(mBlackBgSurface, half3{0, 0, 0});
572 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700573 t.apply();
574 }
575
chaviw0e3479f2018-09-10 16:49:30 -0700576 void waitForLayerBuffers() {
577 // Request an empty transaction to get applied synchronously to ensure the buffer is
578 // latched.
579 Transaction().apply(true);
580 usleep(mBufferPostDelay);
581 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700582
583 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800584
585 friend class LayerRenderPathTestHarness;
586};
587enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
588
589class LayerRenderPathTestHarness {
590public:
591 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
592 : mDelegate(delegate), mRenderPath(renderPath) {}
593
594 std::unique_ptr<ScreenCapture> getScreenCapture() {
595 switch (mRenderPath) {
596 case RenderPath::SCREENSHOT:
597 return mDelegate->screenshot();
598 case RenderPath::VIRTUAL_DISPLAY:
599
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800600 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800601 DisplayInfo mainDisplayInfo;
602 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
603
604 sp<IBinder> vDisplay;
605 sp<IGraphicBufferProducer> producer;
606 sp<IGraphicBufferConsumer> consumer;
607 sp<BufferItemConsumer> itemConsumer;
608 BufferQueue::createBufferQueue(&producer, &consumer);
609
610 consumer->setConsumerName(String8("Virtual disp consumer"));
611 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
612
613 itemConsumer = new BufferItemConsumer(consumer,
614 // Sample usage bits from screenrecord
615 GRALLOC_USAGE_HW_VIDEO_ENCODER |
616 GRALLOC_USAGE_SW_READ_OFTEN);
617
618 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
619 false /*secure*/);
620
621 SurfaceComposerClient::Transaction t;
622 t.setDisplaySurface(vDisplay, producer);
623 t.setDisplayLayerStack(vDisplay, 0);
624 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
625 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
626 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
627 t.apply();
628 SurfaceComposerClient::Transaction().apply(true);
629 BufferItem item;
630 itemConsumer->acquireBuffer(&item, 0, true);
631 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
632 itemConsumer->releaseBuffer(item);
633 SurfaceComposerClient::destroyDisplay(vDisplay);
634 return sc;
635 }
636 }
637
638protected:
639 LayerTransactionTest* mDelegate;
640 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700641};
642
Alec Mouri80863a62019-01-17 15:19:35 -0800643class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700644public:
Alec Mouri80863a62019-01-17 15:19:35 -0800645 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700646
647 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
wukui117023412020-03-22 20:15:26 +0800648 uint32_t flags = 0, SurfaceControl* parent = nullptr,
649 PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
Marissa Wall61c58622018-07-18 10:12:20 -0700650 // if the flags already have a layer type specified, return an error
651 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
652 return nullptr;
653 }
wukui117023412020-03-22 20:15:26 +0800654 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent,
655 format);
Marissa Wall61c58622018-07-18 10:12:20 -0700656 }
657
658 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
659 int32_t bufferHeight) {
660 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
661 bufferWidth, bufferHeight));
662 }
663
664 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
665 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
666 const Color& bottomLeft, const Color& bottomRight) {
667 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
668 bufferWidth, bufferHeight,
669 topLeft, topRight,
670 bottomLeft, bottomRight));
671 }
672
673protected:
674 uint32_t mLayerType;
675};
676
Alec Mouri80863a62019-01-17 15:19:35 -0800677class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
678 public ::testing::WithParamInterface<uint32_t> {
679public:
680 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
681};
682
683class LayerTypeAndRenderTypeTransactionTest
684 : public LayerTypeTransactionHarness,
685 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
686public:
687 LayerTypeAndRenderTypeTransactionTest()
688 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
689 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
690
691 std::unique_ptr<ScreenCapture> getScreenCapture() {
692 return mRenderPathHarness.getScreenCapture();
693 }
694
695protected:
696 LayerRenderPathTestHarness mRenderPathHarness;
697};
698
699// Environment for starting up binder threads. This is required for testing
700// virtual displays, as BufferQueue parameters may be queried over binder.
701class BinderEnvironment : public ::testing::Environment {
702public:
703 void SetUp() override { ProcessState::self()->startThreadPool(); }
704};
705
706::testing::Environment* const binderEnv =
707 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
708
709class LayerRenderTypeTransactionTest : public LayerTransactionTest,
710 public ::testing::WithParamInterface<RenderPath> {
711public:
712 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
713
714 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
715 void setRelativeZBasicHelper(uint32_t layerType);
716 void setRelativeZGroupHelper(uint32_t layerType);
717 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800718 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
719 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800720
721protected:
722 LayerRenderPathTestHarness mHarness;
723};
724
725INSTANTIATE_TEST_CASE_P(
726 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
727 ::testing::Combine(
728 ::testing::Values(
729 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
730 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
731 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
732
733INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
734 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
735
Marissa Wall61c58622018-07-18 10:12:20 -0700736INSTANTIATE_TEST_CASE_P(
737 LayerTypeTransactionTests, LayerTypeTransactionTest,
738 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
739 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
740
Alec Mouri80863a62019-01-17 15:19:35 -0800741TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700742 sp<SurfaceControl> layer;
743 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700744 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700745
746 {
747 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700748 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800749 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700750 shot->expectColor(rect, Color::RED);
751 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700752 }
753
754 Transaction().setPosition(layer, 5, 10).apply();
755 {
756 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700757 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800758 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700759 shot->expectColor(rect, Color::RED);
760 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762}
763
Alec Mouri80863a62019-01-17 15:19:35 -0800764TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700765 sp<SurfaceControl> layer;
766 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700767 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700768
769 // GLES requires only 4 bits of subpixel precision during rasterization
770 // XXX GLES composition does not match HWC composition due to precision
771 // loss (b/69315223)
772 const float epsilon = 1.0f / 16.0f;
773 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
774 {
775 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800776 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700777 }
778
779 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
780 {
781 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800782 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700783 }
784}
785
Alec Mouri80863a62019-01-17 15:19:35 -0800786TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700787 sp<SurfaceControl> layer;
788 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700789 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700790
791 Transaction().setPosition(layer, -32, -32).apply();
792 {
793 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800794 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700795 }
796
797 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
798 {
799 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800800 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700801 }
802}
803
Alec Mouri80863a62019-01-17 15:19:35 -0800804TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700805 sp<SurfaceControl> layer;
806 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700807 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700808
809 // partially out of bounds
810 Transaction().setPosition(layer, -30, -30).apply();
811 {
812 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800813 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700814 }
815
816 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
817 {
818 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800819 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
820 mDisplayHeight),
821 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700822 }
823}
824
Alec Mouri80863a62019-01-17 15:19:35 -0800825TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700826 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700827 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
828 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700829
830 // setPosition is applied immediately by default, with or without resize
831 // pending
832 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
833 {
834 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800835 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700836 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700837 shot->expectColor(rect, Color::RED);
838 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700839 }
840
Marissa Wall861616d2018-10-22 12:52:23 -0700841 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700842 {
843 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800844 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700845 }
846}
847
Alec Mouri80863a62019-01-17 15:19:35 -0800848TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700849 sp<SurfaceControl> layer;
850 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700851 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700852
853 // request setPosition to be applied with the next resize
854 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
855 {
856 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800857 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 }
859
860 Transaction().setPosition(layer, 15, 20).apply();
861 {
862 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800863 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700864 }
865
866 Transaction().setSize(layer, 64, 64).apply();
867 {
868 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800869 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700870 }
871
872 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700873 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700874 {
875 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800876 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700877 }
878}
879
Alec Mouri80863a62019-01-17 15:19:35 -0800880TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700881 sp<SurfaceControl> layer;
882 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700883 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700884
885 // setPosition is not immediate even with SCALE_TO_WINDOW override
886 Transaction()
887 .setPosition(layer, 5, 10)
888 .setSize(layer, 64, 64)
889 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
890 .setGeometryAppliesWithResize(layer)
891 .apply();
892 {
893 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800894 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700895 }
896
Marissa Wall61c58622018-07-18 10:12:20 -0700897 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700898 {
899 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800900 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700901 }
902}
903
Alec Mouri80863a62019-01-17 15:19:35 -0800904TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700905 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700906 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
907 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700908
909 Transaction().setSize(layer, 64, 64).apply();
910 {
911 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800912 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700913 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700914 shot->expectColor(rect, Color::RED);
915 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700916 }
917
Marissa Wall861616d2018-10-22 12:52:23 -0700918 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700919 {
920 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800921 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700922 const Rect rect(0, 0, 64, 64);
923 shot->expectColor(rect, Color::RED);
924 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700925 }
926}
927
Alec Mouri80863a62019-01-17 15:19:35 -0800928TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700929 // cannot test robustness against invalid sizes (zero or really huge)
930}
931
Alec Mouri80863a62019-01-17 15:19:35 -0800932TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700933 sp<SurfaceControl> layer;
934 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700935 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700936
937 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
938 Transaction()
939 .setSize(layer, 64, 64)
940 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
941 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800942 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700943}
944
Alec Mouri80863a62019-01-17 15:19:35 -0800945TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700946 sp<SurfaceControl> layerR;
947 sp<SurfaceControl> layerG;
948 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700949 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700950 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700951 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700952
953 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
954 {
955 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800956 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700957 }
958
959 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
960 {
961 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800962 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700963 }
964}
965
Alec Mouri80863a62019-01-17 15:19:35 -0800966TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700967 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800968 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700969 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800970 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700971 sp<SurfaceControl> layerR;
972 sp<SurfaceControl> layerG;
973 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700974 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700975 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700976 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700977
chaviw0e3479f2018-09-10 16:49:30 -0700978 Transaction()
979 .reparent(layerR, parent->getHandle())
980 .reparent(layerG, parent->getHandle())
981 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700982 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
983 {
984 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800985 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700986 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700987 }
988
989 Transaction().setLayer(layerR, -3).apply();
990 {
991 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800992 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700993 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700994 }
995}
996
Alec Mouri80863a62019-01-17 15:19:35 -0800997void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700998 sp<SurfaceControl> layerR;
999 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -07001000 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
1001 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1002 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
1003 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001004
Marissa Wall861616d2018-10-22 12:52:23 -07001005 switch (layerType) {
1006 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1007 Transaction()
1008 .setPosition(layerG, 16, 16)
1009 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1010 .apply();
1011 break;
1012 case ISurfaceComposerClient::eFXSurfaceBufferState:
1013 Transaction()
1014 .setFrame(layerR, Rect(0, 0, 32, 32))
1015 .setFrame(layerG, Rect(16, 16, 48, 48))
1016 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1017 .apply();
1018 break;
1019 default:
1020 ASSERT_FALSE(true) << "Unsupported layer type";
1021 }
Chia-I Wu49313302017-10-31 10:14:40 -07001022 {
1023 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -08001024 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001025 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1026 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
1027 }
1028
1029 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1030 {
1031 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001032 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001033 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1034 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1035 }
1036}
1037
Alec Mouri80863a62019-01-17 15:19:35 -08001038TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001039 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1040}
1041
Alec Mouri80863a62019-01-17 15:19:35 -08001042TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001043 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1044}
1045
Marissa Wall61c58622018-07-18 10:12:20 -07001046TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001047 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001048 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001049 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001050 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001051 sp<SurfaceControl> layerR;
1052 sp<SurfaceControl> layerG;
1053 sp<SurfaceControl> layerB;
1054 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001055 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001056 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001057 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001058 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001059 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001060
chaviw0e3479f2018-09-10 16:49:30 -07001061 Transaction()
1062 .reparent(layerB, parent->getHandle())
1063 .apply();
1064
Chia-I Wuec2d9852017-11-21 09:21:01 -08001065 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1066 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1067
chaviw0e3479f2018-09-10 16:49:30 -07001068 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001069 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001070 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001071 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001072 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1073}
1074
chaviw32377582019-05-13 11:15:19 -07001075TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) {
1076 sp<SurfaceControl> parent =
1077 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1078 ISurfaceComposerClient::eFXSurfaceColor);
1079
1080 sp<SurfaceControl> childLayer;
1081 ASSERT_NO_FATAL_FAILURE(
1082 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1083 0 /* buffer height */,
1084 ISurfaceComposerClient::eFXSurfaceColor,
1085 parent.get()));
1086 Transaction()
1087 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1088 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1089 .show(childLayer)
1090 .show(parent)
1091 .setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight))
1092 .setCrop_legacy(childLayer, Rect(0, 0, 20, 30))
1093 .apply();
1094
1095 Transaction()
1096 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1097 .setLayer(childLayer, 1)
1098 .apply();
1099
1100 {
1101 SCOPED_TRACE("setLayer above");
1102 // Set layer should get applied and place the child above.
1103 std::unique_ptr<ScreenCapture> screenshot;
1104 ScreenCapture::captureScreen(&screenshot);
1105 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1106 }
1107
1108 Transaction()
1109 .setLayer(childLayer, 1)
1110 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1111 .apply();
1112
1113 {
1114 SCOPED_TRACE("setRelative below");
1115 // Set relative layer should get applied and place the child below.
1116 std::unique_ptr<ScreenCapture> screenshot;
1117 ScreenCapture::captureScreen(&screenshot);
1118 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1119 }
1120}
1121
Robert Carr1c5481e2019-07-01 14:42:27 -07001122TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) {
1123 sp<SurfaceControl> parent =
1124 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1125 ISurfaceComposerClient::eFXSurfaceColor);
1126 sp<SurfaceControl> relativeParent =
1127 LayerTransactionTest::createLayer("RelativeParent", 0 /* buffer width */,
1128 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceColor);
1129
1130 sp<SurfaceControl> childLayer;
1131 ASSERT_NO_FATAL_FAILURE(
1132 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1133 0 /* buffer height */,
1134 ISurfaceComposerClient::eFXSurfaceColor,
1135 parent.get()));
1136 Transaction()
1137 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1138 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1139 .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f})
1140 .show(childLayer)
1141 .show(parent)
1142 .show(relativeParent)
1143 .setLayer(parent, mLayerZBase - 1)
1144 .setLayer(relativeParent, mLayerZBase)
1145 .apply();
1146
1147 Transaction()
1148 .setRelativeLayer(childLayer, relativeParent->getHandle(), 1)
1149 .apply();
1150
1151 {
1152 SCOPED_TRACE("setLayer above");
1153 // Set layer should get applied and place the child above.
1154 std::unique_ptr<ScreenCapture> screenshot;
1155 ScreenCapture::captureScreen(&screenshot);
1156 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1157 }
1158
1159 Transaction()
1160 .hide(relativeParent)
1161 .apply();
1162
1163 {
1164 SCOPED_TRACE("hide relative parent");
1165 // The relative should no longer be visible.
1166 std::unique_ptr<ScreenCapture> screenshot;
1167 ScreenCapture::captureScreen(&screenshot);
1168 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1169 }
1170}
1171
Alec Mouri80863a62019-01-17 15:19:35 -08001172void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001173 sp<SurfaceControl> layerR;
1174 sp<SurfaceControl> layerG;
1175 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001176 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1177 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1178 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1179 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1180 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1181 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001182
1183 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001184 switch (layerType) {
1185 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1186 Transaction()
1187 .setPosition(layerG, 8, 8)
1188 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1189 .setPosition(layerB, 16, 16)
1190 .setLayer(layerB, mLayerZBase + 2)
1191 .apply();
1192 break;
1193 case ISurfaceComposerClient::eFXSurfaceBufferState:
1194 Transaction()
1195 .setFrame(layerR, Rect(0, 0, 32, 32))
1196 .setFrame(layerG, Rect(8, 8, 40, 40))
1197 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1198 .setFrame(layerB, Rect(16, 16, 48, 48))
1199 .setLayer(layerB, mLayerZBase + 2)
1200 .apply();
1201 break;
1202 default:
1203 ASSERT_FALSE(true) << "Unsupported layer type";
1204 }
1205
Chia-I Wu49313302017-10-31 10:14:40 -07001206 {
1207 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001208 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001209 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1210 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1211 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1212 }
1213
1214 // layerR = 4, layerG = layerR + 3, layerB = 2
1215 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1216 {
1217 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001218 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001219 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1220 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1221 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1222 }
1223
1224 // layerR = 4, layerG = layerR - 3, layerB = 2
1225 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1226 {
1227 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001228 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001229 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1230 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1231 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1232 }
1233
1234 // restore to absolute z
1235 // layerR = 4, layerG = 0, layerB = 2
1236 Transaction().setLayer(layerG, mLayerZBase).apply();
1237 {
1238 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001239 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001240 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1241 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1242 }
1243
1244 // layerR should not affect layerG anymore
1245 // layerR = 1, layerG = 0, layerB = 2
1246 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1247 {
1248 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001249 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001250 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1251 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1252 }
1253}
1254
Alec Mouri80863a62019-01-17 15:19:35 -08001255TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001256 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1257}
1258
Alec Mouri80863a62019-01-17 15:19:35 -08001259TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001260 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1261}
1262
Alec Mouri80863a62019-01-17 15:19:35 -08001263TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001264 sp<SurfaceControl> layerR;
1265 sp<SurfaceControl> layerG;
1266
1267 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001268 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001269 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001270 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001271
1272 Transaction()
1273 .setPosition(layerG, 16, 16)
1274 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1275 .apply();
1276
Robert Carr87246532019-02-04 15:20:26 -08001277 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001278 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001279 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001280}
1281
Alec Mouri80863a62019-01-17 15:19:35 -08001282TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001283 sp<SurfaceControl> layer;
1284 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001285 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001286
1287 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1288 {
1289 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001290 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001291 }
1292
1293 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1294 {
1295 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001296 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001297 }
1298}
1299
Alec Mouri80863a62019-01-17 15:19:35 -08001300TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001301 const Color translucentRed = {100, 0, 0, 100};
1302 sp<SurfaceControl> layerR;
1303 sp<SurfaceControl> layerG;
1304 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001305 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001306 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001307 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001308
1309 Transaction()
1310 .setLayer(layerR, mLayerZBase + 1)
1311 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1312 .apply();
1313 {
1314 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001315 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001316 }
1317
1318 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1319 {
1320 SCOPED_TRACE("layerR translucent");
1321 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001322 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001323 }
1324}
1325
Marissa Wall61c58622018-07-18 10:12:20 -07001326TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001327 sp<SurfaceControl> layer;
1328 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001329 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001330
1331 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001332 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001333 Transaction()
1334 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1335 .apply(true);
1336 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001337 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001338
1339 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1340 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001341 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001342}
1343
Robert Carrfa8855f2019-02-19 10:05:00 -08001344/** RAII Wrapper around get/seteuid */
1345class UIDFaker {
1346 uid_t oldId;
1347public:
1348 UIDFaker(uid_t uid) {
1349 oldId = geteuid();
1350 seteuid(uid);
1351 }
1352 ~UIDFaker() {
1353 seteuid(oldId);
1354 }
1355};
1356
1357TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1358 sp<SurfaceControl> layer;
1359 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1360 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1361
1362 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1363 sp<GraphicBuffer> outBuffer;
1364 Transaction()
1365 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1366 .apply(true);
1367 ASSERT_EQ(PERMISSION_DENIED,
1368 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1369
1370 UIDFaker f(AID_SYSTEM);
1371
1372 // By default the system can capture screenshots with secure layers but they
1373 // will be blacked out
1374 ASSERT_EQ(NO_ERROR,
1375 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1376
1377 {
1378 SCOPED_TRACE("as system");
1379 auto shot = screenshot();
1380 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1381 }
1382
1383 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1384 // to receive them...we are expected to take care with the results.
Robert Carr108b2c72019-04-02 16:32:58 -07001385 bool outCapturedSecureLayers;
Robert Carrfa8855f2019-02-19 10:05:00 -08001386 ASSERT_EQ(NO_ERROR,
Robert Carr108b2c72019-04-02 16:32:58 -07001387 composer->captureScreen(mDisplay, &outBuffer, outCapturedSecureLayers,
1388 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, Rect(), 0,
1389 0, false, ISurfaceComposer::eRotateNone, true));
1390 ASSERT_EQ(true, outCapturedSecureLayers);
Robert Carrfa8855f2019-02-19 10:05:00 -08001391 ScreenCapture sc(outBuffer);
1392 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1393}
1394
Alec Mouri80863a62019-01-17 15:19:35 -08001395TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001396 const Rect top(0, 0, 32, 16);
1397 const Rect bottom(0, 16, 32, 32);
1398 sp<SurfaceControl> layer;
1399 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1400
1401 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001402 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1403 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1404 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001405 // setTransparentRegionHint always applies to the following buffer
1406 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001407 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001408 {
1409 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001410 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001411 shot->expectColor(top, Color::BLACK);
1412 shot->expectColor(bottom, Color::RED);
1413 }
1414
1415 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1416 {
1417 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001418 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001419 shot->expectColor(top, Color::BLACK);
1420 shot->expectColor(bottom, Color::RED);
1421 }
1422
Marissa Wall61c58622018-07-18 10:12:20 -07001423 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1424 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1425 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1426 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001427 {
1428 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001429 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001430 shot->expectColor(top, Color::RED);
1431 shot->expectColor(bottom, Color::BLACK);
1432 }
1433}
1434
Alec Mouri80863a62019-01-17 15:19:35 -08001435TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001436 const Rect top(0, 0, 32, 16);
1437 const Rect bottom(0, 16, 32, 32);
1438 sp<SurfaceControl> layer;
1439 ASSERT_NO_FATAL_FAILURE(
1440 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1441
1442 sp<GraphicBuffer> buffer =
1443 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1444 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1445 BufferUsage::COMPOSER_OVERLAY,
1446 "test");
1447
1448 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1449 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1450 Transaction()
1451 .setTransparentRegionHint(layer, Region(top))
1452 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001453 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001454 .apply();
1455 {
1456 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001457 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001458 shot->expectColor(top, Color::BLACK);
1459 shot->expectColor(bottom, Color::RED);
1460 }
1461
1462 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1463 {
1464 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001465 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001466 shot->expectColor(top, Color::BLACK);
1467 shot->expectColor(bottom, Color::BLACK);
1468 }
1469
1470 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1471 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1472 BufferUsage::COMPOSER_OVERLAY,
1473 "test");
1474
1475 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1476 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001477 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001478 {
1479 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001480 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001481 shot->expectColor(top, Color::RED);
1482 shot->expectColor(bottom, Color::BLACK);
1483 }
1484}
1485
Alec Mouri80863a62019-01-17 15:19:35 -08001486TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001487 sp<SurfaceControl> layerTransparent;
1488 sp<SurfaceControl> layerR;
1489 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1490 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1491
1492 // check that transparent region hint is bound by the layer size
1493 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001494 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001495 .setPosition(layerR, 16, 16)
1496 .setLayer(layerR, mLayerZBase + 1)
1497 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001498 ASSERT_NO_FATAL_FAILURE(
1499 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1500 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001501 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001502}
1503
Alec Mouri80863a62019-01-17 15:19:35 -08001504TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001505 sp<SurfaceControl> layerTransparent;
1506 sp<SurfaceControl> layerR;
1507 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1508 ASSERT_NO_FATAL_FAILURE(
1509 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1510
1511 // check that transparent region hint is bound by the layer size
1512 Transaction()
1513 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1514 .setFrame(layerR, Rect(16, 16, 48, 48))
1515 .setLayer(layerR, mLayerZBase + 1)
1516 .apply();
1517 ASSERT_NO_FATAL_FAILURE(
1518 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1519 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001520 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001521}
1522
Alec Mouri80863a62019-01-17 15:19:35 -08001523void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001524 sp<SurfaceControl> layer1;
1525 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001526 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1527 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1528 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1529 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001530
Marissa Wall861616d2018-10-22 12:52:23 -07001531 switch (layerType) {
1532 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1533 Transaction()
1534 .setAlpha(layer1, 0.25f)
1535 .setAlpha(layer2, 0.75f)
1536 .setPosition(layer2, 16, 0)
1537 .setLayer(layer2, mLayerZBase + 1)
1538 .apply();
1539 break;
1540 case ISurfaceComposerClient::eFXSurfaceBufferState:
1541 Transaction()
1542 .setAlpha(layer1, 0.25f)
1543 .setAlpha(layer2, 0.75f)
1544 .setFrame(layer1, Rect(0, 0, 32, 32))
1545 .setFrame(layer2, Rect(16, 0, 48, 32))
1546 .setLayer(layer2, mLayerZBase + 1)
1547 .apply();
1548 break;
1549 default:
1550 ASSERT_FALSE(true) << "Unsupported layer type";
1551 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001552 {
Alec Mouri80863a62019-01-17 15:19:35 -08001553 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001554 uint8_t r = 16; // 64 * 0.25f
1555 uint8_t g = 48; // 64 * 0.75f
1556 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1557 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1558
1559 r /= 4; // r * (1.0f - 0.75f)
1560 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1561 }
1562}
1563
Alec Mouri80863a62019-01-17 15:19:35 -08001564TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001565 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1566}
1567
Alec Mouri80863a62019-01-17 15:19:35 -08001568TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001569 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1570}
1571
Alec Mouri80863a62019-01-17 15:19:35 -08001572TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001573 const Color color = {64, 0, 0, 255};
1574 sp<SurfaceControl> layer;
1575 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001576 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001577
1578 Transaction().setAlpha(layer, 2.0f).apply();
1579 {
1580 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001581 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001582 }
1583
1584 Transaction().setAlpha(layer, -1.0f).apply();
1585 {
1586 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001587 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001588 }
1589}
1590
Alec Mouri80863a62019-01-17 15:19:35 -08001591TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001592 sp<SurfaceControl> layer;
1593 const uint8_t size = 64;
1594 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001595 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001596 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1597 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1598
1599 Transaction()
1600 .setCornerRadius(layer, cornerRadius)
1601 .apply();
1602 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001603 const uint8_t bottom = size - 1;
1604 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001605 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001606 // Transparent corners
1607 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001608 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1609 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1610 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1611 }
1612}
1613
Alec Mouri80863a62019-01-17 15:19:35 -08001614TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001615 sp<SurfaceControl> parent;
1616 sp<SurfaceControl> child;
1617 const uint8_t size = 64;
1618 const uint8_t testArea = 4;
1619 const float cornerRadius = 20.0f;
1620 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1621 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1622 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1623 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1624
1625 Transaction()
1626 .setCornerRadius(parent, cornerRadius)
1627 .reparent(child, parent->getHandle())
1628 .setPosition(child, 0, size / 2)
1629 .apply();
1630 {
1631 const uint8_t bottom = size - 1;
1632 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001633 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001634 // Top edge of child should not have rounded corners because it's translated in the parent
1635 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1636 Color::GREEN);
1637 // But bottom edges should have been clipped according to parent bounds
1638 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1639 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001640 }
1641}
1642
Alec Mouri80863a62019-01-17 15:19:35 -08001643TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001644 sp<SurfaceControl> bufferLayer;
1645 sp<SurfaceControl> colorLayer;
1646 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001647 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001648 ASSERT_NO_FATAL_FAILURE(colorLayer =
1649 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1650 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001651
Vishnu Nair88a11f22018-11-28 18:30:57 -08001652 Transaction()
1653 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1654 .setLayer(colorLayer, mLayerZBase + 1)
1655 .apply();
1656
Chia-I Wue4ef6102017-11-01 15:16:35 -07001657 {
1658 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001659 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001660 }
1661
1662 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1663 const Color expected = {15, 51, 85, 255};
1664 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1665 // channel) should be less than one
1666 const uint8_t tolerance = 1;
1667 Transaction().setColor(colorLayer, color).apply();
1668 {
1669 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001670 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001671 }
1672}
1673
Valerie Haudd0b7572019-01-29 14:59:27 -08001674// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1675// BLUE: prior background color
1676// GREEN: final background color
1677// BLACK: no color or fill
1678void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1679 bool bufferFill, float alpha,
1680 Color finalColor) {
1681 sp<SurfaceControl> layer;
1682 int32_t width = 500;
1683 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001684
Valerie Haudd0b7572019-01-29 14:59:27 -08001685 Color fillColor = Color::RED;
1686 Color priorBgColor = Color::BLUE;
1687 Color expectedColor = Color::BLACK;
1688 switch (layerType) {
1689 case ISurfaceComposerClient::eFXSurfaceColor:
1690 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1691 Transaction()
1692 .setCrop_legacy(layer, Rect(0, 0, width, height))
1693 .setColor(layer, half3(1.0f, 0, 0))
1694 .apply();
1695 expectedColor = fillColor;
1696 break;
1697 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1698 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1699 if (bufferFill) {
1700 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1701 expectedColor = fillColor;
1702 }
1703 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1704 break;
1705 case ISurfaceComposerClient::eFXSurfaceBufferState:
1706 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1707 if (bufferFill) {
1708 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1709 expectedColor = fillColor;
1710 }
1711 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1712 break;
1713 default:
1714 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1715 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001716 }
1717
Valerie Haudd0b7572019-01-29 14:59:27 -08001718 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1719 Transaction()
1720 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1721 .apply();
1722 if (!bufferFill) {
1723 expectedColor = priorBgColor;
1724 }
1725 }
1726
1727 {
1728 SCOPED_TRACE("default before setting background color layer");
1729 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1730 }
Valerie Haua72e2812019-01-23 13:40:39 -08001731 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001732 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001733 .apply();
1734
1735 {
Valerie Haua72e2812019-01-23 13:40:39 -08001736 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001737 shot->expectColor(Rect(0, 0, width, height), finalColor);
1738 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001739 }
1740}
1741
Valerie Haudd0b7572019-01-29 14:59:27 -08001742TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1743 bool priorColor = false;
1744 bool bufferFill = false;
1745 float alpha = 1.0f;
1746 Color finalColor = Color::RED;
1747 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1748 priorColor, bufferFill, alpha, finalColor));
1749}
Valerie Haua72e2812019-01-23 13:40:39 -08001750
Valerie Haudd0b7572019-01-29 14:59:27 -08001751TEST_P(LayerRenderTypeTransactionTest,
1752 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1753 bool priorColor = false;
1754 bool bufferFill = true;
1755 float alpha = 1.0f;
1756 Color finalColor = Color::RED;
1757 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1758 priorColor, bufferFill, alpha, finalColor));
1759}
Valerie Haua72e2812019-01-23 13:40:39 -08001760
Valerie Haudd0b7572019-01-29 14:59:27 -08001761TEST_P(LayerRenderTypeTransactionTest,
1762 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1763 bool priorColor = false;
1764 bool bufferFill = false;
1765 float alpha = 1.0f;
1766 Color finalColor = Color::GREEN;
1767 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1768 priorColor, bufferFill, alpha, finalColor));
1769}
Valerie Haua72e2812019-01-23 13:40:39 -08001770
Valerie Haudd0b7572019-01-29 14:59:27 -08001771TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1772 bool priorColor = true;
1773 bool bufferFill = true;
1774 float alpha = 1.0f;
1775 Color finalColor = Color::RED;
1776 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1777 priorColor, bufferFill, alpha, finalColor));
1778}
1779
1780TEST_P(LayerRenderTypeTransactionTest,
1781 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1782 bool priorColor = true;
1783 bool bufferFill = false;
1784 float alpha = 1.0f;
1785 Color finalColor = Color::GREEN;
1786 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1787 priorColor, bufferFill, alpha, finalColor));
1788}
1789TEST_P(LayerRenderTypeTransactionTest,
1790 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1791 bool priorColor = false;
1792 bool bufferFill = false;
1793 float alpha = 0;
1794 Color finalColor = Color::BLACK;
1795 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1796 priorColor, bufferFill, alpha, finalColor));
1797}
1798
1799TEST_P(LayerRenderTypeTransactionTest,
1800 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1801 bool priorColor = true;
1802 bool bufferFill = false;
1803 float alpha = 0;
1804 Color finalColor = Color::BLACK;
1805 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1806 priorColor, bufferFill, alpha, finalColor));
1807}
1808
1809TEST_P(LayerRenderTypeTransactionTest,
1810 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1811 bool priorColor = false;
1812 bool bufferFill = true;
1813 float alpha = 1.0f;
1814 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001815 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001816 priorColor, bufferFill, alpha, finalColor));
1817}
1818
1819TEST_P(LayerRenderTypeTransactionTest,
1820 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1821 bool priorColor = false;
1822 bool bufferFill = false;
1823 float alpha = 1.0f;
1824 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001825 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001826 priorColor, bufferFill, alpha, finalColor));
1827}
1828
1829TEST_P(LayerRenderTypeTransactionTest,
1830 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1831 bool priorColor = true;
1832 bool bufferFill = false;
1833 float alpha = 1.0f;
1834 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001835 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001836 priorColor, bufferFill, alpha, finalColor));
1837}
1838
1839TEST_P(LayerRenderTypeTransactionTest,
1840 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1841 bool priorColor = false;
1842 bool bufferFill = false;
1843 float alpha = 0;
1844 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001845 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001846 priorColor, bufferFill, alpha, finalColor));
1847}
1848
1849TEST_P(LayerRenderTypeTransactionTest,
1850 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1851 bool priorColor = true;
1852 bool bufferFill = false;
1853 float alpha = 0;
1854 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001855 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001856 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001857}
1858
Alec Mouri80863a62019-01-17 15:19:35 -08001859TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001860 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001861 ASSERT_NO_FATAL_FAILURE(colorLayer =
1862 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1863 ISurfaceComposerClient::eFXSurfaceColor));
1864 Transaction()
1865 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1866 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1867 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001868
Alec Mouri80863a62019-01-17 15:19:35 -08001869 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001870}
1871
Alec Mouri80863a62019-01-17 15:19:35 -08001872TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001873 sp<SurfaceControl> bufferLayer;
1874 sp<SurfaceControl> colorLayer;
1875 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001876 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001877 ASSERT_NO_FATAL_FAILURE(colorLayer =
1878 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1879 ISurfaceComposerClient::eFXSurfaceColor));
1880 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001881
1882 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1883 const float alpha = 0.25f;
1884 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1885 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1886 // channel) should be less than one
1887 const uint8_t tolerance = 1;
1888 Transaction()
1889 .setColor(colorLayer, color)
1890 .setAlpha(colorLayer, alpha)
1891 .setLayer(colorLayer, mLayerZBase + 1)
1892 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001893 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1894 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001895}
1896
Alec Mouri80863a62019-01-17 15:19:35 -08001897TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001898 sp<SurfaceControl> bufferLayer;
1899 sp<SurfaceControl> parentLayer;
1900 sp<SurfaceControl> colorLayer;
1901 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1902 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001903 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001904 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1905 0 /* buffer height */,
1906 ISurfaceComposerClient::eFXSurfaceColor));
1907 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001908 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1909 const float alpha = 0.25f;
1910 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1911 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1912 // channel) should be less than one
1913 const uint8_t tolerance = 1;
1914 Transaction()
1915 .reparent(colorLayer, parentLayer->getHandle())
1916 .setColor(colorLayer, color)
1917 .setAlpha(parentLayer, alpha)
1918 .setLayer(parentLayer, mLayerZBase + 1)
1919 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001920 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1921 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001922}
1923
Alec Mouri80863a62019-01-17 15:19:35 -08001924TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001925 sp<SurfaceControl> bufferLayer;
1926 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001927 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001928
1929 // color is ignored
1930 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001931 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001932}
1933
Alec Mouri80863a62019-01-17 15:19:35 -08001934TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001935 sp<SurfaceControl> layer;
1936 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001937 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001938
1939 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1940 {
1941 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001942 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001943 }
1944
1945 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1946 {
1947 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001948 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001949 }
1950}
1951
wukui117023412020-03-22 20:15:26 +08001952TEST_P(LayerTypeAndRenderTypeTransactionTest, SetBufferFormat) {
1953 int32_t width = 100;
1954 int32_t height = 100;
1955 Rect crop = Rect(0, 0, width, height);
1956
1957 sp<SurfaceControl> behindLayer = createColorLayer("Behind layer", Color::RED);
1958 sp<SurfaceControl> layer;
1959 ASSERT_NO_FATAL_FAILURE(
1960 layer = createLayer("test", width, height, 0, nullptr, PIXEL_FORMAT_RGBX_8888));
1961
1962 Transaction()
1963 .setLayer(layer, INT32_MAX - 1)
1964 .show(layer)
1965 .setLayerStack(behindLayer, mDisplayLayerStack)
1966 .setCrop_legacy(behindLayer, crop)
1967 .setLayer(behindLayer, INT32_MAX - 2)
1968 .show(behindLayer)
1969 .apply();
1970
1971 sp<Surface> surface = layer->getSurface();
1972
1973 sp<GraphicBuffer> buffer =
1974 new GraphicBuffer(width, height, PIXEL_FORMAT_RGBX_8888, 1,
1975 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1976 BufferUsage::COMPOSER_OVERLAY,
1977 "test");
1978 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, crop, Color::TRANSPARENT));
1979
1980 if (mLayerType == ISurfaceComposerClient::eFXSurfaceBufferQueue) {
1981 Surface::attachAndQueueBufferWithDataspace(surface.get(), buffer, ui::Dataspace::V0_SRGB);
1982 } else {
1983 Transaction().setBuffer(layer, buffer).apply();
1984 }
1985
1986 {
1987 SCOPED_TRACE("Buffer Opaque Format");
1988 auto shot = screenshot();
1989 shot->expectColor(crop, Color::BLACK);
1990 }
1991
1992 buffer = new GraphicBuffer(width, height, PIXEL_FORMAT_RGBA_8888, 1,
1993 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1994 BufferUsage::COMPOSER_OVERLAY,
1995 "test");
1996 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, crop, Color::TRANSPARENT));
1997
1998 if (mLayerType == ISurfaceComposerClient::eFXSurfaceBufferQueue) {
1999 Surface::attachAndQueueBufferWithDataspace(surface.get(), buffer, ui::Dataspace::V0_SRGB);
2000 } else {
2001 Transaction().setBuffer(layer, buffer).apply();
2002 }
2003
2004 {
2005 SCOPED_TRACE("Buffer Transparent Format");
2006 auto shot = screenshot();
2007 shot->expectColor(crop, Color::RED);
2008 }
2009}
2010
Alec Mouri80863a62019-01-17 15:19:35 -08002011TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002012 sp<SurfaceControl> layer;
2013 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002014 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2015 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002016
2017 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
2018 {
2019 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08002020 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2021 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002022 }
2023
2024 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
2025 {
2026 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08002027 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
2028 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002029 }
2030
2031 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
2032 {
2033 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08002034 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
2035 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002036 }
2037
2038 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
2039 {
2040 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08002041 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
2042 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002043 }
2044
2045 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
2046 {
2047 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08002048 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
2049 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002050 }
2051}
2052
Alec Mouri80863a62019-01-17 15:19:35 -08002053TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002054 sp<SurfaceControl> layer;
2055 ASSERT_NO_FATAL_FAILURE(
2056 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2057 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2058 Color::BLUE, Color::WHITE));
2059
2060 Transaction()
2061 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
2062 .setFrame(layer, Rect(0, 0, 32, 32))
2063 .apply();
2064 {
2065 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08002066 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2067 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002068 }
2069
2070 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
2071 {
2072 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08002073 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2074 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002075 }
2076
2077 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
2078 {
2079 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08002080 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2081 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002082 }
2083
2084 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
2085 {
2086 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08002087 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2088 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002089 }
2090
2091 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
2092 {
2093 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08002094 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2095 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002096 }
2097}
2098
Alec Mouri80863a62019-01-17 15:19:35 -08002099TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002100 sp<SurfaceControl> layer;
2101 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002102 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2103 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002104
2105 const float rot = M_SQRT1_2; // 45 degrees
2106 const float trans = M_SQRT2 * 16.0f;
2107 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
2108
Alec Mouri80863a62019-01-17 15:19:35 -08002109 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07002110 // check a 8x8 region inside each color
2111 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
2112 const int32_t halfL = 4;
2113 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
2114 };
2115 const int32_t unit = int32_t(trans / 2);
2116 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
2117 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
2118 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
2119 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
2120}
2121
Alec Mouri80863a62019-01-17 15:19:35 -08002122TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002123 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07002124 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2125 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002126
2127 // setMatrix is applied after any pending resize, unlike setPosition
2128 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
2129 {
2130 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002131 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002132 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07002133 shot->expectColor(rect, Color::RED);
2134 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002135 }
2136
Marissa Wall861616d2018-10-22 12:52:23 -07002137 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002138 {
2139 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07002140 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08002141 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002142 }
2143}
2144
Alec Mouri80863a62019-01-17 15:19:35 -08002145TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002146 sp<SurfaceControl> layer;
2147 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002148 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002149
2150 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
2151 Transaction()
2152 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
2153 .setSize(layer, 64, 64)
2154 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2155 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002156 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002157}
2158
Alec Mouri80863a62019-01-17 15:19:35 -08002159TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07002160 sp<SurfaceControl> layer;
2161 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002162 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2163 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07002164
2165 // XXX SCALE_CROP is not respected; calling setSize and
2166 // setOverrideScalingMode in separate transactions does not work
2167 // (b/69315456)
2168 Transaction()
2169 .setSize(layer, 64, 16)
2170 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2171 .apply();
2172 {
2173 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002174 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2175 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002176 }
2177}
2178
Dan Stoza000dd012018-08-01 13:31:52 -07002179TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2180 sp<SurfaceControl> layer;
2181 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2182
2183 sp<IBinder> handle = layer->getHandle();
2184 ASSERT_TRUE(handle != nullptr);
2185
2186 FrameStats frameStats;
2187 mClient->getLayerFrameStats(handle, &frameStats);
2188
2189 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2190}
2191
Alec Mouri80863a62019-01-17 15:19:35 -08002192TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002193 sp<SurfaceControl> layer;
2194 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002195 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002196 const Rect crop(8, 8, 24, 24);
2197
Marissa Wallf58c14b2018-07-24 10:50:43 -07002198 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002199 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002200 shot->expectColor(crop, Color::RED);
2201 shot->expectBorder(crop, Color::BLACK);
2202}
2203
Alec Mouri80863a62019-01-17 15:19:35 -08002204TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002205 sp<SurfaceControl> layer;
2206 ASSERT_NO_FATAL_FAILURE(
2207 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2208 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2209 const Rect crop(8, 8, 24, 24);
2210
2211 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002212 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002213 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2214 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002215}
2216
Alec Mouri80863a62019-01-17 15:19:35 -08002217TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002218 sp<SurfaceControl> layer;
2219 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002220 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002221
2222 {
2223 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002224 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002225 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002226 }
2227
2228 {
2229 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002230 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002231 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002232 }
2233}
2234
Alec Mouri80863a62019-01-17 15:19:35 -08002235TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002236 sp<SurfaceControl> layer;
2237 ASSERT_NO_FATAL_FAILURE(
2238 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2239 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2240
2241 {
2242 SCOPED_TRACE("empty rect");
2243 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002244 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002245 }
2246
2247 {
2248 SCOPED_TRACE("negative rect");
2249 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002250 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002251 }
2252}
2253
Alec Mouri80863a62019-01-17 15:19:35 -08002254TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002255 sp<SurfaceControl> layer;
2256 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002257 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002258
Marissa Wallf58c14b2018-07-24 10:50:43 -07002259 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002260 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002261 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2262 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2263}
2264
Alec Mouri80863a62019-01-17 15:19:35 -08002265TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002266 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002267 ASSERT_NO_FATAL_FAILURE(
2268 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002269 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002270 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002271 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2272 BufferUsage::COMPOSER_OVERLAY,
2273 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002274 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2275 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2276
2277 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002278
2279 Transaction().setBuffer(layer, buffer).apply();
2280
2281 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002282 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002283 {
2284 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002285 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002286 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2287 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002288 }
2289
2290 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002291 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002292 {
2293 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002294 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002295 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2296 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002297 }
2298
2299 // Fully out of buffer space bounds
2300 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2301 {
2302 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002303 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002304 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2305 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2306 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002307 }
2308}
2309
Alec Mouri80863a62019-01-17 15:19:35 -08002310TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002311 sp<SurfaceControl> layer;
2312 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002313 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002314
2315 const Point position(32, 32);
2316 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002317 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002318 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002319 shot->expectColor(crop + position, Color::RED);
2320 shot->expectBorder(crop + position, Color::BLACK);
2321}
2322
Alec Mouri80863a62019-01-17 15:19:35 -08002323TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002324 sp<SurfaceControl> layer;
2325 ASSERT_NO_FATAL_FAILURE(
2326 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2327 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2328
Marissa Wall861616d2018-10-22 12:52:23 -07002329 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002330 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002331 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002332 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002333 shot->expectColor(frame, Color::RED);
2334 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002335}
2336
Alec Mouri80863a62019-01-17 15:19:35 -08002337TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002338 sp<SurfaceControl> layer;
2339 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002340 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002341
Marissa Wall861616d2018-10-22 12:52:23 -07002342 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002343 Transaction()
2344 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002345 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002346 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002347 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002348 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2349 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2350}
2351
Alec Mouri80863a62019-01-17 15:19:35 -08002352TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002353 sp<SurfaceControl> layer;
2354 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002355 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002356
Marissa Wallf58c14b2018-07-24 10:50:43 -07002357 // setCrop_legacy is applied immediately by default, with or without resize pending
2358 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002359 {
2360 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002361 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002362 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2363 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2364 }
2365
Marissa Wall61c58622018-07-18 10:12:20 -07002366 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002367 {
2368 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002369 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002370 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2371 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2372 }
2373}
2374
Alec Mouri80863a62019-01-17 15:19:35 -08002375TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002376 sp<SurfaceControl> layer;
2377 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002378 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002379
Marissa Wallf58c14b2018-07-24 10:50:43 -07002380 // request setCrop_legacy to be applied with the next resize
2381 Transaction()
2382 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2383 .setGeometryAppliesWithResize(layer)
2384 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002385 {
2386 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002387 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002388 }
2389
Marissa Wallf58c14b2018-07-24 10:50:43 -07002390 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002391 {
2392 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002393 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002394 }
2395
2396 Transaction().setSize(layer, 16, 16).apply();
2397 {
2398 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002399 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002400 }
2401
2402 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002403 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002404 {
2405 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002406 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002407 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2408 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2409 }
2410}
2411
Alec Mouri80863a62019-01-17 15:19:35 -08002412TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002413 sp<SurfaceControl> layer;
2414 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002415 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002416
Marissa Wallf58c14b2018-07-24 10:50:43 -07002417 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002418 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002419 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002420 .setSize(layer, 16, 16)
2421 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2422 .setGeometryAppliesWithResize(layer)
2423 .apply();
2424 {
2425 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002426 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002427 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2428 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2429 }
2430
2431 // XXX crop is never latched without other geometry change (b/69315677)
2432 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002433 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002434 Transaction().setPosition(layer, 0, 0).apply();
2435 {
2436 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002437 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002438 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2439 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2440 }
2441}
2442
Alec Mouri80863a62019-01-17 15:19:35 -08002443TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002444 sp<SurfaceControl> layer;
2445 ASSERT_NO_FATAL_FAILURE(
2446 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2447 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2448 const Rect frame(8, 8, 24, 24);
2449
2450 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002451 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002452 shot->expectColor(frame, Color::RED);
2453 shot->expectBorder(frame, Color::BLACK);
2454}
2455
Alec Mouri80863a62019-01-17 15:19:35 -08002456TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002457 sp<SurfaceControl> layer;
2458 ASSERT_NO_FATAL_FAILURE(
2459 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2460 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2461
Marissa Wall61c58622018-07-18 10:12:20 -07002462 {
Marissa Wall861616d2018-10-22 12:52:23 -07002463 SCOPED_TRACE("empty rect");
2464 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002465 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002466 }
2467
Marissa Wall61c58622018-07-18 10:12:20 -07002468 {
Marissa Wall861616d2018-10-22 12:52:23 -07002469 SCOPED_TRACE("negative rect");
2470 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002471 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002472 }
2473}
2474
Alec Mouri80863a62019-01-17 15:19:35 -08002475TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002476 sp<SurfaceControl> layer;
2477 ASSERT_NO_FATAL_FAILURE(
2478 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2479 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2480
2481 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002482 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002483 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2484 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002485}
2486
Alec Mouri80863a62019-01-17 15:19:35 -08002487TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002488 sp<SurfaceControl> parent, child;
2489 ASSERT_NO_FATAL_FAILURE(
2490 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2491 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2492 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2493
2494 ASSERT_NO_FATAL_FAILURE(
2495 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2496 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2497
2498 Transaction().reparent(child, parent->getHandle()).apply();
2499
2500 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002501 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002502 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2503 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2504}
2505
Alec Mouri80863a62019-01-17 15:19:35 -08002506TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002507 sp<SurfaceControl> parent, child;
2508 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2510
2511 ASSERT_NO_FATAL_FAILURE(
2512 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2513 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2514
2515 Transaction().reparent(child, parent->getHandle()).apply();
2516
2517 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002518 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002519 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2520 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2521}
2522
Alec Mouri80863a62019-01-17 15:19:35 -08002523TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002524 sp<SurfaceControl> layer;
2525 ASSERT_NO_FATAL_FAILURE(
2526 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2527 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2528 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2529
2530 std::this_thread::sleep_for(500ms);
2531
2532 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2533
Alec Mouri80863a62019-01-17 15:19:35 -08002534 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002535 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2536 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2537}
2538
Alec Mouri80863a62019-01-17 15:19:35 -08002539TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002540 sp<SurfaceControl> parent, child;
2541 ASSERT_NO_FATAL_FAILURE(
2542 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2543 ASSERT_NO_FATAL_FAILURE(
2544 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2545 Transaction().reparent(child, parent->getHandle()).apply();
2546
2547 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2548 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2549
2550 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2551 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2552
Alec Mouri80863a62019-01-17 15:19:35 -08002553 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002554 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2555 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2556 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2557}
2558
Alec Mouri80863a62019-01-17 15:19:35 -08002559TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002560 sp<SurfaceControl> layer;
2561 ASSERT_NO_FATAL_FAILURE(
2562 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2563
2564 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2565
Alec Mouri80863a62019-01-17 15:19:35 -08002566 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002567 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2568 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002569}
2570
Alec Mouri80863a62019-01-17 15:19:35 -08002571TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002572 sp<SurfaceControl> layer;
2573 ASSERT_NO_FATAL_FAILURE(
2574 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2575
2576 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2577
2578 {
2579 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002580 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002581 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2582 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002583 }
2584
2585 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2586
2587 {
2588 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002589 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002590 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2591 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002592 }
2593
2594 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2595
2596 {
2597 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002598 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002599 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2600 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002601 }
2602}
2603
Alec Mouri80863a62019-01-17 15:19:35 -08002604TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002605 sp<SurfaceControl> layer1;
2606 ASSERT_NO_FATAL_FAILURE(
2607 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2608
2609 sp<SurfaceControl> layer2;
2610 ASSERT_NO_FATAL_FAILURE(
2611 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2612
2613 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2614
Marissa Wall861616d2018-10-22 12:52:23 -07002615 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002616 {
2617 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002618 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002619 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2620 }
2621
2622 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2623
Marissa Wall861616d2018-10-22 12:52:23 -07002624 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002625 {
2626 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002627 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002628 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2629 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2630 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2631 }
2632
2633 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2634 {
2635 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002636 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002637 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2638 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2639 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2640 }
2641
2642 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2643
2644 {
2645 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002646 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002647 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2648 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2649 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2650 }
2651}
2652
Valerie Haua6b15a12019-02-05 14:16:30 -08002653TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002654 sp<SurfaceControl> layer;
2655 ASSERT_NO_FATAL_FAILURE(
2656 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2657
2658 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2659
2660 std::array<sp<GraphicBuffer>, 10> buffers;
2661
2662 size_t idx = 0;
2663 for (auto& buffer : buffers) {
2664 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2665 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2666 BufferUsage::COMPOSER_OVERLAY,
2667 "test");
2668 Color color = colors[idx % colors.size()];
2669 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2670 idx++;
2671 }
2672
2673 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2674 // cache is working.
2675 idx = 0;
2676 for (auto& buffer : buffers) {
2677 for (int i = 0; i < 2; i++) {
2678 Transaction().setBuffer(layer, buffer).apply();
2679
2680 Color color = colors[idx % colors.size()];
2681 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002682 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2683 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002684 }
2685 idx++;
2686 }
2687}
2688
Valerie Haua6b15a12019-02-05 14:16:30 -08002689TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002690 sp<SurfaceControl> layer;
2691 ASSERT_NO_FATAL_FAILURE(
2692 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2693
2694 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2695
2696 std::array<sp<GraphicBuffer>, 70> buffers;
2697
2698 size_t idx = 0;
2699 for (auto& buffer : buffers) {
2700 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2701 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2702 BufferUsage::COMPOSER_OVERLAY,
2703 "test");
2704 Color color = colors[idx % colors.size()];
2705 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2706 idx++;
2707 }
2708
2709 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2710 // cache is working.
2711 idx = 0;
2712 for (auto& buffer : buffers) {
2713 for (int i = 0; i < 2; i++) {
2714 Transaction().setBuffer(layer, buffer).apply();
2715
2716 Color color = colors[idx % colors.size()];
2717 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002718 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2719 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002720 }
2721 idx++;
2722 }
2723}
2724
Valerie Haua6b15a12019-02-05 14:16:30 -08002725TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002726 sp<SurfaceControl> layer;
2727 ASSERT_NO_FATAL_FAILURE(
2728 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2729
2730 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2731
2732 std::array<sp<GraphicBuffer>, 65> buffers;
2733
2734 size_t idx = 0;
2735 for (auto& buffer : buffers) {
2736 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2737 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2738 BufferUsage::COMPOSER_OVERLAY,
2739 "test");
2740 Color color = colors[idx % colors.size()];
2741 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2742 idx++;
2743 }
2744
2745 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2746 // cache is working.
2747 idx = 0;
2748 for (auto& buffer : buffers) {
2749 for (int i = 0; i < 2; i++) {
2750 Transaction().setBuffer(layer, buffer).apply();
2751
2752 Color color = colors[idx % colors.size()];
2753 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002754 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2755 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002756 }
2757 if (idx == 0) {
2758 buffers[0].clear();
2759 }
2760 idx++;
2761 }
2762}
2763
Alec Mouri80863a62019-01-17 15:19:35 -08002764TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002765 sp<SurfaceControl> layer;
2766 ASSERT_NO_FATAL_FAILURE(
2767 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2768
2769 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2770 Color::BLUE, Color::WHITE));
2771
Marissa Wall861616d2018-10-22 12:52:23 -07002772 Transaction()
2773 .setFrame(layer, Rect(0, 0, 32, 32))
2774 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2775 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002776
Alec Mouri80863a62019-01-17 15:19:35 -08002777 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2778 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002779}
2780
Alec Mouri80863a62019-01-17 15:19:35 -08002781TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002782 sp<SurfaceControl> layer;
2783 ASSERT_NO_FATAL_FAILURE(
2784 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2785
2786 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2787 Color::BLUE, Color::WHITE));
2788
Marissa Wall861616d2018-10-22 12:52:23 -07002789 Transaction()
2790 .setFrame(layer, Rect(0, 0, 32, 32))
2791 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2792 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002793
Alec Mouri80863a62019-01-17 15:19:35 -08002794 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2795 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002796}
2797
Alec Mouri80863a62019-01-17 15:19:35 -08002798TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002799 sp<SurfaceControl> layer;
2800 ASSERT_NO_FATAL_FAILURE(
2801 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2802
2803 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2804 Color::BLUE, Color::WHITE));
2805
Marissa Wall861616d2018-10-22 12:52:23 -07002806 Transaction()
2807 .setFrame(layer, Rect(0, 0, 32, 32))
2808 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2809 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002810
Alec Mouri80863a62019-01-17 15:19:35 -08002811 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2812 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002813}
2814
2815TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2816 sp<SurfaceControl> layer;
2817 ASSERT_NO_FATAL_FAILURE(
2818 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2819
2820 Transaction().setTransformToDisplayInverse(layer, false).apply();
2821
2822 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2823
2824 Transaction().setTransformToDisplayInverse(layer, true).apply();
2825}
2826
Alec Mouri80863a62019-01-17 15:19:35 -08002827TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002828 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002829 Transaction transaction;
2830 ASSERT_NO_FATAL_FAILURE(
2831 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2832
2833 sp<GraphicBuffer> buffer =
2834 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2835 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2836 BufferUsage::COMPOSER_OVERLAY,
2837 "test");
2838 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2839
2840 sp<Fence> fence;
2841 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2842 GTEST_SUCCEED() << "test not supported";
2843 return;
2844 }
2845
2846 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2847
2848 status_t status = fence->wait(1000);
2849 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2850 std::this_thread::sleep_for(200ms);
2851
Alec Mouri80863a62019-01-17 15:19:35 -08002852 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002853 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2854 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002855}
2856
Alec Mouri80863a62019-01-17 15:19:35 -08002857TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002858 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002859 ASSERT_NO_FATAL_FAILURE(
2860 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2861
2862 sp<GraphicBuffer> buffer =
2863 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2864 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2865 BufferUsage::COMPOSER_OVERLAY,
2866 "test");
2867 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2868
Marissa Wallfda30bb2018-10-12 11:34:28 -07002869 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002870
2871 Transaction()
2872 .setBuffer(layer, buffer)
2873 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002874 .apply();
2875
Alec Mouri80863a62019-01-17 15:19:35 -08002876 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002877 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2878 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002879}
2880
Alec Mouri80863a62019-01-17 15:19:35 -08002881TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002882 sp<SurfaceControl> layer;
2883 ASSERT_NO_FATAL_FAILURE(
2884 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2885
2886 sp<GraphicBuffer> buffer =
2887 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2888 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2889 BufferUsage::COMPOSER_OVERLAY,
2890 "test");
2891 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2892
2893 Transaction()
2894 .setBuffer(layer, buffer)
2895 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002896 .apply();
2897
Alec Mouri80863a62019-01-17 15:19:35 -08002898 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002899 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2900 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002901}
2902
Alec Mouri80863a62019-01-17 15:19:35 -08002903TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002904 sp<SurfaceControl> layer;
2905 ASSERT_NO_FATAL_FAILURE(
2906 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2907
2908 sp<GraphicBuffer> buffer =
2909 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2910 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2911 BufferUsage::COMPOSER_OVERLAY,
2912 "test");
2913 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2914
2915 HdrMetadata hdrMetadata;
2916 hdrMetadata.validTypes = 0;
2917 Transaction()
2918 .setBuffer(layer, buffer)
2919 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002920 .apply();
2921
Alec Mouri80863a62019-01-17 15:19:35 -08002922 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002923 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2924 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002925}
2926
Alec Mouri80863a62019-01-17 15:19:35 -08002927TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002928 sp<SurfaceControl> layer;
2929 ASSERT_NO_FATAL_FAILURE(
2930 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2931
2932 sp<GraphicBuffer> buffer =
2933 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2934 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2935 BufferUsage::COMPOSER_OVERLAY,
2936 "test");
2937 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2938
2939 Region region;
2940 region.set(32, 32);
2941 Transaction()
2942 .setBuffer(layer, buffer)
2943 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002944 .apply();
2945
Alec Mouri80863a62019-01-17 15:19:35 -08002946 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002947 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2948 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002949}
2950
Alec Mouri80863a62019-01-17 15:19:35 -08002951TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002952 sp<SurfaceControl> layer;
2953 ASSERT_NO_FATAL_FAILURE(
2954 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2955
2956 sp<GraphicBuffer> buffer =
2957 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2958 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2959 BufferUsage::COMPOSER_OVERLAY,
2960 "test");
2961 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2962
2963 Transaction()
2964 .setBuffer(layer, buffer)
2965 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002966 .apply();
2967
Alec Mouri80863a62019-01-17 15:19:35 -08002968 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002969 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2970 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002971}
2972
2973TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2974 sp<SurfaceControl> layer;
2975 ASSERT_NO_FATAL_FAILURE(
2976 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2977
2978 // verify this doesn't cause a crash
2979 Transaction().setSidebandStream(layer, nullptr).apply();
2980}
2981
Robert Carr54cf5b12019-01-25 14:02:28 -08002982TEST_F(LayerTransactionTest, ReparentToSelf) {
2983 sp<SurfaceControl> layer;
2984 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2985 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2986 Transaction().reparent(layer, layer->getHandle()).apply();
2987
2988 {
2989 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2990 // to still be functioning.
2991 SCOPED_TRACE("after reparent to self");
2992 const Rect rect(0, 0, 32, 32);
2993 auto shot = screenshot();
2994 shot->expectColor(rect, Color::RED);
2995 shot->expectBorder(rect, Color::BLACK);
2996 }
2997}
2998
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002999class ColorTransformHelper {
3000public:
3001 static void DegammaColorSingle(half& s) {
3002 if (s <= 0.03928f)
3003 s = s / 12.92f;
3004 else
3005 s = pow((s + 0.055f) / 1.055f, 2.4f);
3006 }
3007
3008 static void DegammaColor(half3& color) {
3009 DegammaColorSingle(color.r);
3010 DegammaColorSingle(color.g);
3011 DegammaColorSingle(color.b);
3012 }
3013
3014 static void GammaColorSingle(half& s) {
3015 if (s <= 0.0031308f) {
3016 s = s * 12.92f;
3017 } else {
3018 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
3019 }
3020 }
3021
3022 static void GammaColor(half3& color) {
3023 GammaColorSingle(color.r);
3024 GammaColorSingle(color.g);
3025 GammaColorSingle(color.b);
3026 }
3027
3028 static void applyMatrix(half3& color, const mat3& mat) {
3029 half3 ret = half3(0);
3030
3031 for (int i = 0; i < 3; i++) {
3032 for (int j = 0; j < 3; j++) {
3033 ret[i] = ret[i] + color[j] * mat[j][i];
3034 }
3035 }
3036 color = ret;
3037 }
3038};
3039
Alec Mouri80863a62019-01-17 15:19:35 -08003040TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07003041 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08003042 ASSERT_NO_FATAL_FAILURE(colorLayer =
3043 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3044 ISurfaceComposerClient::eFXSurfaceColor));
3045 Transaction()
3046 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3047 .setLayer(colorLayer, mLayerZBase + 1)
3048 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07003049 {
3050 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003051 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07003052 }
3053
3054 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07003055 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07003056 mat3 matrix;
3057 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
3058 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
3059 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07003060
3061 // degamma before applying the matrix
3062 if (mColorManagementUsed) {
3063 ColorTransformHelper::DegammaColor(expected);
3064 }
3065
3066 ColorTransformHelper::applyMatrix(expected, matrix);
3067
3068 if (mColorManagementUsed) {
3069 ColorTransformHelper::GammaColor(expected);
3070 }
3071
3072 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3073 uint8_t(expected.b * 255), 255};
3074
3075 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3076 // channel) should be less than one
3077 const uint8_t tolerance = 1;
3078
Peiyong Lind3788632018-09-18 16:01:31 -07003079 Transaction().setColor(colorLayer, color)
3080 .setColorTransform(colorLayer, matrix, vec3()).apply();
3081 {
3082 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003083 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07003084 }
3085}
3086
Alec Mouri80863a62019-01-17 15:19:35 -08003087TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08003088 sp<SurfaceControl> parentLayer;
3089 sp<SurfaceControl> colorLayer;
3090 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3091 0 /* buffer height */,
3092 ISurfaceComposerClient::eFXSurfaceContainer));
3093 ASSERT_NO_FATAL_FAILURE(
3094 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3095 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3096
3097 Transaction()
3098 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3099 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3100 .setLayer(parentLayer, mLayerZBase + 1)
3101 .apply();
3102 {
3103 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003104 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003105 }
3106
3107 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3108 half3 expected = color;
3109 mat3 matrix;
3110 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
3111 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
3112 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
3113
3114 // degamma before applying the matrix
3115 if (mColorManagementUsed) {
3116 ColorTransformHelper::DegammaColor(expected);
3117 }
3118
3119 ColorTransformHelper::applyMatrix(expected, matrix);
3120
3121 if (mColorManagementUsed) {
3122 ColorTransformHelper::GammaColor(expected);
3123 }
3124
3125 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3126 uint8_t(expected.b * 255), 255};
3127
3128 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3129 // channel) should be less than one
3130 const uint8_t tolerance = 1;
3131
3132 Transaction()
3133 .setColor(colorLayer, color)
3134 .setColorTransform(parentLayer, matrix, vec3())
3135 .apply();
3136 {
3137 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003138 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003139 }
3140}
3141
Alec Mouri80863a62019-01-17 15:19:35 -08003142TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08003143 sp<SurfaceControl> parentLayer;
3144 sp<SurfaceControl> colorLayer;
3145 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3146 0 /* buffer height */,
3147 ISurfaceComposerClient::eFXSurfaceContainer));
3148 ASSERT_NO_FATAL_FAILURE(
3149 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3150 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3151
3152 Transaction()
3153 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3154 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3155 .setLayer(parentLayer, mLayerZBase + 1)
3156 .apply();
3157 {
3158 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003159 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003160 }
3161
3162 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3163 half3 expected = color;
3164 mat3 matrixChild;
3165 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
3166 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
3167 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
3168 mat3 matrixParent;
3169 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
3170 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
3171 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3172
3173 // degamma before applying the matrix
3174 if (mColorManagementUsed) {
3175 ColorTransformHelper::DegammaColor(expected);
3176 }
3177
3178 ColorTransformHelper::applyMatrix(expected, matrixChild);
3179 ColorTransformHelper::applyMatrix(expected, matrixParent);
3180
3181 if (mColorManagementUsed) {
3182 ColorTransformHelper::GammaColor(expected);
3183 }
3184
3185 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3186 uint8_t(expected.b * 255), 255};
3187
3188 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3189 // channel) should be less than one
3190 const uint8_t tolerance = 1;
3191
3192 Transaction()
3193 .setColor(colorLayer, color)
3194 .setColorTransform(parentLayer, matrixParent, vec3())
3195 .setColorTransform(colorLayer, matrixChild, vec3())
3196 .apply();
3197 {
3198 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003199 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003200 }
3201}
3202
Marissa Wall80d94ad2019-01-18 16:04:36 -08003203struct CallbackData {
3204 CallbackData() = default;
3205 CallbackData(nsecs_t time, const sp<Fence>& fence,
3206 const std::vector<SurfaceControlStats>& stats)
3207 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3208
3209 nsecs_t latchTime;
3210 sp<Fence> presentFence;
3211 std::vector<SurfaceControlStats> surfaceControlStats;
3212};
3213
Marissa Wallfda30bb2018-10-12 11:34:28 -07003214class ExpectedResult {
3215public:
3216 enum Transaction {
3217 NOT_PRESENTED = 0,
3218 PRESENTED,
3219 };
3220
3221 enum Buffer {
3222 NOT_ACQUIRED = 0,
3223 ACQUIRED,
3224 };
3225
3226 enum PreviousBuffer {
3227 NOT_RELEASED = 0,
3228 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003229 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003230 };
3231
3232 void reset() {
3233 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3234 mExpectedSurfaceResults.clear();
3235 }
3236
3237 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003238 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003239 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3240 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003241 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003242 std::forward_as_tuple(bufferResult, previousBufferResult));
3243 }
3244
3245 void addSurfaces(ExpectedResult::Transaction transactionResult,
3246 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003247 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003248 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3249 for (const auto& layer : layers) {
3250 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3251 }
3252 }
3253
Marissa Wall17b4e452018-12-26 16:32:34 -08003254 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3255 mExpectedPresentTime = expectedPresentTime;
3256 }
3257
Marissa Wall80d94ad2019-01-18 16:04:36 -08003258 void verifyCallbackData(const CallbackData& callbackData) const {
3259 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003260 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3261 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003262 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003263 if (mExpectedPresentTime >= 0) {
3264 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3265 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3266 // if the panel is running at 30 hz, at the worst case, our expected time just
3267 // misses vsync and we have to wait another 33.3ms
3268 ASSERT_LE(presentFence->getSignalTime(),
3269 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3270 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003271 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003272 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003273 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3274 }
3275
Marissa Wall80d94ad2019-01-18 16:04:36 -08003276 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003277 << "wrong number of surfaces";
3278
Marissa Wall80d94ad2019-01-18 16:04:36 -08003279 for (const auto& stats : surfaceControlStats) {
3280 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3281
Marissa Wallfda30bb2018-10-12 11:34:28 -07003282 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3283 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3284 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003285 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003286 }
3287 }
3288
3289private:
3290 class ExpectedSurfaceResult {
3291 public:
3292 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3293 ExpectedResult::PreviousBuffer previousBufferResult)
3294 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3295
Marissa Wall80d94ad2019-01-18 16:04:36 -08003296 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3297 nsecs_t latchTime) const {
3298 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003299
3300 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3301 << "bad acquire time";
3302 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003303
3304 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3305 ASSERT_NE(previousReleaseFence, nullptr)
3306 << "failed to set release prev buffer fence";
3307 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3308 ASSERT_EQ(previousReleaseFence, nullptr)
3309 << "should not have set released prev buffer fence";
3310 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003311 }
3312
3313 private:
3314 ExpectedResult::Buffer mBufferResult;
3315 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3316 };
3317
Marissa Wall80d94ad2019-01-18 16:04:36 -08003318 struct SCHash {
3319 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3320 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003321 }
3322 };
3323 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003324 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003325 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003326};
3327
3328class CallbackHelper {
3329public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003330 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3331 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003332 if (!callbackContext) {
3333 ALOGE("failed to get callback context");
3334 }
3335 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3336 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003337 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003338 helper->mConditionVariable.notify_all();
3339 }
3340
Marissa Wall80d94ad2019-01-18 16:04:36 -08003341 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003342 std::unique_lock lock(mMutex);
3343
Marissa Wall80d94ad2019-01-18 16:04:36 -08003344 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003345 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3346 std::cv_status::timeout)
3347 << "did not receive callback";
3348 }
3349
Marissa Wall80d94ad2019-01-18 16:04:36 -08003350 *outData = std::move(mCallbackDataQueue.front());
3351 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003352 }
3353
3354 void verifyFinalState() {
3355 // Wait to see if there are extra callbacks
3356 std::this_thread::sleep_for(500ms);
3357
3358 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003359 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3360 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003361 }
3362
3363 void* getContext() { return static_cast<void*>(this); }
3364
3365 std::mutex mMutex;
3366 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003367 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003368};
3369
3370class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003371public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003372 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003373 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003374 }
3375
Marissa Wall713b63f2018-10-17 15:42:43 -07003376 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003377 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3378 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003379 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003380 sp<GraphicBuffer> buffer;
3381 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003382 if (setBuffer) {
3383 int err = getBuffer(&buffer, &fence);
3384 if (err != NO_ERROR) {
3385 return err;
3386 }
3387
3388 transaction.setBuffer(layer, buffer);
3389 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003390 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003391
Valerie Hauaa194562019-02-05 16:21:38 -08003392 if (setBackgroundColor) {
3393 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3394 ui::Dataspace::UNKNOWN);
3395 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003396 }
3397
3398 transaction.addTransactionCompletedCallback(callbackHelper->function,
3399 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003400 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003401 }
3402
Marissa Wall861616d2018-10-22 12:52:23 -07003403 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3404 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003405 CallbackData callbackData;
3406 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3407 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003408
3409 if (finalState) {
3410 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3411 }
3412 }
3413
Marissa Wall861616d2018-10-22 12:52:23 -07003414 static void waitForCallbacks(CallbackHelper& helper,
3415 const std::vector<ExpectedResult>& expectedResults,
3416 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003417 for (const auto& expectedResult : expectedResults) {
3418 waitForCallback(helper, expectedResult);
3419 }
3420 if (finalState) {
3421 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3422 }
3423 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003424};
3425
Valerie Hauaa194562019-02-05 16:21:38 -08003426TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003427 sp<SurfaceControl> layer;
3428 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3429
3430 Transaction transaction;
3431 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003432 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003433 if (err) {
3434 GTEST_SUCCEED() << "test not supported";
3435 return;
3436 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003437
3438 transaction.apply();
3439
3440 ExpectedResult expected;
3441 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3442 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3443}
3444
Valerie Hauaa194562019-02-05 16:21:38 -08003445TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003446 sp<SurfaceControl> layer;
3447 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3448
3449 Transaction transaction;
3450 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003451 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003452 if (err) {
3453 GTEST_SUCCEED() << "test not supported";
3454 return;
3455 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003456
Marissa Wall861616d2018-10-22 12:52:23 -07003457 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003458
3459 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003460 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3461 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003462 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3463}
3464
Valerie Hauaa194562019-02-05 16:21:38 -08003465TEST_F(LayerCallbackTest, BufferNoColor) {
3466 sp<SurfaceControl> layer;
3467 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3468
3469 Transaction transaction;
3470 CallbackHelper callback;
3471 int err = fillTransaction(transaction, &callback, layer, true, false);
3472 if (err) {
3473 GTEST_SUCCEED() << "test not supported";
3474 return;
3475 }
3476
3477 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3478
3479 ExpectedResult expected;
3480 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3481 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3482}
3483
3484TEST_F(LayerCallbackTest, NoBufferColor) {
3485 sp<SurfaceControl> layer;
3486 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3487
3488 Transaction transaction;
3489 CallbackHelper callback;
3490 int err = fillTransaction(transaction, &callback, layer, false, true);
3491 if (err) {
3492 GTEST_SUCCEED() << "test not supported";
3493 return;
3494 }
3495
3496 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3497
3498 ExpectedResult expected;
3499 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3500 ExpectedResult::Buffer::NOT_ACQUIRED);
3501 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3502}
3503
Marissa Wallfda30bb2018-10-12 11:34:28 -07003504TEST_F(LayerCallbackTest, NoStateChange) {
3505 Transaction transaction;
3506 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003507 int err = fillTransaction(transaction, &callback);
3508 if (err) {
3509 GTEST_SUCCEED() << "test not supported";
3510 return;
3511 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003512
3513 transaction.apply();
3514
3515 ExpectedResult expected;
3516 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3517}
3518
3519TEST_F(LayerCallbackTest, OffScreen) {
3520 sp<SurfaceControl> layer;
3521 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3522
3523 Transaction transaction;
3524 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003525 int err = fillTransaction(transaction, &callback, layer);
3526 if (err) {
3527 GTEST_SUCCEED() << "test not supported";
3528 return;
3529 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003530
Marissa Wall861616d2018-10-22 12:52:23 -07003531 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003532
3533 ExpectedResult expected;
3534 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3535 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3536}
3537
Valerie Hauaa194562019-02-05 16:21:38 -08003538TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003539 sp<SurfaceControl> layer1, layer2;
3540 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3541 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3542
3543 Transaction transaction1, transaction2;
3544 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003545 int err = fillTransaction(transaction1, &callback1, layer1);
3546 if (err) {
3547 GTEST_SUCCEED() << "test not supported";
3548 return;
3549 }
3550 err = fillTransaction(transaction2, &callback2, layer2);
3551 if (err) {
3552 GTEST_SUCCEED() << "test not supported";
3553 return;
3554 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003555
Marissa Wall861616d2018-10-22 12:52:23 -07003556 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3557 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003558
3559 ExpectedResult expected;
3560 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3561 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3562 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3563}
3564
Valerie Hauaa194562019-02-05 16:21:38 -08003565TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3566 sp<SurfaceControl> layer1, layer2;
3567 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3568 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3569
3570 Transaction transaction1, transaction2;
3571 CallbackHelper callback1, callback2;
3572 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3573 if (err) {
3574 GTEST_SUCCEED() << "test not supported";
3575 return;
3576 }
3577 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3578 if (err) {
3579 GTEST_SUCCEED() << "test not supported";
3580 return;
3581 }
3582
3583 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3584 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3585
3586 ExpectedResult expected;
3587 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3588 ExpectedResult::Buffer::NOT_ACQUIRED);
3589 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3590 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3591}
3592
3593TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3594 sp<SurfaceControl> layer1, layer2;
3595 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3596 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3597
3598 Transaction transaction1, transaction2;
3599 CallbackHelper callback1, callback2;
3600 int err = fillTransaction(transaction1, &callback1, layer1);
3601 if (err) {
3602 GTEST_SUCCEED() << "test not supported";
3603 return;
3604 }
3605 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3606 if (err) {
3607 GTEST_SUCCEED() << "test not supported";
3608 return;
3609 }
3610
3611 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3612 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3613
3614 ExpectedResult expected;
3615 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3616 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3617 ExpectedResult::Buffer::NOT_ACQUIRED);
3618 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3619 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3620}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003621TEST_F(LayerCallbackTest, Merge_SameCallback) {
3622 sp<SurfaceControl> layer1, layer2;
3623 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3624 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3625
3626 Transaction transaction1, transaction2;
3627 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003628 int err = fillTransaction(transaction1, &callback, layer1);
3629 if (err) {
3630 GTEST_SUCCEED() << "test not supported";
3631 return;
3632 }
3633 err = fillTransaction(transaction2, &callback, layer2);
3634 if (err) {
3635 GTEST_SUCCEED() << "test not supported";
3636 return;
3637 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003638
3639 transaction2.merge(std::move(transaction1)).apply();
3640
3641 ExpectedResult expected;
3642 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3643 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3644 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3645}
3646
3647TEST_F(LayerCallbackTest, Merge_SameLayer) {
3648 sp<SurfaceControl> layer;
3649 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3650
3651 Transaction transaction1, transaction2;
3652 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003653 int err = fillTransaction(transaction1, &callback1, layer);
3654 if (err) {
3655 GTEST_SUCCEED() << "test not supported";
3656 return;
3657 }
3658 err = fillTransaction(transaction2, &callback2, layer);
3659 if (err) {
3660 GTEST_SUCCEED() << "test not supported";
3661 return;
3662 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003663
3664 transaction2.merge(std::move(transaction1)).apply();
3665
3666 ExpectedResult expected;
3667 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3668 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3669 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3670}
3671
Marissa Wallfda30bb2018-10-12 11:34:28 -07003672TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3673 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3674 client2(new SurfaceComposerClient);
3675
3676 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3677 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3678
3679 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003680 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003681 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003682 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003683 ISurfaceComposerClient::eFXSurfaceBufferState));
3684
3685 Transaction transaction1, transaction2;
3686 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003687 int err = fillTransaction(transaction1, &callback1, layer1);
3688 if (err) {
3689 GTEST_SUCCEED() << "test not supported";
3690 return;
3691 }
3692 err = fillTransaction(transaction2, &callback2, layer2);
3693 if (err) {
3694 GTEST_SUCCEED() << "test not supported";
3695 return;
3696 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003697
Marissa Wall861616d2018-10-22 12:52:23 -07003698 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3699 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003700
3701 ExpectedResult expected;
3702 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3703 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3704 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3705}
3706
3707TEST_F(LayerCallbackTest, MultipleTransactions) {
3708 sp<SurfaceControl> layer;
3709 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3710
3711 Transaction transaction;
3712 CallbackHelper callback;
3713 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003714 int err = fillTransaction(transaction, &callback, layer);
3715 if (err) {
3716 GTEST_SUCCEED() << "test not supported";
3717 return;
3718 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003719
3720 transaction.apply();
3721
3722 ExpectedResult expected;
3723 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003724 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003725 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3726 : ExpectedResult::PreviousBuffer::RELEASED);
3727 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3728 }
3729 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3730}
3731
3732TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3733 sp<SurfaceControl> layer;
3734 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3735
3736 Transaction transaction;
3737 CallbackHelper callback;
3738 for (size_t i = 0; i < 10; i++) {
3739 ExpectedResult expected;
3740
3741 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003742 int err = fillTransaction(transaction, &callback, layer);
3743 if (err) {
3744 GTEST_SUCCEED() << "test not supported";
3745 return;
3746 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003747 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3748 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003749 int err = fillTransaction(transaction, &callback);
3750 if (err) {
3751 GTEST_SUCCEED() << "test not supported";
3752 return;
3753 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003754 }
3755
3756 transaction.apply();
3757
3758 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3759 }
3760 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3761}
3762
3763TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3764 sp<SurfaceControl> layer;
3765 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3766
3767 Transaction transaction;
3768 CallbackHelper callback;
3769 for (size_t i = 0; i < 10; i++) {
3770 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003771 int err = fillTransaction(transaction, &callback, layer);
3772 if (err) {
3773 GTEST_SUCCEED() << "test not supported";
3774 return;
3775 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003776 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003777 int err = fillTransaction(transaction, &callback);
3778 if (err) {
3779 GTEST_SUCCEED() << "test not supported";
3780 return;
3781 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003782 }
3783
Marissa Wall861616d2018-10-22 12:52:23 -07003784 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003785
3786 ExpectedResult expected;
3787 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3788 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003789 layer,
3790 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3791 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003792 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3793 }
3794 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3795}
3796
3797TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3798 sp<SurfaceControl> layer1, layer2;
3799 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3800 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3801
3802 Transaction transaction1, transaction2;
3803 CallbackHelper callback1, callback2;
3804 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003805 int err = fillTransaction(transaction1, &callback1, layer1);
3806 if (err) {
3807 GTEST_SUCCEED() << "test not supported";
3808 return;
3809 }
3810 err = fillTransaction(transaction2, &callback2, layer2);
3811 if (err) {
3812 GTEST_SUCCEED() << "test not supported";
3813 return;
3814 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003815
Marissa Wall861616d2018-10-22 12:52:23 -07003816 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3817 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003818
3819 ExpectedResult expected;
3820 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003821 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003822 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3823 : ExpectedResult::PreviousBuffer::RELEASED);
3824 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3825 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3826 }
3827 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3828 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3829}
3830
3831TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3832 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3833 client2(new SurfaceComposerClient);
3834 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3835 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3836
3837 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003838 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003839 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003840 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003841 ISurfaceComposerClient::eFXSurfaceBufferState));
3842
3843 Transaction transaction1, transaction2;
3844 CallbackHelper callback1, callback2;
3845 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003846 int err = fillTransaction(transaction1, &callback1, layer1);
3847 if (err) {
3848 GTEST_SUCCEED() << "test not supported";
3849 return;
3850 }
3851 err = fillTransaction(transaction2, &callback2, layer2);
3852 if (err) {
3853 GTEST_SUCCEED() << "test not supported";
3854 return;
3855 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003856
Marissa Wall861616d2018-10-22 12:52:23 -07003857 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3858 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003859
3860 ExpectedResult expected;
3861 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003862 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003863 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3864 : ExpectedResult::PreviousBuffer::RELEASED);
3865 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3866 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3867 }
3868 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3869 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3870}
3871
3872TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3873 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3874 client2(new SurfaceComposerClient);
3875 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3876 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3877
3878 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003879 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003880 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003881 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003882 ISurfaceComposerClient::eFXSurfaceBufferState));
3883
3884 Transaction transaction1, transaction2;
3885 CallbackHelper callback1, callback2;
3886
3887 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003888 int err = fillTransaction(transaction1, &callback1, layer1);
3889 if (err) {
3890 GTEST_SUCCEED() << "test not supported";
3891 return;
3892 }
3893 err = fillTransaction(transaction2, &callback2, layer2);
3894 if (err) {
3895 GTEST_SUCCEED() << "test not supported";
3896 return;
3897 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003898
Marissa Wall861616d2018-10-22 12:52:23 -07003899 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3900 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003901
3902 ExpectedResult expected;
3903 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3904 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3905 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3906 expected.reset();
3907
3908 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003909 err = fillTransaction(transaction1, &callback1);
3910 if (err) {
3911 GTEST_SUCCEED() << "test not supported";
3912 return;
3913 }
3914 err = fillTransaction(transaction2, &callback2);
3915 if (err) {
3916 GTEST_SUCCEED() << "test not supported";
3917 return;
3918 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003919
3920 transaction2.merge(std::move(transaction1)).apply();
3921
3922 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3923 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3924}
3925
3926TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3927 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3928 client2(new SurfaceComposerClient);
3929
3930 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3931 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3932
3933 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003934 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003935 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003936 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003937 ISurfaceComposerClient::eFXSurfaceBufferState));
3938
3939 Transaction transaction1, transaction2;
3940 CallbackHelper callback1, callback2;
3941
3942 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003943 int err = fillTransaction(transaction1, &callback1, layer1);
3944 if (err) {
3945 GTEST_SUCCEED() << "test not supported";
3946 return;
3947 }
3948 err = fillTransaction(transaction2, &callback2, layer2);
3949 if (err) {
3950 GTEST_SUCCEED() << "test not supported";
3951 return;
3952 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003953
Marissa Wall861616d2018-10-22 12:52:23 -07003954 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3955 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003956
3957 ExpectedResult expected;
3958 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3959 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3960 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3961 expected.reset();
3962
3963 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003964 err = fillTransaction(transaction1, &callback1);
3965 if (err) {
3966 GTEST_SUCCEED() << "test not supported";
3967 return;
3968 }
3969 err = fillTransaction(transaction2, &callback2);
3970 if (err) {
3971 GTEST_SUCCEED() << "test not supported";
3972 return;
3973 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003974
Marissa Wall861616d2018-10-22 12:52:23 -07003975 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003976
Marissa Wall713b63f2018-10-17 15:42:43 -07003977 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3978 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003979 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3980 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3981}
3982
3983TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3984 sp<SurfaceControl> layer;
3985 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3986
3987 Transaction transaction;
3988 CallbackHelper callback;
3989 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003990 for (auto& expected : expectedResults) {
3991 expected.reset();
3992 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003993 ExpectedResult::Buffer::ACQUIRED,
3994 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003995
Marissa Wall713b63f2018-10-17 15:42:43 -07003996 int err = fillTransaction(transaction, &callback, layer);
3997 if (err) {
3998 GTEST_SUCCEED() << "test not supported";
3999 return;
4000 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07004001
4002 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004003 }
4004 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
4005}
4006
4007TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
4008 sp<SurfaceControl> layer;
4009 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4010
Marissa Wall713b63f2018-10-17 15:42:43 -07004011 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07004012 Transaction transaction;
4013 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07004014 int err = fillTransaction(transaction, &callback, layer);
4015 if (err) {
4016 GTEST_SUCCEED() << "test not supported";
4017 return;
4018 }
4019
4020 transaction.apply();
4021
4022 ExpectedResult expected;
4023 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4024 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4025
4026 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07004027 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07004028 for (auto& expected : expectedResults) {
4029 expected.reset();
4030
Marissa Wall713b63f2018-10-17 15:42:43 -07004031 err = fillTransaction(transaction, &callback);
4032 if (err) {
4033 GTEST_SUCCEED() << "test not supported";
4034 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07004035 }
4036
4037 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004038 }
4039 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
4040}
4041
4042TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
4043 sp<SurfaceControl> layer;
4044 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4045
4046 // Normal call to set up test
4047 Transaction transaction;
4048 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07004049 int err = fillTransaction(transaction, &callback, layer);
4050 if (err) {
4051 GTEST_SUCCEED() << "test not supported";
4052 return;
4053 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07004054
Marissa Wall861616d2018-10-22 12:52:23 -07004055 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004056
4057 ExpectedResult expectedResult;
4058 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4059 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
4060
4061 // Test
4062 std::vector<ExpectedResult> expectedResults(50);
4063 for (auto& expected : expectedResults) {
4064 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07004065 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
4066 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07004067
Marissa Wall713b63f2018-10-17 15:42:43 -07004068 err = fillTransaction(transaction, &callback);
4069 if (err) {
4070 GTEST_SUCCEED() << "test not supported";
4071 return;
4072 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07004073
Marissa Wall861616d2018-10-22 12:52:23 -07004074 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004075 }
4076 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
4077}
4078
Marissa Wall17b4e452018-12-26 16:32:34 -08004079TEST_F(LayerCallbackTest, DesiredPresentTime) {
4080 sp<SurfaceControl> layer;
4081 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4082
4083 Transaction transaction;
4084 CallbackHelper callback;
4085 int err = fillTransaction(transaction, &callback, layer);
4086 if (err) {
4087 GTEST_SUCCEED() << "test not supported";
4088 return;
4089 }
4090
4091 // Try to present 100ms in the future
4092 nsecs_t time = systemTime() + (100 * 1e6);
4093
4094 transaction.setDesiredPresentTime(time);
4095 transaction.apply();
4096
4097 ExpectedResult expected;
4098 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4099 expected.addExpectedPresentTime(time);
4100 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4101}
4102
4103TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
4104 sp<SurfaceControl> layer;
4105 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4106
4107 Transaction transaction;
4108 CallbackHelper callback1;
4109 int err = fillTransaction(transaction, &callback1, layer);
4110 if (err) {
4111 GTEST_SUCCEED() << "test not supported";
4112 return;
4113 }
4114
4115 // Try to present 100ms in the future
4116 nsecs_t time = systemTime() + (100 * 1e6);
4117
4118 transaction.setDesiredPresentTime(time);
4119 transaction.apply();
4120
4121 ExpectedResult expected1;
4122 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4123 expected1.addExpectedPresentTime(time);
4124
4125 CallbackHelper callback2;
4126 err = fillTransaction(transaction, &callback2, layer);
4127 if (err) {
4128 GTEST_SUCCEED() << "test not supported";
4129 return;
4130 }
4131
4132 // Try to present 33ms after the first frame
4133 time += (33.3 * 1e6);
4134
4135 transaction.setDesiredPresentTime(time);
4136 transaction.apply();
4137
4138 ExpectedResult expected2;
4139 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4140 ExpectedResult::Buffer::ACQUIRED,
4141 ExpectedResult::PreviousBuffer::RELEASED);
4142 expected2.addExpectedPresentTime(time);
4143
4144 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4145 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4146}
4147
4148TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
4149 sp<SurfaceControl> layer;
4150 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4151
4152 Transaction transaction;
4153 CallbackHelper callback1;
4154 int err = fillTransaction(transaction, &callback1, layer);
4155 if (err) {
4156 GTEST_SUCCEED() << "test not supported";
4157 return;
4158 }
4159
4160 // Try to present 100ms in the future
4161 nsecs_t time = systemTime() + (100 * 1e6);
4162
4163 transaction.setDesiredPresentTime(time);
4164 transaction.apply();
4165
4166 ExpectedResult expected1;
4167 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4168 expected1.addExpectedPresentTime(time);
4169
4170 CallbackHelper callback2;
4171 err = fillTransaction(transaction, &callback2, layer);
4172 if (err) {
4173 GTEST_SUCCEED() << "test not supported";
4174 return;
4175 }
4176
4177 // Try to present 33ms before the previous frame
4178 time -= (33.3 * 1e6);
4179
4180 transaction.setDesiredPresentTime(time);
4181 transaction.apply();
4182
4183 ExpectedResult expected2;
4184 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4185 ExpectedResult::Buffer::ACQUIRED,
4186 ExpectedResult::PreviousBuffer::RELEASED);
4187
4188 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4189 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4190}
4191
4192TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4193 sp<SurfaceControl> layer;
4194 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4195
4196 Transaction transaction;
4197 CallbackHelper callback;
4198 int err = fillTransaction(transaction, &callback, layer);
4199 if (err) {
4200 GTEST_SUCCEED() << "test not supported";
4201 return;
4202 }
4203
4204 // Try to present 100ms in the past
4205 nsecs_t time = systemTime() - (100 * 1e6);
4206
4207 transaction.setDesiredPresentTime(time);
4208 transaction.apply();
4209
4210 ExpectedResult expected;
4211 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4212 expected.addExpectedPresentTime(systemTime());
4213 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4214}
4215
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004216class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004217protected:
4218 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004219 LayerTransactionTest::SetUp();
4220 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004221
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004222 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4223 ASSERT_FALSE(display == nullptr);
4224
Mathias Agopianc666cae2012-07-25 18:56:13 -07004225 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004226 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004227
4228 ssize_t displayWidth = info.w;
4229 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004230
4231 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004232 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4233 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004234 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004235 ASSERT_TRUE(mBGSurfaceControl->isValid());
4236 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4237
4238 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004239 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4240
Peiyong Lin566a3b42018-01-09 18:22:43 -08004241 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004242 ASSERT_TRUE(mFGSurfaceControl->isValid());
4243
4244 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4245
4246 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004247 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004248 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004249 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4250
4251 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4252
Robert Carr4cdc58f2017-08-23 14:22:20 -07004253 asTransaction([&](Transaction& t) {
4254 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004255
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004256 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004257
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004258 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4259 .setPosition(mFGSurfaceControl, 64, 64)
4260 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004261
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004262 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4263 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4264 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004265 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004266 }
4267
4268 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004269 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004270 mBGSurfaceControl = 0;
4271 mFGSurfaceControl = 0;
4272 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004273 }
4274
4275 void waitForPostedBuffers() {
4276 // Since the sync surface is in synchronous mode (i.e. double buffered)
4277 // posting three buffers to it should ensure that at least two
4278 // SurfaceFlinger::handlePageFlip calls have been made, which should
4279 // guaranteed that a buffer posted to another Surface has been retired.
4280 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4281 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4282 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4283 }
4284
Robert Carr4cdc58f2017-08-23 14:22:20 -07004285
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004286 sp<SurfaceControl> mBGSurfaceControl;
4287 sp<SurfaceControl> mFGSurfaceControl;
4288
4289 // This surface is used to ensure that the buffers posted to
4290 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4291 sp<SurfaceControl> mSyncSurfaceControl;
4292};
4293
Robert Carr7f619b22017-11-06 12:56:35 -08004294TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004295
chaviw0e3479f2018-09-10 16:49:30 -07004296 std::unique_ptr<ScreenCapture> sc;
4297
4298 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004299 fillSurfaceRGBA8(relative, 10, 10, 10);
4300 waitForPostedBuffers();
4301
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004302 Transaction{}
4303 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004304 .setPosition(relative, 64, 64)
4305 .apply();
4306
4307 {
4308 // The relative should be on top of the FG control.
4309 ScreenCapture::captureScreen(&sc);
4310 sc->checkPixel(64, 64, 10, 10, 10);
4311 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004312 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004313
4314 {
4315 // Nothing should change at this point.
4316 ScreenCapture::captureScreen(&sc);
4317 sc->checkPixel(64, 64, 10, 10, 10);
4318 }
4319
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004320 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004321
4322 {
4323 // Ensure that the relative was actually hidden, rather than
4324 // being left in the detached but visible state.
4325 ScreenCapture::captureScreen(&sc);
4326 sc->expectFGColor(64, 64);
4327 }
4328}
4329
Robert Carr8d5227b2017-03-16 15:41:03 -07004330class GeometryLatchingTest : public LayerUpdateTest {
4331protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004332 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004333 SCOPED_TRACE(trace);
4334 ScreenCapture::captureScreen(&sc);
4335 // We find the leading edge of the FG surface.
4336 sc->expectFGColor(127, 127);
4337 sc->expectBGColor(128, 128);
4338 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004339
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004340 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004341
4342 void unlockFGBuffer() {
4343 sp<Surface> s = mFGSurfaceControl->getSurface();
4344 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4345 waitForPostedBuffers();
4346 }
4347
Robert Carr8d5227b2017-03-16 15:41:03 -07004348 void completeFGResize() {
4349 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4350 waitForPostedBuffers();
4351 }
4352 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004353 asTransaction([&](Transaction& t) {
4354 t.setSize(mFGSurfaceControl, 64, 64);
4355 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004356 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004357 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004358
4359 EXPECT_INITIAL_STATE("After restoring initial state");
4360 }
chaviw0e3479f2018-09-10 16:49:30 -07004361 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004362};
4363
Robert Carr8d5227b2017-03-16 15:41:03 -07004364class CropLatchingTest : public GeometryLatchingTest {
4365protected:
4366 void EXPECT_CROPPED_STATE(const char* trace) {
4367 SCOPED_TRACE(trace);
4368 ScreenCapture::captureScreen(&sc);
4369 // The edge should be moved back one pixel by our crop.
4370 sc->expectFGColor(126, 126);
4371 sc->expectBGColor(127, 127);
4372 sc->expectBGColor(128, 128);
4373 }
chaviw59f5c562017-06-28 16:39:06 -07004374
4375 void EXPECT_RESIZE_STATE(const char* trace) {
4376 SCOPED_TRACE(trace);
4377 ScreenCapture::captureScreen(&sc);
4378 // The FG is now resized too 128,128 at 64,64
4379 sc->expectFGColor(64, 64);
4380 sc->expectFGColor(191, 191);
4381 sc->expectBGColor(192, 192);
4382 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004383};
4384
Pablo Ceballos05289c22016-04-14 15:49:55 -07004385TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004386 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004387 {
4388 SCOPED_TRACE("before anything");
4389 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004390 sc->expectBGColor(32, 32);
4391 sc->expectFGColor(96, 96);
4392 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004393 }
4394
4395 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004396 asTransaction([&](Transaction& t) {
4397 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004398 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4399 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004400 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004401
Robert Carr4cdc58f2017-08-23 14:22:20 -07004402 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004403 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004404 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4405 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004406 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004407
4408 {
4409 SCOPED_TRACE("before any trigger");
4410 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004411 sc->expectBGColor(32, 32);
4412 sc->expectFGColor(96, 96);
4413 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004414 }
4415
4416 // should trigger the first deferred transaction, but not the second one
4417 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4418 {
4419 SCOPED_TRACE("after first trigger");
4420 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004421 sc->expectBGColor(32, 32);
4422 sc->checkPixel(96, 96, 162, 63, 96);
4423 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004424 }
4425
4426 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004427 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004428
4429 // trigger the second deferred transaction
4430 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4431 {
4432 SCOPED_TRACE("after second trigger");
4433 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004434 sc->expectBGColor(32, 32);
4435 sc->expectBGColor(96, 96);
4436 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004437 }
4438}
4439
Robert Carre392b552017-09-19 12:16:05 -07004440TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004441 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004442
4443 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004444 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4445 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4446 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4447 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004448 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004449 SurfaceComposerClient::Transaction{}
4450 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4451 .show(childNoBuffer)
4452 .show(childBuffer)
4453 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004454 {
4455 ScreenCapture::captureScreen(&sc);
4456 sc->expectChildColor(73, 73);
4457 sc->expectFGColor(74, 74);
4458 }
Vishnu Nair60356342018-11-13 13:00:45 -08004459 SurfaceComposerClient::Transaction{}
4460 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4461 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004462 {
4463 ScreenCapture::captureScreen(&sc);
4464 sc->expectChildColor(73, 73);
4465 sc->expectChildColor(74, 74);
4466 }
4467}
4468
Robert Carr2c5f6d22017-09-26 12:30:35 -07004469TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004470 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004471 {
4472 SCOPED_TRACE("before move");
4473 ScreenCapture::captureScreen(&sc);
4474 sc->expectBGColor(0, 12);
4475 sc->expectFGColor(75, 75);
4476 sc->expectBGColor(145, 145);
4477 }
4478
4479 Transaction t1, t2;
4480 t1.setPosition(mFGSurfaceControl, 128, 128);
4481 t2.setPosition(mFGSurfaceControl, 0, 0);
4482 // We expect that the position update from t2 now
4483 // overwrites the position update from t1.
4484 t1.merge(std::move(t2));
4485 t1.apply();
4486
4487 {
4488 ScreenCapture::captureScreen(&sc);
4489 sc->expectFGColor(1, 1);
4490 }
4491}
4492
Robert Carr1f0a16a2016-10-24 16:27:39 -07004493class ChildLayerTest : public LayerUpdateTest {
4494protected:
4495 void SetUp() override {
4496 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004497 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004498 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004499 fillSurfaceRGBA8(mChild, 200, 200, 200);
4500
4501 {
4502 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004503 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004504 mCapture->expectChildColor(64, 64);
4505 }
4506 }
4507 void TearDown() override {
4508 LayerUpdateTest::TearDown();
4509 mChild = 0;
4510 }
4511
4512 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004513 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004514};
4515
4516TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004517 asTransaction([&](Transaction& t) {
4518 t.show(mChild);
4519 t.setPosition(mChild, 10, 10);
4520 t.setPosition(mFGSurfaceControl, 64, 64);
4521 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004522
4523 {
chaviw0e3479f2018-09-10 16:49:30 -07004524 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004525 // Top left of foreground must now be visible
4526 mCapture->expectFGColor(64, 64);
4527 // But 10 pixels in we should see the child surface
4528 mCapture->expectChildColor(74, 74);
4529 // And 10 more pixels we should be back to the foreground surface
4530 mCapture->expectFGColor(84, 84);
4531 }
4532
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004533 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004534
4535 {
chaviw0e3479f2018-09-10 16:49:30 -07004536 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004537 // Top left of foreground should now be at 0, 0
4538 mCapture->expectFGColor(0, 0);
4539 // But 10 pixels in we should see the child surface
4540 mCapture->expectChildColor(10, 10);
4541 // And 10 more pixels we should be back to the foreground surface
4542 mCapture->expectFGColor(20, 20);
4543 }
4544}
4545
Robert Carr41b08b52017-06-01 16:11:34 -07004546TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004547 asTransaction([&](Transaction& t) {
4548 t.show(mChild);
4549 t.setPosition(mChild, 0, 0);
4550 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004551 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004552 });
Robert Carr41b08b52017-06-01 16:11:34 -07004553
4554 {
chaviw0e3479f2018-09-10 16:49:30 -07004555 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004556 mCapture->expectChildColor(0, 0);
4557 mCapture->expectChildColor(4, 4);
4558 mCapture->expectBGColor(5, 5);
4559 }
4560}
4561
Robert Carr1f0a16a2016-10-24 16:27:39 -07004562TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004563 asTransaction([&](Transaction& t) {
4564 t.show(mChild);
4565 t.setPosition(mFGSurfaceControl, 0, 0);
4566 t.setPosition(mChild, 63, 63);
4567 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004568
4569 {
chaviw0e3479f2018-09-10 16:49:30 -07004570 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004571 mCapture->expectFGColor(0, 0);
4572 // Last pixel in foreground should now be the child.
4573 mCapture->expectChildColor(63, 63);
4574 // But the child should be constrained and the next pixel
4575 // must be the background
4576 mCapture->expectBGColor(64, 64);
4577 }
4578}
4579
4580TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004581 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004582
4583 // Find the boundary between the parent and child
4584 {
chaviw0e3479f2018-09-10 16:49:30 -07004585 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004586 mCapture->expectChildColor(9, 9);
4587 mCapture->expectFGColor(10, 10);
4588 }
4589
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004590 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004591
4592 // The boundary should be twice as far from the origin now.
4593 // The pixels from the last test should all be child now
4594 {
chaviw0e3479f2018-09-10 16:49:30 -07004595 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004596 mCapture->expectChildColor(9, 9);
4597 mCapture->expectChildColor(10, 10);
4598 mCapture->expectChildColor(19, 19);
4599 mCapture->expectFGColor(20, 20);
4600 }
4601}
Robert Carr9524cb32017-02-13 11:32:32 -08004602
Vishnu Nairc652ff82019-03-15 12:48:54 -07004603// A child with a scale transform should be cropped by its parent bounds.
4604TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4605 asTransaction([&](Transaction& t) {
4606 t.setPosition(mFGSurfaceControl, 0, 0);
4607 t.setPosition(mChild, 0, 0);
4608 });
4609
4610 // Find the boundary between the parent and child.
4611 {
4612 mCapture = screenshot();
4613 mCapture->expectChildColor(0, 0);
4614 mCapture->expectChildColor(9, 9);
4615 mCapture->expectFGColor(10, 10);
4616 }
4617
4618 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4619
4620 // The child should fill its parent bounds and be cropped by it.
4621 {
4622 mCapture = screenshot();
4623 mCapture->expectChildColor(0, 0);
4624 mCapture->expectChildColor(63, 63);
4625 mCapture->expectBGColor(64, 64);
4626 }
4627}
4628
Robert Carr6452f122017-03-21 10:41:29 -07004629TEST_F(ChildLayerTest, ChildLayerAlpha) {
4630 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4631 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4632 fillSurfaceRGBA8(mChild, 0, 254, 0);
4633 waitForPostedBuffers();
4634
Robert Carr4cdc58f2017-08-23 14:22:20 -07004635 asTransaction([&](Transaction& t) {
4636 t.show(mChild);
4637 t.setPosition(mChild, 0, 0);
4638 t.setPosition(mFGSurfaceControl, 0, 0);
4639 });
Robert Carr6452f122017-03-21 10:41:29 -07004640
4641 {
chaviw0e3479f2018-09-10 16:49:30 -07004642 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004643 // Unblended child color
4644 mCapture->checkPixel(0, 0, 0, 254, 0);
4645 }
4646
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004647 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004648
4649 {
chaviw0e3479f2018-09-10 16:49:30 -07004650 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004651 // Child and BG blended.
4652 mCapture->checkPixel(0, 0, 127, 127, 0);
4653 }
4654
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004655 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004656
4657 {
chaviw0e3479f2018-09-10 16:49:30 -07004658 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004659 // Child and BG blended.
4660 mCapture->checkPixel(0, 0, 95, 64, 95);
4661 }
4662}
4663
Robert Carr9524cb32017-02-13 11:32:32 -08004664TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004665 asTransaction([&](Transaction& t) {
4666 t.show(mChild);
4667 t.setPosition(mChild, 10, 10);
4668 t.setPosition(mFGSurfaceControl, 64, 64);
4669 });
Robert Carr9524cb32017-02-13 11:32:32 -08004670
4671 {
chaviw0e3479f2018-09-10 16:49:30 -07004672 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004673 // Top left of foreground must now be visible
4674 mCapture->expectFGColor(64, 64);
4675 // But 10 pixels in we should see the child surface
4676 mCapture->expectChildColor(74, 74);
4677 // And 10 more pixels we should be back to the foreground surface
4678 mCapture->expectFGColor(84, 84);
4679 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004680
4681 asTransaction([&](Transaction& t) {
4682 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4683 });
4684
Robert Carr9524cb32017-02-13 11:32:32 -08004685 {
chaviw0e3479f2018-09-10 16:49:30 -07004686 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004687 mCapture->expectFGColor(64, 64);
4688 // In reparenting we should have exposed the entire foreground surface.
4689 mCapture->expectFGColor(74, 74);
4690 // And the child layer should now begin at 10, 10 (since the BG
4691 // layer is at (0, 0)).
4692 mCapture->expectBGColor(9, 9);
4693 mCapture->expectChildColor(10, 10);
4694 }
4695}
4696
Robert Carr2e102c92018-10-23 12:11:15 -07004697TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4698 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004699 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004700 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4701
4702 {
4703 SCOPED_TRACE("Grandchild visible");
4704 ScreenCapture::captureScreen(&mCapture);
4705 mCapture->checkPixel(64, 64, 111, 111, 111);
4706 }
4707
Robert Carr87246532019-02-04 15:20:26 -08004708 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004709
4710 {
4711 SCOPED_TRACE("After destroying child");
4712 ScreenCapture::captureScreen(&mCapture);
4713 mCapture->expectFGColor(64, 64);
4714 }
4715
4716 asTransaction([&](Transaction& t) {
4717 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4718 });
4719
4720 {
4721 SCOPED_TRACE("After reparenting grandchild");
4722 ScreenCapture::captureScreen(&mCapture);
4723 mCapture->checkPixel(64, 64, 111, 111, 111);
4724 }
4725}
4726
chaviw161410b02017-07-27 10:46:08 -07004727TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004728 asTransaction([&](Transaction& t) {
4729 t.show(mChild);
4730 t.setPosition(mChild, 10, 10);
4731 t.setPosition(mFGSurfaceControl, 64, 64);
4732 });
Robert Carr9524cb32017-02-13 11:32:32 -08004733
4734 {
chaviw0e3479f2018-09-10 16:49:30 -07004735 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004736 // Top left of foreground must now be visible
4737 mCapture->expectFGColor(64, 64);
4738 // But 10 pixels in we should see the child surface
4739 mCapture->expectChildColor(74, 74);
4740 // And 10 more pixels we should be back to the foreground surface
4741 mCapture->expectFGColor(84, 84);
4742 }
4743
chaviw0e3479f2018-09-10 16:49:30 -07004744
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004745 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004746
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004747 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004748
chaviw161410b02017-07-27 10:46:08 -07004749 // Since the child has the same client as the parent, it will not get
4750 // detached and will be hidden.
4751 {
chaviw0e3479f2018-09-10 16:49:30 -07004752 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004753 mCapture->expectFGColor(64, 64);
4754 mCapture->expectFGColor(74, 74);
4755 mCapture->expectFGColor(84, 84);
4756 }
4757}
4758
4759TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4760 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004761 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004762 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4763 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004764
chaviw161410b02017-07-27 10:46:08 -07004765 ASSERT_TRUE(mChildNewClient->isValid());
4766
4767 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4768
Robert Carr4cdc58f2017-08-23 14:22:20 -07004769 asTransaction([&](Transaction& t) {
4770 t.hide(mChild);
4771 t.show(mChildNewClient);
4772 t.setPosition(mChildNewClient, 10, 10);
4773 t.setPosition(mFGSurfaceControl, 64, 64);
4774 });
chaviw161410b02017-07-27 10:46:08 -07004775
4776 {
chaviw0e3479f2018-09-10 16:49:30 -07004777 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004778 // Top left of foreground must now be visible
4779 mCapture->expectFGColor(64, 64);
4780 // But 10 pixels in we should see the child surface
4781 mCapture->expectChildColor(74, 74);
4782 // And 10 more pixels we should be back to the foreground surface
4783 mCapture->expectFGColor(84, 84);
4784 }
4785
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004786 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004787
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004788 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004789
Robert Carr9524cb32017-02-13 11:32:32 -08004790 // Nothing should have changed.
4791 {
chaviw0e3479f2018-09-10 16:49:30 -07004792 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004793 mCapture->expectFGColor(64, 64);
4794 mCapture->expectChildColor(74, 74);
4795 mCapture->expectFGColor(84, 84);
4796 }
4797}
4798
chaviw5aedec92018-10-22 10:40:38 -07004799TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4800 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4801 sp<SurfaceControl> childNewClient =
4802 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4803 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4804
4805 ASSERT_TRUE(childNewClient != nullptr);
4806 ASSERT_TRUE(childNewClient->isValid());
4807
4808 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4809
4810 Transaction()
4811 .hide(mChild)
4812 .show(childNewClient)
4813 .setPosition(childNewClient, 10, 10)
4814 .setPosition(mFGSurfaceControl, 64, 64)
4815 .apply();
4816
4817 {
4818 mCapture = screenshot();
4819 // Top left of foreground must now be visible
4820 mCapture->expectFGColor(64, 64);
4821 // But 10 pixels in we should see the child surface
4822 mCapture->expectChildColor(74, 74);
4823 // And 10 more pixels we should be back to the foreground surface
4824 mCapture->expectFGColor(84, 84);
4825 }
4826
4827 Transaction().detachChildren(mFGSurfaceControl).apply();
4828 Transaction().hide(childNewClient).apply();
4829
4830 // Nothing should have changed.
4831 {
4832 mCapture = screenshot();
4833 mCapture->expectFGColor(64, 64);
4834 mCapture->expectChildColor(74, 74);
4835 mCapture->expectFGColor(84, 84);
4836 }
4837
4838 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4839 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4840 32);
4841 Transaction()
4842 .setLayer(newParentSurface, INT32_MAX - 1)
4843 .show(newParentSurface)
4844 .setPosition(newParentSurface, 20, 20)
4845 .reparent(childNewClient, newParentSurface->getHandle())
4846 .apply();
4847 {
4848 mCapture = screenshot();
4849 // Child is now hidden.
4850 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4851 }
4852}
chaviw43cb3cb2019-05-31 15:23:41 -07004853TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
4854 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4855 sp<SurfaceControl> childNewClient =
4856 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4857 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4858
4859 ASSERT_TRUE(childNewClient != nullptr);
4860 ASSERT_TRUE(childNewClient->isValid());
4861
4862 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4863
4864 Transaction()
4865 .hide(mChild)
4866 .show(childNewClient)
4867 .setPosition(childNewClient, 10, 10)
4868 .setPosition(mFGSurfaceControl, 64, 64)
4869 .apply();
4870
4871 {
4872 mCapture = screenshot();
4873 Rect rect = Rect(74, 74, 84, 84);
4874 mCapture->expectBorder(rect, Color{195, 63, 63, 255});
4875 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4876 }
4877
4878 Transaction()
4879 .deferTransactionUntil_legacy(childNewClient, mFGSurfaceControl->getHandle(),
4880 mFGSurfaceControl->getSurface()->getNextFrameNumber())
4881 .apply();
4882 Transaction().detachChildren(mFGSurfaceControl).apply();
4883 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(mFGSurfaceControl, Color::RED, 32, 32));
4884
4885 // BufferLayer can still dequeue buffers even though there's a detached layer with a
4886 // deferred transaction.
4887 {
4888 SCOPED_TRACE("new buffer");
4889 mCapture = screenshot();
4890 Rect rect = Rect(74, 74, 84, 84);
4891 mCapture->expectBorder(rect, Color::RED);
4892 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4893 }
4894}
chaviw5aedec92018-10-22 10:40:38 -07004895
Robert Carr9b429f42017-04-17 14:56:57 -07004896TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004897 asTransaction([&](Transaction& t) {
4898 t.show(mChild);
4899 t.setPosition(mChild, 0, 0);
4900 t.setPosition(mFGSurfaceControl, 0, 0);
4901 });
Robert Carr9b429f42017-04-17 14:56:57 -07004902
4903 {
chaviw0e3479f2018-09-10 16:49:30 -07004904 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004905 // We've positioned the child in the top left.
4906 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004907 // But it's only 10x15.
4908 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004909 }
4910
Robert Carr4cdc58f2017-08-23 14:22:20 -07004911 asTransaction([&](Transaction& t) {
4912 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4913 // We cause scaling by 2.
4914 t.setSize(mFGSurfaceControl, 128, 128);
4915 });
Robert Carr9b429f42017-04-17 14:56:57 -07004916
4917 {
chaviw0e3479f2018-09-10 16:49:30 -07004918 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004919 // We've positioned the child in the top left.
4920 mCapture->expectChildColor(0, 0);
4921 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004922 mCapture->expectChildColor(19, 29);
4923 // And now it should be scaled all the way to 20x30
4924 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004925 }
4926}
4927
Robert Carr1725eee2017-04-26 18:32:15 -07004928// Regression test for b/37673612
4929TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004930 asTransaction([&](Transaction& t) {
4931 t.show(mChild);
4932 t.setPosition(mChild, 0, 0);
4933 t.setPosition(mFGSurfaceControl, 0, 0);
4934 });
Robert Carr1725eee2017-04-26 18:32:15 -07004935
4936 {
chaviw0e3479f2018-09-10 16:49:30 -07004937 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004938 // We've positioned the child in the top left.
4939 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004940 mCapture->expectChildColor(9, 14);
4941 // But it's only 10x15.
4942 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004943 }
Robert Carr1725eee2017-04-26 18:32:15 -07004944 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4945 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004946 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004947 sp<Surface> s = mFGSurfaceControl->getSurface();
4948 auto anw = static_cast<ANativeWindow*>(s.get());
4949 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4950 native_window_set_buffers_dimensions(anw, 64, 128);
4951 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4952 waitForPostedBuffers();
4953
4954 {
4955 // The child should still be in the same place and not have any strange scaling as in
4956 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004957 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004958 mCapture->expectChildColor(0, 0);
4959 mCapture->expectFGColor(10, 10);
4960 }
4961}
4962
Vishnu Nairc652ff82019-03-15 12:48:54 -07004963// A child with a buffer transform from its parents should be cropped by its parent bounds.
4964TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4965 asTransaction([&](Transaction& t) {
4966 t.show(mChild);
4967 t.setPosition(mChild, 0, 0);
4968 t.setPosition(mFGSurfaceControl, 0, 0);
4969 t.setSize(mChild, 100, 100);
4970 });
4971 fillSurfaceRGBA8(mChild, 200, 200, 200);
4972
4973 {
4974 mCapture = screenshot();
4975
4976 mCapture->expectChildColor(0, 0);
4977 mCapture->expectChildColor(63, 63);
4978 mCapture->expectBGColor(64, 64);
4979 }
4980
4981 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4982 sp<Surface> s = mFGSurfaceControl->getSurface();
4983 auto anw = static_cast<ANativeWindow*>(s.get());
4984 // Apply a 90 transform on the buffer.
4985 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4986 native_window_set_buffers_dimensions(anw, 64, 128);
4987 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4988 waitForPostedBuffers();
4989
4990 // The child should be cropped by the new parent bounds.
4991 {
4992 mCapture = screenshot();
4993 mCapture->expectChildColor(0, 0);
4994 mCapture->expectChildColor(99, 63);
4995 mCapture->expectFGColor(100, 63);
4996 mCapture->expectBGColor(128, 64);
4997 }
4998}
4999
5000// A child with a scale transform from its parents should be cropped by its parent bounds.
5001TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
5002 asTransaction([&](Transaction& t) {
5003 t.show(mChild);
5004 t.setPosition(mChild, 0, 0);
5005 t.setPosition(mFGSurfaceControl, 0, 0);
5006 t.setSize(mChild, 200, 200);
5007 });
5008 fillSurfaceRGBA8(mChild, 200, 200, 200);
5009
5010 {
5011 mCapture = screenshot();
5012
5013 mCapture->expectChildColor(0, 0);
5014 mCapture->expectChildColor(63, 63);
5015 mCapture->expectBGColor(64, 64);
5016 }
5017
5018 asTransaction([&](Transaction& t) {
5019 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5020 // Set a scaling by 2.
5021 t.setSize(mFGSurfaceControl, 128, 128);
5022 });
5023
5024 // Child should inherit its parents scale but should be cropped by its parent bounds.
5025 {
5026 mCapture = screenshot();
5027 mCapture->expectChildColor(0, 0);
5028 mCapture->expectChildColor(127, 127);
5029 mCapture->expectBGColor(128, 128);
5030 }
5031}
5032
5033// Regression test for b/127368943
5034// Child should ignore the buffer transform but apply parent scale transform.
5035TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
5036 asTransaction([&](Transaction& t) {
5037 t.show(mChild);
5038 t.setPosition(mChild, 0, 0);
5039 t.setPosition(mFGSurfaceControl, 0, 0);
5040 });
5041
5042 {
5043 mCapture = screenshot();
5044 mCapture->expectChildColor(0, 0);
5045 mCapture->expectChildColor(9, 14);
5046 mCapture->expectFGColor(10, 15);
5047 }
5048
5049 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
5050 asTransaction([&](Transaction& t) {
5051 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5052 t.setSize(mFGSurfaceControl, 128, 64);
5053 });
5054 sp<Surface> s = mFGSurfaceControl->getSurface();
5055 auto anw = static_cast<ANativeWindow*>(s.get());
5056 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
5057 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
5058 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
5059 native_window_set_buffers_dimensions(anw, 32, 64);
5060 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
5061 waitForPostedBuffers();
5062
5063 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
5064 {
5065 mCapture = screenshot();
5066 mCapture->expectChildColor(0, 0);
5067 mCapture->expectChildColor(19, 29);
5068 mCapture->expectFGColor(20, 30);
5069 }
5070}
5071
Dan Stoza412903f2017-04-27 13:42:17 -07005072TEST_F(ChildLayerTest, Bug36858924) {
5073 // Destroy the child layer
5074 mChild.clear();
5075
5076 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08005077 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
5078 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07005079
5080 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07005081 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005082 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
5083 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07005084 t.show(mChild);
5085 });
Dan Stoza412903f2017-04-27 13:42:17 -07005086
5087 // Render the foreground surface a few times
5088 //
5089 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
5090 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
5091 // never acquire/release the first buffer
5092 ALOGI("Filling 1");
5093 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5094 ALOGI("Filling 2");
5095 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
5096 ALOGI("Filling 3");
5097 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
5098 ALOGI("Filling 4");
5099 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5100}
5101
chaviwf1961f72017-09-18 16:41:07 -07005102TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005103 asTransaction([&](Transaction& t) {
5104 t.show(mChild);
5105 t.setPosition(mChild, 10, 10);
5106 t.setPosition(mFGSurfaceControl, 64, 64);
5107 });
chaviw06178942017-07-27 10:25:59 -07005108
5109 {
chaviw0e3479f2018-09-10 16:49:30 -07005110 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005111 // Top left of foreground must now be visible
5112 mCapture->expectFGColor(64, 64);
5113 // But 10 pixels in we should see the child surface
5114 mCapture->expectChildColor(74, 74);
5115 // And 10 more pixels we should be back to the foreground surface
5116 mCapture->expectFGColor(84, 84);
5117 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07005118
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005119 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07005120
chaviw06178942017-07-27 10:25:59 -07005121 {
chaviw0e3479f2018-09-10 16:49:30 -07005122 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005123 mCapture->expectFGColor(64, 64);
5124 // In reparenting we should have exposed the entire foreground surface.
5125 mCapture->expectFGColor(74, 74);
5126 // And the child layer should now begin at 10, 10 (since the BG
5127 // layer is at (0, 0)).
5128 mCapture->expectBGColor(9, 9);
5129 mCapture->expectChildColor(10, 10);
5130 }
5131}
5132
chaviwf1961f72017-09-18 16:41:07 -07005133TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005134 asTransaction([&](Transaction& t) {
5135 t.show(mChild);
5136 t.setPosition(mChild, 10, 10);
5137 t.setPosition(mFGSurfaceControl, 64, 64);
5138 });
chaviwf1961f72017-09-18 16:41:07 -07005139
5140 {
chaviw0e3479f2018-09-10 16:49:30 -07005141 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005142 // Top left of foreground must now be visible
5143 mCapture->expectFGColor(64, 64);
5144 // But 10 pixels in we should see the child surface
5145 mCapture->expectChildColor(74, 74);
5146 // And 10 more pixels we should be back to the foreground surface
5147 mCapture->expectFGColor(84, 84);
5148 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005149 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07005150 {
chaviw0e3479f2018-09-10 16:49:30 -07005151 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005152 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07005153 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005154 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07005155 mCapture->expectFGColor(84, 84);
5156 }
5157}
5158
5159TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07005160 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08005161 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07005162 ASSERT_TRUE(newSurface->isValid());
5163
5164 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005165 asTransaction([&](Transaction& t) {
5166 t.hide(mChild);
5167 t.show(newSurface);
5168 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005169 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005170 t.setPosition(mFGSurfaceControl, 64, 64);
5171 });
chaviwf1961f72017-09-18 16:41:07 -07005172
5173 {
chaviw0e3479f2018-09-10 16:49:30 -07005174 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005175 // Top left of foreground must now be visible
5176 mCapture->expectFGColor(64, 64);
5177 // At 10, 10 we should see the new surface
5178 mCapture->checkPixel(10, 10, 63, 195, 63);
5179 }
5180
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005181 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07005182
5183 {
chaviw0e3479f2018-09-10 16:49:30 -07005184 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005185 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
5186 // mFGSurface, putting it at 74, 74.
5187 mCapture->expectFGColor(64, 64);
5188 mCapture->checkPixel(74, 74, 63, 195, 63);
5189 mCapture->expectFGColor(84, 84);
5190 }
5191}
5192
chaviwc9674332017-08-28 12:32:18 -07005193TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005194 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
5195 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07005196 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5197
5198 {
chaviw0e3479f2018-09-10 16:49:30 -07005199 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07005200 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
5201 // which begins at 64, 64
5202 mCapture->checkPixel(64, 64, 50, 50, 50);
5203 }
5204}
5205
Robert Carr503c7042017-09-27 15:06:08 -07005206TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005207 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07005208 fillSurfaceRGBA8(relative, 255, 255, 255);
5209
5210 Transaction t;
5211 t.setLayer(relative, INT32_MAX)
5212 .setRelativeLayer(mChild, relative->getHandle(), 1)
5213 .setPosition(mFGSurfaceControl, 0, 0)
5214 .apply(true);
5215
5216 // We expect that the child should have been elevated above our
5217 // INT_MAX layer even though it's not a child of it.
5218 {
chaviw0e3479f2018-09-10 16:49:30 -07005219 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005220 mCapture->expectChildColor(0, 0);
5221 mCapture->expectChildColor(9, 9);
5222 mCapture->checkPixel(10, 10, 255, 255, 255);
5223 }
5224}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005225
Vishnu Nair60356342018-11-13 13:00:45 -08005226class BoundlessLayerTest : public LayerUpdateTest {
5227protected:
5228 std::unique_ptr<ScreenCapture> mCapture;
5229};
5230
5231// Verify setting a size on a buffer layer has no effect.
5232TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5233 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005234 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5235 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005236 ASSERT_TRUE(bufferLayer->isValid());
5237 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5238 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5239 {
5240 mCapture = screenshot();
5241 // Top left of background must now be visible
5242 mCapture->expectBGColor(0, 0);
5243 // Foreground Surface bounds must be color layer
5244 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5245 // Buffer layer should not extend past buffer bounds
5246 mCapture->expectFGColor(95, 95);
5247 }
5248}
5249
5250// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5251// which will crop the color layer.
5252TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5253 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005254 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5255 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005256 ASSERT_TRUE(colorLayer->isValid());
5257 asTransaction([&](Transaction& t) {
5258 t.setColor(colorLayer, half3{0, 0, 0});
5259 t.show(colorLayer);
5260 });
5261 {
5262 mCapture = screenshot();
5263 // Top left of background must now be visible
5264 mCapture->expectBGColor(0, 0);
5265 // Foreground Surface bounds must be color layer
5266 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5267 // Color layer should not extend past foreground bounds
5268 mCapture->expectBGColor(129, 129);
5269 }
5270}
5271
5272// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5273// a crop which will be used to crop the color layer.
5274TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005275 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5276 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005277 ASSERT_TRUE(cropLayer->isValid());
5278 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005279 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5280 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005281 ASSERT_TRUE(colorLayer->isValid());
5282 asTransaction([&](Transaction& t) {
5283 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5284 t.setColor(colorLayer, half3{0, 0, 0});
5285 t.show(cropLayer);
5286 t.show(colorLayer);
5287 });
5288 {
5289 mCapture = screenshot();
5290 // Top left of background must now be visible
5291 mCapture->expectBGColor(0, 0);
5292 // Top left of foreground must now be visible
5293 mCapture->expectFGColor(64, 64);
5294 // 5 pixels from the foreground we should see the child surface
5295 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5296 // 10 pixels from the foreground we should be back to the foreground surface
5297 mCapture->expectFGColor(74, 74);
5298 }
5299}
5300
5301// Verify for boundless layer with no children, their transforms have no effect.
5302TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5303 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005304 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5305 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005306 ASSERT_TRUE(colorLayer->isValid());
5307 asTransaction([&](Transaction& t) {
5308 t.setPosition(colorLayer, 320, 320);
5309 t.setMatrix(colorLayer, 2, 0, 0, 2);
5310 t.setColor(colorLayer, half3{0, 0, 0});
5311 t.show(colorLayer);
5312 });
5313 {
5314 mCapture = screenshot();
5315 // Top left of background must now be visible
5316 mCapture->expectBGColor(0, 0);
5317 // Foreground Surface bounds must be color layer
5318 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5319 // Color layer should not extend past foreground bounds
5320 mCapture->expectBGColor(129, 129);
5321 }
5322}
5323
5324// Verify for boundless layer with children, their transforms have an effect.
5325TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5326 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005327 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5328 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005329 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5330 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005331 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5332 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005333 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5334 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005335 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5336 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005337 ASSERT_TRUE(colorLayer->isValid());
5338 asTransaction([&](Transaction& t) {
5339 t.setPosition(boundlessLayerRightShift, 32, 0);
5340 t.show(boundlessLayerRightShift);
5341 t.setPosition(boundlessLayerDownShift, 0, 32);
5342 t.show(boundlessLayerDownShift);
5343 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5344 t.setColor(colorLayer, half3{0, 0, 0});
5345 t.show(colorLayer);
5346 });
5347 {
5348 mCapture = screenshot();
5349 // Top left of background must now be visible
5350 mCapture->expectBGColor(0, 0);
5351 // Top left of foreground must now be visible
5352 mCapture->expectFGColor(64, 64);
5353 // Foreground Surface bounds must be color layer
5354 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5355 // Color layer should not extend past foreground bounds
5356 mCapture->expectBGColor(129, 129);
5357 }
5358}
5359
5360// Verify child layers do not get clipped if they temporarily move into the negative
5361// coordinate space as the result of an intermediate transformation.
5362TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5363 sp<SurfaceControl> boundlessLayer =
5364 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5365 0 /* flags */, mFGSurfaceControl.get());
5366 ASSERT_TRUE(boundlessLayer != nullptr);
5367 ASSERT_TRUE(boundlessLayer->isValid());
5368 sp<SurfaceControl> colorLayer =
5369 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5370 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5371 ASSERT_TRUE(colorLayer != nullptr);
5372 ASSERT_TRUE(colorLayer->isValid());
5373 asTransaction([&](Transaction& t) {
5374 // shift child layer off bounds. If this layer was not boundless, we will
5375 // expect the child layer to be cropped.
5376 t.setPosition(boundlessLayer, 32, 32);
5377 t.show(boundlessLayer);
5378 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5379 // undo shift by parent
5380 t.setPosition(colorLayer, -32, -32);
5381 t.setColor(colorLayer, half3{0, 0, 0});
5382 t.show(colorLayer);
5383 });
5384 {
5385 mCapture = screenshot();
5386 // Top left of background must now be visible
5387 mCapture->expectBGColor(0, 0);
5388 // Foreground Surface bounds must be color layer
5389 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5390 // Color layer should not extend past foreground bounds
5391 mCapture->expectBGColor(129, 129);
5392 }
5393}
5394
5395// Verify for boundless root layers with children, their transforms have an effect.
5396TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005397 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5398 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005399 ASSERT_TRUE(rootBoundlessLayer->isValid());
5400 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005401 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5402 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5403
Vishnu Nair60356342018-11-13 13:00:45 -08005404 ASSERT_TRUE(colorLayer->isValid());
5405 asTransaction([&](Transaction& t) {
5406 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5407 t.setPosition(rootBoundlessLayer, 32, 32);
5408 t.show(rootBoundlessLayer);
5409 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5410 t.setColor(colorLayer, half3{0, 0, 0});
5411 t.show(colorLayer);
5412 t.hide(mFGSurfaceControl);
5413 });
5414 {
5415 mCapture = screenshot();
5416 // Top left of background must now be visible
5417 mCapture->expectBGColor(0, 0);
5418 // Top left of foreground must now be visible
5419 mCapture->expectBGColor(31, 31);
5420 // Foreground Surface bounds must be color layer
5421 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5422 // Color layer should not extend past foreground bounds
5423 mCapture->expectBGColor(97, 97);
5424 }
5425}
Robert Carr503c7042017-09-27 15:06:08 -07005426
chaviwa76b2712017-09-20 12:02:26 -07005427class ScreenCaptureTest : public LayerUpdateTest {
5428protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005429 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005430};
5431
5432TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5433 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005434 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005435 mCapture->expectBGColor(0, 0);
5436 // Doesn't capture FG layer which is at 64, 64
5437 mCapture->expectBGColor(64, 64);
5438}
5439
5440TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5441 auto fgHandle = mFGSurfaceControl->getHandle();
5442
Vishnu Nair88a11f22018-11-28 18:30:57 -08005443 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5444 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005445 fillSurfaceRGBA8(child, 200, 200, 200);
5446
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005447 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005448
5449 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005450 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005451 mCapture->expectFGColor(10, 10);
5452 mCapture->expectChildColor(0, 0);
5453}
5454
Robert Carr578038f2018-03-09 12:25:24 -08005455TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5456 auto fgHandle = mFGSurfaceControl->getHandle();
5457
Vishnu Nair88a11f22018-11-28 18:30:57 -08005458 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5459 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005460 fillSurfaceRGBA8(child, 200, 200, 200);
5461
5462 SurfaceComposerClient::Transaction().show(child).apply(true);
5463
5464 // Captures mFGSurfaceControl's child
5465 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5466 mCapture->checkPixel(10, 10, 0, 0, 0);
5467 mCapture->expectChildColor(0, 0);
5468}
5469
Robert Carr866455f2019-04-02 16:28:26 -07005470TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5471 auto fgHandle = mFGSurfaceControl->getHandle();
5472
5473 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5474 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5475 fillSurfaceRGBA8(child, 200, 200, 200);
5476 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5477 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5478 fillSurfaceRGBA8(child2, 200, 0, 200);
5479
5480 SurfaceComposerClient::Transaction()
5481 .show(child)
5482 .show(child2)
5483 .setLayer(child, 1)
5484 .setLayer(child2, 2)
5485 .apply(true);
5486
5487 // Child2 would be visible but its excluded, so we should see child1 color instead.
5488 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5489 mCapture->checkPixel(10, 10, 0, 0, 0);
5490 mCapture->checkPixel(0, 0, 200, 200, 200);
5491}
5492
5493// Like the last test but verifies that children are also exclude.
5494TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5495 auto fgHandle = mFGSurfaceControl->getHandle();
5496
5497 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5498 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5499 fillSurfaceRGBA8(child, 200, 200, 200);
5500 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5501 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5502 fillSurfaceRGBA8(child2, 200, 0, 200);
5503 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5504 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5505 fillSurfaceRGBA8(child2, 200, 0, 200);
5506
5507 SurfaceComposerClient::Transaction()
5508 .show(child)
5509 .show(child2)
5510 .show(child3)
5511 .setLayer(child, 1)
5512 .setLayer(child2, 2)
5513 .apply(true);
5514
5515 // Child2 would be visible but its excluded, so we should see child1 color instead.
5516 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5517 mCapture->checkPixel(10, 10, 0, 0, 0);
5518 mCapture->checkPixel(0, 0, 200, 200, 200);
5519}
5520
chaviw50da5042018-04-09 13:49:37 -07005521TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005522 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5523 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005524
5525 fillSurfaceRGBA8(child, 200, 200, 200);
5526
5527 SurfaceComposerClient::Transaction().show(child).apply(true);
5528
5529 auto childHandle = child->getHandle();
5530
5531 // Captures child
5532 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5533 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5534 // Area outside of child's bounds is transparent.
5535 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5536}
5537
chaviw4b129c22018-04-09 16:19:43 -07005538TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5539 auto fgHandle = mFGSurfaceControl->getHandle();
5540
Vishnu Nair88a11f22018-11-28 18:30:57 -08005541 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5542 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5543 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005544 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005545 fillSurfaceRGBA8(child, 200, 200, 200);
5546 fillSurfaceRGBA8(relative, 100, 100, 100);
5547
5548 SurfaceComposerClient::Transaction()
5549 .show(child)
5550 // Set relative layer above fg layer so should be shown above when computing all layers.
5551 .setRelativeLayer(relative, fgHandle, 1)
5552 .show(relative)
5553 .apply(true);
5554
5555 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5556 ScreenCapture::captureLayers(&mCapture, fgHandle);
5557 mCapture->expectFGColor(10, 10);
5558 mCapture->expectChildColor(0, 0);
5559}
5560
5561TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5562 auto fgHandle = mFGSurfaceControl->getHandle();
5563
Vishnu Nair88a11f22018-11-28 18:30:57 -08005564 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5565 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5566 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5567 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005568 fillSurfaceRGBA8(child, 200, 200, 200);
5569 fillSurfaceRGBA8(relative, 100, 100, 100);
5570
5571 SurfaceComposerClient::Transaction()
5572 .show(child)
5573 // Set relative layer below fg layer but relative to child layer so it should be shown
5574 // above child layer.
5575 .setLayer(relative, -1)
5576 .setRelativeLayer(relative, child->getHandle(), 1)
5577 .show(relative)
5578 .apply(true);
5579
5580 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5581 // relative value should be taken into account, placing it above child layer.
5582 ScreenCapture::captureLayers(&mCapture, fgHandle);
5583 mCapture->expectFGColor(10, 10);
5584 // Relative layer is showing on top of child layer
5585 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5586}
Robert Carr578038f2018-03-09 12:25:24 -08005587
5588// In the following tests we verify successful skipping of a parent layer,
5589// so we use the same verification logic and only change how we mutate
5590// the parent layer to verify that various properties are ignored.
5591class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5592public:
5593 void SetUp() override {
5594 LayerUpdateTest::SetUp();
5595
Vishnu Nair88a11f22018-11-28 18:30:57 -08005596 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5597 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005598 fillSurfaceRGBA8(mChild, 200, 200, 200);
5599
5600 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5601 }
5602
Vishnu Nair333a9572019-02-15 16:05:56 -08005603 void verify(std::function<void()> verifyStartingState) {
5604 // Verify starting state before a screenshot is taken.
5605 verifyStartingState();
5606
5607 // Verify child layer does not inherit any of the properties of its
5608 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005609 auto fgHandle = mFGSurfaceControl->getHandle();
5610 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5611 mCapture->checkPixel(10, 10, 0, 0, 0);
5612 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005613
5614 // Verify all assumptions are still true after the screenshot is taken.
5615 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005616 }
5617
5618 std::unique_ptr<ScreenCapture> mCapture;
5619 sp<SurfaceControl> mChild;
5620};
5621
Vishnu Nair333a9572019-02-15 16:05:56 -08005622// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005623TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5624
5625 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5626
5627 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005628
5629 // Before and after reparenting, verify child is properly hidden
5630 // when rendering full-screen.
5631 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005632}
5633
5634TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005635 SurfaceComposerClient::Transaction()
5636 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5637 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005638
5639 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005640
5641 // Before and after reparenting, verify child is cropped by parent.
5642 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005643}
5644
Vishnu Nair333a9572019-02-15 16:05:56 -08005645// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005646TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005647 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005648
5649 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005650
Vishnu Nair333a9572019-02-15 16:05:56 -08005651 // Before and after reparenting, verify child is properly scaled.
5652 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005653}
5654
5655
chaviwa76b2712017-09-20 12:02:26 -07005656TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5657 auto fgHandle = mFGSurfaceControl->getHandle();
5658
Vishnu Nair88a11f22018-11-28 18:30:57 -08005659 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5660 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005661 fillSurfaceRGBA8(child, 200, 200, 200);
5662
Vishnu Nair88a11f22018-11-28 18:30:57 -08005663 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5664 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005665
5666 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5667 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005668 .show(child)
5669 .setPosition(grandchild, 5, 5)
5670 .show(grandchild)
5671 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005672
5673 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005674 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005675 mCapture->expectFGColor(10, 10);
5676 mCapture->expectChildColor(0, 0);
5677 mCapture->checkPixel(5, 5, 50, 50, 50);
5678}
5679
5680TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005681 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5682 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005683 fillSurfaceRGBA8(child, 200, 200, 200);
5684 auto childHandle = child->getHandle();
5685
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005686 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005687
5688 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005689 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005690 mCapture->expectChildColor(0, 0);
5691 mCapture->expectChildColor(9, 9);
5692}
5693
5694TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005695 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5696 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005697 fillSurfaceRGBA8(child, 200, 200, 200);
5698 auto childHandle = child->getHandle();
5699
Vishnu Nair88a11f22018-11-28 18:30:57 -08005700 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5701 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005702 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5703
5704 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005705 .show(child)
5706 .setPosition(grandchild, 5, 5)
5707 .show(grandchild)
5708 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005709
5710 auto grandchildHandle = grandchild->getHandle();
5711
5712 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005713 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005714 mCapture->checkPixel(0, 0, 50, 50, 50);
5715 mCapture->checkPixel(4, 4, 50, 50, 50);
5716}
5717
chaviw7206d492017-11-10 16:16:12 -08005718TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005719 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005720 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5721 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005722
Marissa Wall61c58622018-07-18 10:12:20 -07005723 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5724 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005725
5726 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005727 .setLayer(redLayer, INT32_MAX - 1)
5728 .show(redLayer)
5729 .show(blueLayer)
5730 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005731
5732 auto redLayerHandle = redLayer->getHandle();
5733
5734 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005735 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5736 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5737 // red area below the blue area
5738 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5739 // red area to the right of the blue area
5740 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005741
Marissa Wall861616d2018-10-22 12:52:23 -07005742 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005743 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005744 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5745 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005746 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005747 mCapture->checkPixel(30, 30, 0, 0, 0);
5748}
5749
5750TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005751 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005752 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5753 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005754
Marissa Wall61c58622018-07-18 10:12:20 -07005755 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5756 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005757
5758 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005759 .setLayer(redLayer, INT32_MAX - 1)
5760 .show(redLayer)
5761 .show(blueLayer)
5762 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005763
5764 auto redLayerHandle = redLayer->getHandle();
5765
5766 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005767 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5768 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5769 // red area below the blue area
5770 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5771 // red area to the right of the blue area
5772 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005773
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005774 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005775 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005776 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5777 // red area below the blue area
5778 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5779 // red area to the right of the blue area
5780 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005781 mCapture->checkPixel(30, 30, 0, 0, 0);
5782}
5783
5784TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005785 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005786
Marissa Wall61c58622018-07-18 10:12:20 -07005787 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005788
5789 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005790 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005791 SurfaceComposerClient::Transaction().apply(true);
5792
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005793 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005794
5795 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005796 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5797 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005798}
5799
chaviw8e3fe5d2018-02-22 10:55:42 -08005800
5801class DereferenceSurfaceControlTest : public LayerTransactionTest {
5802protected:
5803 void SetUp() override {
5804 LayerTransactionTest::SetUp();
5805 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005806 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005807 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005808 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005809 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5810 {
5811 SCOPED_TRACE("before anything");
5812 auto shot = screenshot();
5813 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5814 }
5815 }
5816 void TearDown() override {
5817 LayerTransactionTest::TearDown();
5818 bgLayer = 0;
5819 fgLayer = 0;
5820 }
5821
5822 sp<SurfaceControl> bgLayer;
5823 sp<SurfaceControl> fgLayer;
5824};
5825
5826TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5827 fgLayer = nullptr;
5828 {
5829 SCOPED_TRACE("after setting null");
5830 auto shot = screenshot();
5831 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5832 }
5833}
5834
5835TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5836 auto transaction = Transaction().show(fgLayer);
5837 fgLayer = nullptr;
5838 {
5839 SCOPED_TRACE("after setting null");
5840 auto shot = screenshot();
5841 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5842 }
5843}
5844
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005845class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5846protected:
5847 virtual void SetUp() {
5848 LayerTransactionTest::SetUp();
5849 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5850
5851 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5852 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5853
5854 sp<IGraphicBufferConsumer> consumer;
5855 BufferQueue::createBufferQueue(&mProducer, &consumer);
5856 consumer->setConsumerName(String8("Virtual disp consumer"));
5857 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5858 }
5859
5860 virtual void TearDown() {
5861 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5862 LayerTransactionTest::TearDown();
5863 mColorLayer = 0;
5864 }
5865
5866 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5867 mVirtualDisplay =
5868 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5869 asTransaction([&](Transaction& t) {
5870 t.setDisplaySurface(mVirtualDisplay, mProducer);
5871 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5872 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5873 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5874 });
5875 }
5876
5877 void createColorLayer(uint32_t layerStack) {
5878 mColorLayer =
5879 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5880 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5881 ASSERT_TRUE(mColorLayer != nullptr);
5882 ASSERT_TRUE(mColorLayer->isValid());
5883 asTransaction([&](Transaction& t) {
5884 t.setLayerStack(mColorLayer, layerStack);
5885 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5886 t.setLayer(mColorLayer, INT32_MAX - 2);
5887 t.setColor(mColorLayer,
5888 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5889 mExpectedColor.b / 255.0f});
5890 t.show(mColorLayer);
5891 });
5892 }
5893
5894 DisplayInfo mMainDisplayInfo;
5895 sp<IBinder> mMainDisplay;
5896 sp<IBinder> mVirtualDisplay;
5897 sp<IGraphicBufferProducer> mProducer;
5898 sp<SurfaceControl> mColorLayer;
5899 Color mExpectedColor = {63, 63, 195, 255};
5900};
5901
5902TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5903 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5904 createColorLayer(1 /* layerStack */);
5905
5906 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5907
5908 // Verify color layer does not render on main display.
5909 std::unique_ptr<ScreenCapture> sc;
5910 ScreenCapture::captureScreen(&sc, mMainDisplay);
5911 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5912 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5913
5914 // Verify color layer renders correctly on virtual display.
5915 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5916 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5917 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5918}
5919
5920TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5921 // Create a display and set its layer stack to the main display's layer stack so
5922 // the contents of the main display are mirrored on to the virtual display.
5923
5924 // Assumption here is that the new mirrored display has the same viewport as the
5925 // primary display that it is mirroring.
5926 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5927 createColorLayer(0 /* layerStack */);
5928
5929 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5930
5931 // Verify color layer renders correctly on main display and it is mirrored on the
5932 // virtual display.
5933 std::unique_ptr<ScreenCapture> sc;
5934 ScreenCapture::captureScreen(&sc, mMainDisplay);
5935 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5936 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5937
5938 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5939 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5940 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5941}
5942
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005943class DisplayActiveConfigTest : public ::testing::Test {
5944protected:
5945 void SetUp() override {
5946 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5947 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5948 EXPECT_GT(mDisplayconfigs.size(), 0);
5949
5950 // set display power to on to make sure config can be changed
5951 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5952 }
5953
5954 sp<IBinder> mDisplayToken;
5955 Vector<DisplayInfo> mDisplayconfigs;
5956};
5957
5958TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5959 std::vector<int32_t> allowedConfigs;
5960
5961 // Add all configs to the allowed configs
5962 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5963 allowedConfigs.push_back(i);
5964 }
5965
5966 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5967 EXPECT_EQ(res, NO_ERROR);
5968
5969 std::vector<int32_t> outConfigs;
5970 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5971 EXPECT_EQ(res, NO_ERROR);
5972 EXPECT_EQ(allowedConfigs, outConfigs);
5973}
5974
5975TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5976 // we need at least 2 configs available for this test
5977 if (mDisplayconfigs.size() <= 1) return;
5978
5979 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5980
5981 // We want to set the allowed config to everything but the active config
5982 std::vector<int32_t> allowedConfigs;
5983 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5984 if (i != activeConfig) {
5985 allowedConfigs.push_back(i);
5986 }
5987 }
5988
5989 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5990 EXPECT_EQ(res, NO_ERROR);
5991
5992 // Allow some time for the config change
5993 std::this_thread::sleep_for(200ms);
5994
5995 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5996 EXPECT_NE(activeConfig, newActiveConfig);
5997
5998 // Make sure the new config is part of allowed config
5999 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
6000 allowedConfigs.end());
6001}
6002
Vishnu Nairda9c85a2019-06-03 17:26:48 -07006003class RelativeZTest : public LayerTransactionTest {
6004protected:
6005 virtual void SetUp() {
6006 LayerTransactionTest::SetUp();
6007 ASSERT_EQ(NO_ERROR, mClient->initCheck());
6008
6009 const auto display = SurfaceComposerClient::getInternalDisplayToken();
6010 ASSERT_FALSE(display == nullptr);
6011
6012 // Back layer
6013 mBackgroundLayer = createColorLayer("Background layer", Color::RED);
6014
6015 // Front layer
6016 mForegroundLayer = createColorLayer("Foreground layer", Color::GREEN);
6017
6018 asTransaction([&](Transaction& t) {
6019 t.setDisplayLayerStack(display, 0);
6020 t.setLayer(mBackgroundLayer, INT32_MAX - 2).show(mBackgroundLayer);
6021 t.setLayer(mForegroundLayer, INT32_MAX - 1).show(mForegroundLayer);
6022 });
6023 }
6024
6025 virtual void TearDown() {
6026 LayerTransactionTest::TearDown();
6027 mBackgroundLayer = 0;
6028 mForegroundLayer = 0;
6029 }
6030
6031 sp<SurfaceControl> mBackgroundLayer;
6032 sp<SurfaceControl> mForegroundLayer;
6033};
6034
6035// When a layer is reparented offscreen, remove relative z order if the relative parent
6036// is still onscreen so that the layer is not drawn.
6037TEST_F(RelativeZTest, LayerRemoved) {
6038 std::unique_ptr<ScreenCapture> sc;
6039
6040 // Background layer (RED)
6041 // Child layer (WHITE) (relative to foregroud layer)
6042 // Foregroud layer (GREEN)
6043 sp<SurfaceControl> childLayer =
6044 createColorLayer("Child layer", Color::BLUE, mBackgroundLayer.get());
6045
6046 Transaction{}
6047 .setRelativeLayer(childLayer, mForegroundLayer->getHandle(), 1)
6048 .show(childLayer)
6049 .apply();
6050
6051 {
6052 // The childLayer should be in front of the FG control.
6053 ScreenCapture::captureScreen(&sc);
6054 sc->checkPixel(1, 1, Color::BLUE.r, Color::BLUE.g, Color::BLUE.b);
6055 }
6056
6057 // Background layer (RED)
6058 // Foregroud layer (GREEN)
6059 Transaction{}.reparent(childLayer, nullptr).apply();
6060
6061 // Background layer (RED)
6062 // Child layer (WHITE)
6063 // Foregroud layer (GREEN)
6064 Transaction{}.reparent(childLayer, mBackgroundLayer->getHandle()).apply();
6065
6066 {
6067 // The relative z info for child layer should be reset, leaving FG control on top.
6068 ScreenCapture::captureScreen(&sc);
6069 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6070 }
6071}
6072
6073// When a layer is reparented offscreen, preseve relative z order if the relative parent
6074// is also offscreen. Regression test b/132613412
6075TEST_F(RelativeZTest, LayerRemovedOffscreenRelativeParent) {
6076 std::unique_ptr<ScreenCapture> sc;
6077
6078 // Background layer (RED)
6079 // Foregroud layer (GREEN)
6080 // child level 1 (WHITE)
6081 // child level 2a (BLUE)
6082 // child level 3 (GREEN) (relative to child level 2b)
6083 // child level 2b (BLACK)
6084 sp<SurfaceControl> childLevel1 =
6085 createColorLayer("child level 1", Color::WHITE, mForegroundLayer.get());
6086 sp<SurfaceControl> childLevel2a =
6087 createColorLayer("child level 2a", Color::BLUE, childLevel1.get());
6088 sp<SurfaceControl> childLevel2b =
6089 createColorLayer("child level 2b", Color::BLACK, childLevel1.get());
6090 sp<SurfaceControl> childLevel3 =
6091 createColorLayer("child level 3", Color::GREEN, childLevel2a.get());
6092
6093 Transaction{}
6094 .setRelativeLayer(childLevel3, childLevel2b->getHandle(), 1)
6095 .show(childLevel2a)
6096 .show(childLevel2b)
6097 .show(childLevel3)
6098 .apply();
6099
6100 {
6101 // The childLevel3 should be in front of childLevel2b.
6102 ScreenCapture::captureScreen(&sc);
6103 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6104 }
6105
6106 // Background layer (RED)
6107 // Foregroud layer (GREEN)
6108 Transaction{}.reparent(childLevel1, nullptr).apply();
6109
6110 // Background layer (RED)
6111 // Foregroud layer (GREEN)
6112 // child level 1 (WHITE)
6113 // child level 2 back (BLUE)
6114 // child level 3 (GREEN) (relative to child level 2b)
6115 // child level 2 front (BLACK)
6116 Transaction{}.reparent(childLevel1, mForegroundLayer->getHandle()).apply();
6117
6118 {
6119 // Nothing should change at this point since relative z info was preserved.
6120 ScreenCapture::captureScreen(&sc);
6121 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6122 }
6123}
6124
Steven Thomas44685cb2019-07-23 16:19:31 -07006125// This test ensures that when we drop an app buffer in SurfaceFlinger, we merge
6126// the dropped buffer's damage region into the next buffer's damage region. If
6127// we don't do this, we'll report an incorrect damage region to hardware
6128// composer, resulting in broken rendering. This test checks the BufferQueue
6129// case.
6130//
6131// Unfortunately, we don't currently have a way to inspect the damage region
6132// SurfaceFlinger sends to hardware composer from a test, so this test requires
6133// the dev to manually watch the device's screen during the test to spot broken
6134// rendering. Because the results can't be automatically verified, this test is
6135// marked disabled.
6136TEST_F(LayerTransactionTest, DISABLED_BufferQueueLayerMergeDamageRegionWhenDroppingBuffers) {
6137 const int width = mDisplayWidth;
6138 const int height = mDisplayHeight;
6139 sp<SurfaceControl> layer;
6140 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
6141 const auto producer = layer->getIGraphicBufferProducer();
6142 const sp<IProducerListener> dummyListener(new DummyProducerListener);
6143 IGraphicBufferProducer::QueueBufferOutput queueBufferOutput;
6144 ASSERT_EQ(OK,
6145 producer->connect(dummyListener, NATIVE_WINDOW_API_CPU, true, &queueBufferOutput));
6146
6147 std::map<int, sp<GraphicBuffer>> slotMap;
6148 auto slotToBuffer = [&](int slot, sp<GraphicBuffer>* buf) {
6149 ASSERT_NE(nullptr, buf);
6150 const auto iter = slotMap.find(slot);
6151 ASSERT_NE(slotMap.end(), iter);
6152 *buf = iter->second;
6153 };
6154
6155 auto dequeue = [&](int* outSlot) {
6156 ASSERT_NE(nullptr, outSlot);
6157 *outSlot = -1;
6158 int slot;
6159 sp<Fence> fence;
6160 uint64_t age;
6161 FrameEventHistoryDelta timestamps;
6162 const status_t dequeueResult =
6163 producer->dequeueBuffer(&slot, &fence, width, height, PIXEL_FORMAT_RGBA_8888,
6164 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
6165 &age, &timestamps);
6166 if (dequeueResult == IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) {
6167 sp<GraphicBuffer> newBuf;
6168 ASSERT_EQ(OK, producer->requestBuffer(slot, &newBuf));
6169 ASSERT_NE(nullptr, newBuf.get());
6170 slotMap[slot] = newBuf;
6171 } else {
6172 ASSERT_EQ(OK, dequeueResult);
6173 }
6174 *outSlot = slot;
6175 };
6176
6177 auto queue = [&](int slot, const Region& damage, nsecs_t displayTime) {
6178 IGraphicBufferProducer::QueueBufferInput input(
6179 /*timestamp=*/displayTime, /*isAutoTimestamp=*/false, HAL_DATASPACE_UNKNOWN,
6180 /*crop=*/Rect::EMPTY_RECT, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW,
6181 /*transform=*/0, Fence::NO_FENCE);
6182 input.setSurfaceDamage(damage);
6183 IGraphicBufferProducer::QueueBufferOutput output;
6184 ASSERT_EQ(OK, producer->queueBuffer(slot, input, &output));
6185 };
6186
6187 auto fillAndPostBuffers = [&](const Color& color) {
6188 int slot1;
6189 ASSERT_NO_FATAL_FAILURE(dequeue(&slot1));
6190 int slot2;
6191 ASSERT_NO_FATAL_FAILURE(dequeue(&slot2));
6192
6193 sp<GraphicBuffer> buf1;
6194 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot1, &buf1));
6195 sp<GraphicBuffer> buf2;
6196 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot2, &buf2));
6197 fillGraphicBufferColor(buf1, Rect(width, height), color);
6198 fillGraphicBufferColor(buf2, Rect(width, height), color);
6199
6200 const auto displayTime = systemTime() + milliseconds_to_nanoseconds(100);
6201 ASSERT_NO_FATAL_FAILURE(queue(slot1, Region::INVALID_REGION, displayTime));
6202 ASSERT_NO_FATAL_FAILURE(
6203 queue(slot2, Region(Rect(width / 3, height / 3, 2 * width / 3, 2 * height / 3)),
6204 displayTime));
6205 };
6206
6207 const auto startTime = systemTime();
6208 const std::array<Color, 3> colors = {Color::RED, Color::GREEN, Color::BLUE};
6209 int colorIndex = 0;
6210 while (nanoseconds_to_seconds(systemTime() - startTime) < 10) {
6211 ASSERT_NO_FATAL_FAILURE(fillAndPostBuffers(colors[colorIndex++ % colors.size()]));
6212 std::this_thread::sleep_for(1s);
6213 }
6214
6215 ASSERT_EQ(OK, producer->disconnect(NATIVE_WINDOW_API_CPU));
6216}
6217
Chavi Weingarten40482ff2017-11-30 01:51:40 +00006218} // namespace android