blob: bc5642ecd365e76c12edc7aca6ab57f1aa5da00e [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>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070035#include <hardware/hwcomposer_defs.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080036#include <private/android_filesystem_config.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070037#include <private/gui/ComposerService.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080038
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070039#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070040#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070041#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070042#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070043
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070045#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080046#include <sys/types.h>
47#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070048
Marissa Wall713b63f2018-10-17 15:42:43 -070049#include "BufferGenerator.h"
50
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070051namespace android {
52
Chia-I Wu718daf82017-10-20 11:57:17 -070053namespace {
54
55struct Color {
56 uint8_t r;
57 uint8_t g;
58 uint8_t b;
59 uint8_t a;
60
61 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070062 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070063 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070064 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070065 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070066 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070067};
68
69const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070070const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070071const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070072const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070073const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070074const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070075
Marissa Wall61c58622018-07-18 10:12:20 -070076using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070077using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070078
Chia-I Wu718daf82017-10-20 11:57:17 -070079std::ostream& operator<<(std::ostream& os, const Color& color) {
80 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
81 return os;
82}
83
84// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070085void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
86 const Color& color) {
87 Rect r(0, 0, buffer.width, buffer.height);
88 if (!r.intersect(rect, &r)) {
89 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070090 }
91
Marissa Wall61c58622018-07-18 10:12:20 -070092 int32_t width = r.right - r.left;
93 int32_t height = r.bottom - r.top;
94
95 for (int32_t row = 0; row < height; row++) {
96 uint8_t* dst =
97 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
98 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070099 dst[0] = color.r;
100 dst[1] = color.g;
101 dst[2] = color.b;
102 dst[3] = color.a;
103 dst += 4;
104 }
105 }
106}
107
Marissa Wall61c58622018-07-18 10:12:20 -0700108// Fill a region with the specified color.
109void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
110 Rect r(0, 0, buffer->width, buffer->height);
111 if (!r.intersect(rect, &r)) {
112 return;
113 }
114
115 int32_t width = r.right - r.left;
116 int32_t height = r.bottom - r.top;
117
118 uint8_t* pixels;
119 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
120 reinterpret_cast<void**>(&pixels));
121
122 for (int32_t row = 0; row < height; row++) {
123 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
124 for (int32_t column = 0; column < width; column++) {
125 dst[0] = color.r;
126 dst[1] = color.g;
127 dst[2] = color.b;
128 dst[3] = color.a;
129 dst += 4;
130 }
131 }
132 buffer->unlock();
133}
134
Chia-I Wu718daf82017-10-20 11:57:17 -0700135// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000136void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700137 const Color& color, uint8_t tolerance) {
138 int32_t x = rect.left;
139 int32_t y = rect.top;
140 int32_t width = rect.right - rect.left;
141 int32_t height = rect.bottom - rect.top;
142
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000143 int32_t bufferWidth = int32_t(outBuffer->getWidth());
144 int32_t bufferHeight = int32_t(outBuffer->getHeight());
145 if (x + width > bufferWidth) {
146 x = std::min(x, bufferWidth);
147 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000149 if (y + height > bufferHeight) {
150 y = std::min(y, bufferHeight);
151 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700152 }
153
154 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
155 uint8_t tmp = a >= b ? a - b : b - a;
156 return tmp <= tolerance;
157 };
158 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000159 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700160 for (int32_t i = 0; i < width; i++) {
161 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
162 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
163 << "pixel @ (" << x + i << ", " << y + j << "): "
164 << "expected (" << color << "), "
165 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
166 src += 4;
167 }
168 }
169}
170
171} // anonymous namespace
172
Robert Carr4cdc58f2017-08-23 14:22:20 -0700173using Transaction = SurfaceComposerClient::Transaction;
174
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700176static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
177 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700179 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800180 ASSERT_TRUE(s != nullptr);
181 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800182 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700183 for (int y = 0; y < outBuffer.height; y++) {
184 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700185 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700186 pixel[0] = r;
187 pixel[1] = g;
188 pixel[2] = b;
189 pixel[3] = 255;
190 }
191 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700192 if (unlock) {
193 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
194 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700195}
196
197// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
198// individual pixel values for testing purposes.
199class ScreenCapture : public RefBase {
200public:
chaviw0e3479f2018-09-10 16:49:30 -0700201 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800202 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
203 }
204
205 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800206 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700207 SurfaceComposerClient::Transaction().apply(true);
208
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000209 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800210 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700211 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000212 }
213
214 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
215 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
216 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
217 SurfaceComposerClient::Transaction().apply(true);
218
219 sp<GraphicBuffer> outBuffer;
220 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
221 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700222 }
223
Robert Carr578038f2018-03-09 12:25:24 -0800224 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
225 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
226 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
227 SurfaceComposerClient::Transaction().apply(true);
228
229 sp<GraphicBuffer> outBuffer;
230 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
231 *sc = std::make_unique<ScreenCapture>(outBuffer);
232 }
233
Chia-I Wu718daf82017-10-20 11:57:17 -0700234 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000235 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
236 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700237 }
238
239 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000240 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700241 const bool leftBorder = rect.left > 0;
242 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000243 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
244 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700245
246 if (topBorder) {
247 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
248 if (leftBorder) {
249 top.left -= 1;
250 }
251 if (rightBorder) {
252 top.right += 1;
253 }
254 expectColor(top, color, tolerance);
255 }
256 if (leftBorder) {
257 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
258 expectColor(left, color, tolerance);
259 }
260 if (rightBorder) {
261 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
262 expectColor(right, color, tolerance);
263 }
264 if (bottomBorder) {
265 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
266 if (leftBorder) {
267 bottom.left -= 1;
268 }
269 if (rightBorder) {
270 bottom.right += 1;
271 }
272 expectColor(bottom, color, tolerance);
273 }
274 }
275
Chia-I Wu93853fe2017-11-02 08:30:27 -0700276 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
277 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
278 uint8_t tolerance = 0) {
279 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
280
281 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
282 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
283 // avoid checking borders due to unspecified filtering behavior
284 const int32_t offsetX = filtered ? 2 : 0;
285 const int32_t offsetY = filtered ? 2 : 0;
286 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
287 tolerance);
288 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
289 tolerance);
290 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
291 tolerance);
292 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
293 bottomRight, tolerance);
294 }
295
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700296 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000297 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
298 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700299 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
300 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700301 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
302 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700303 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700304 }
305 }
306
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700307 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700308
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700309 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700310
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700311 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700312
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800313 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000314 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700315 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700316
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000317 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700318
319private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000320 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800321 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700322};
323
Chia-I Wu718daf82017-10-20 11:57:17 -0700324class LayerTransactionTest : public ::testing::Test {
325protected:
326 void SetUp() override {
327 mClient = new SurfaceComposerClient;
328 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
329
330 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700331
332 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700333 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700334 }
335
chaviw0e3479f2018-09-10 16:49:30 -0700336 virtual void TearDown() {
337 mBlackBgSurface = 0;
338 mClient->dispose();
339 mClient = 0;
340 }
341
Marissa Wallfda30bb2018-10-12 11:34:28 -0700342 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
343 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800344 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
345 auto layer =
346 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700347
Vishnu Nair60356342018-11-13 13:00:45 -0800348 Transaction t;
349 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800350
351 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700352 if (error != NO_ERROR) {
353 ADD_FAILURE() << "failed to initialize SurfaceControl";
354 layer.clear();
355 }
356
357 return layer;
358 }
359
Vishnu Nair88a11f22018-11-28 18:30:57 -0800360 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
361 const char* name, uint32_t width, uint32_t height,
362 PixelFormat format, uint32_t flags,
363 SurfaceControl* parent = nullptr) {
364 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
365 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
366 return layer;
367 }
368
Marissa Wallfda30bb2018-10-12 11:34:28 -0700369 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800370 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
371 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700372 }
373
Marissa Wall61c58622018-07-18 10:12:20 -0700374 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700375 // wait for previous transactions (such as setSize) to complete
376 Transaction().apply(true);
377
378 ANativeWindow_Buffer buffer = {};
379 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
380
381 return buffer;
382 }
383
Marissa Wall61c58622018-07-18 10:12:20 -0700384 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700385 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
386
387 // wait for the newly posted buffer to be latched
388 waitForLayerBuffers();
389 }
390
Marissa Wall61c58622018-07-18 10:12:20 -0700391 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
392 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700393 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700394 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
395 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
396 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700397 }
398
Marissa Wall61c58622018-07-18 10:12:20 -0700399 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
400 int32_t bufferWidth, int32_t bufferHeight) {
401 sp<GraphicBuffer> buffer =
402 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
403 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
404 BufferUsage::COMPOSER_OVERLAY,
405 "test");
406 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700407 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700408 }
409
410 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
411 int32_t bufferWidth, int32_t bufferHeight) {
412 switch (mLayerType) {
413 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
414 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
415 break;
416 case ISurfaceComposerClient::eFXSurfaceBufferState:
417 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
418 break;
419 default:
420 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
421 }
422 }
423
424 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
425 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700426 const Color& topRight, const Color& bottomLeft,
427 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700428 switch (mLayerType) {
429 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
430 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
431 bottomLeft, bottomRight);
432 break;
433 case ISurfaceComposerClient::eFXSurfaceBufferState:
434 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
435 bottomLeft, bottomRight);
436 break;
437 default:
438 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
439 }
440 }
441
442 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
443 int32_t bufferHeight, const Color& topLeft,
444 const Color& topRight, const Color& bottomLeft,
445 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700446 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700447 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
448 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700449
Marissa Wall61c58622018-07-18 10:12:20 -0700450 const int32_t halfW = bufferWidth / 2;
451 const int32_t halfH = bufferHeight / 2;
452 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
453 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
454 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
455 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
456 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700457
Marissa Wall61c58622018-07-18 10:12:20 -0700458 postBufferQueueLayerBuffer(layer);
459 }
460
461 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
462 int32_t bufferHeight, const Color& topLeft,
463 const Color& topRight, const Color& bottomLeft,
464 const Color& bottomRight) {
465 sp<GraphicBuffer> buffer =
466 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
467 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
468 BufferUsage::COMPOSER_OVERLAY,
469 "test");
470
471 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
472
473 const int32_t halfW = bufferWidth / 2;
474 const int32_t halfH = bufferHeight / 2;
475 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
476 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
477 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
478 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
479
480 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700481 }
482
chaviw0e3479f2018-09-10 16:49:30 -0700483 std::unique_ptr<ScreenCapture> screenshot() {
484 std::unique_ptr<ScreenCapture> screenshot;
485 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700486 return screenshot;
487 }
488
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800489 void asTransaction(const std::function<void(Transaction&)>& exec) {
490 Transaction t;
491 exec(t);
492 t.apply(true);
493 }
494
Marissa Wall713b63f2018-10-17 15:42:43 -0700495 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
496 static BufferGenerator bufferGenerator;
497 return bufferGenerator.get(outBuffer, outFence);
498 }
499
Chia-I Wu718daf82017-10-20 11:57:17 -0700500 sp<SurfaceComposerClient> mClient;
501
502 sp<IBinder> mDisplay;
503 uint32_t mDisplayWidth;
504 uint32_t mDisplayHeight;
505 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700506 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700507
508 // leave room for ~256 layers
509 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
510
chaviw0e3479f2018-09-10 16:49:30 -0700511 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700512 bool mColorManagementUsed;
513
Chia-I Wu718daf82017-10-20 11:57:17 -0700514private:
515 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800516 mDisplay = mClient->getInternalDisplayToken();
517 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700518
519 // get display width/height
520 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800521 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700522 mDisplayWidth = info.w;
523 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700524 mDisplayRect =
525 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700526
527 // After a new buffer is queued, SurfaceFlinger is notified and will
528 // latch the new buffer on next vsync. Let's heuristically wait for 3
529 // vsyncs.
530 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
531
532 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700533
Vishnu Nair88a11f22018-11-28 18:30:57 -0800534 mBlackBgSurface =
535 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
536 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700537
Chia-I Wu718daf82017-10-20 11:57:17 -0700538 // set layer stack (b/68888219)
539 Transaction t;
540 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800541 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700542 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
543 t.setColor(mBlackBgSurface, half3{0, 0, 0});
544 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700545 t.apply();
546 }
547
chaviw0e3479f2018-09-10 16:49:30 -0700548 void waitForLayerBuffers() {
549 // Request an empty transaction to get applied synchronously to ensure the buffer is
550 // latched.
551 Transaction().apply(true);
552 usleep(mBufferPostDelay);
553 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700554
555 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800556
557 friend class LayerRenderPathTestHarness;
558};
559enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
560
561class LayerRenderPathTestHarness {
562public:
563 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
564 : mDelegate(delegate), mRenderPath(renderPath) {}
565
566 std::unique_ptr<ScreenCapture> getScreenCapture() {
567 switch (mRenderPath) {
568 case RenderPath::SCREENSHOT:
569 return mDelegate->screenshot();
570 case RenderPath::VIRTUAL_DISPLAY:
571
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800572 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800573 DisplayInfo mainDisplayInfo;
574 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
575
576 sp<IBinder> vDisplay;
577 sp<IGraphicBufferProducer> producer;
578 sp<IGraphicBufferConsumer> consumer;
579 sp<BufferItemConsumer> itemConsumer;
580 BufferQueue::createBufferQueue(&producer, &consumer);
581
582 consumer->setConsumerName(String8("Virtual disp consumer"));
583 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
584
585 itemConsumer = new BufferItemConsumer(consumer,
586 // Sample usage bits from screenrecord
587 GRALLOC_USAGE_HW_VIDEO_ENCODER |
588 GRALLOC_USAGE_SW_READ_OFTEN);
589
590 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
591 false /*secure*/);
592
593 SurfaceComposerClient::Transaction t;
594 t.setDisplaySurface(vDisplay, producer);
595 t.setDisplayLayerStack(vDisplay, 0);
596 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
597 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
598 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
599 t.apply();
600 SurfaceComposerClient::Transaction().apply(true);
601 BufferItem item;
602 itemConsumer->acquireBuffer(&item, 0, true);
603 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
604 itemConsumer->releaseBuffer(item);
605 SurfaceComposerClient::destroyDisplay(vDisplay);
606 return sc;
607 }
608 }
609
610protected:
611 LayerTransactionTest* mDelegate;
612 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700613};
614
Alec Mouri80863a62019-01-17 15:19:35 -0800615class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700616public:
Alec Mouri80863a62019-01-17 15:19:35 -0800617 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700618
619 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800620 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700621 // if the flags already have a layer type specified, return an error
622 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
623 return nullptr;
624 }
chaviwf66724d2018-11-28 16:35:21 -0800625 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700626 }
627
628 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
629 int32_t bufferHeight) {
630 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
631 bufferWidth, bufferHeight));
632 }
633
634 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
635 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
636 const Color& bottomLeft, const Color& bottomRight) {
637 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
638 bufferWidth, bufferHeight,
639 topLeft, topRight,
640 bottomLeft, bottomRight));
641 }
642
643protected:
644 uint32_t mLayerType;
645};
646
Alec Mouri80863a62019-01-17 15:19:35 -0800647class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
648 public ::testing::WithParamInterface<uint32_t> {
649public:
650 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
651};
652
653class LayerTypeAndRenderTypeTransactionTest
654 : public LayerTypeTransactionHarness,
655 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
656public:
657 LayerTypeAndRenderTypeTransactionTest()
658 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
659 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
660
661 std::unique_ptr<ScreenCapture> getScreenCapture() {
662 return mRenderPathHarness.getScreenCapture();
663 }
664
665protected:
666 LayerRenderPathTestHarness mRenderPathHarness;
667};
668
669// Environment for starting up binder threads. This is required for testing
670// virtual displays, as BufferQueue parameters may be queried over binder.
671class BinderEnvironment : public ::testing::Environment {
672public:
673 void SetUp() override { ProcessState::self()->startThreadPool(); }
674};
675
676::testing::Environment* const binderEnv =
677 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
678
679class LayerRenderTypeTransactionTest : public LayerTransactionTest,
680 public ::testing::WithParamInterface<RenderPath> {
681public:
682 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
683
684 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
685 void setRelativeZBasicHelper(uint32_t layerType);
686 void setRelativeZGroupHelper(uint32_t layerType);
687 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800688 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
689 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800690
691protected:
692 LayerRenderPathTestHarness mHarness;
693};
694
695INSTANTIATE_TEST_CASE_P(
696 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
697 ::testing::Combine(
698 ::testing::Values(
699 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
700 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
701 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
702
703INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
704 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
705
Marissa Wall61c58622018-07-18 10:12:20 -0700706INSTANTIATE_TEST_CASE_P(
707 LayerTypeTransactionTests, LayerTypeTransactionTest,
708 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
709 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
710
Alec Mouri80863a62019-01-17 15:19:35 -0800711TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700712 sp<SurfaceControl> layer;
713 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700714 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700715
716 {
717 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700718 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800719 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700720 shot->expectColor(rect, Color::RED);
721 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700722 }
723
724 Transaction().setPosition(layer, 5, 10).apply();
725 {
726 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700727 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800728 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700729 shot->expectColor(rect, Color::RED);
730 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700731 }
732}
733
Alec Mouri80863a62019-01-17 15:19:35 -0800734TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700735 sp<SurfaceControl> layer;
736 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700737 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700738
739 // GLES requires only 4 bits of subpixel precision during rasterization
740 // XXX GLES composition does not match HWC composition due to precision
741 // loss (b/69315223)
742 const float epsilon = 1.0f / 16.0f;
743 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
744 {
745 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800746 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700747 }
748
749 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
750 {
751 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800752 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700753 }
754}
755
Alec Mouri80863a62019-01-17 15:19:35 -0800756TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700757 sp<SurfaceControl> layer;
758 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700759 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700760
761 Transaction().setPosition(layer, -32, -32).apply();
762 {
763 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800764 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700765 }
766
767 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
768 {
769 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800770 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 }
772}
773
Alec Mouri80863a62019-01-17 15:19:35 -0800774TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700775 sp<SurfaceControl> layer;
776 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700777 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700778
779 // partially out of bounds
780 Transaction().setPosition(layer, -30, -30).apply();
781 {
782 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800783 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700784 }
785
786 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
787 {
788 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800789 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
790 mDisplayHeight),
791 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700792 }
793}
794
Alec Mouri80863a62019-01-17 15:19:35 -0800795TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700796 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700797 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
798 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700799
800 // setPosition is applied immediately by default, with or without resize
801 // pending
802 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
803 {
804 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800805 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700806 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700807 shot->expectColor(rect, Color::RED);
808 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700809 }
810
Marissa Wall861616d2018-10-22 12:52:23 -0700811 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700812 {
813 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800814 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700815 }
816}
817
Alec Mouri80863a62019-01-17 15:19:35 -0800818TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700819 sp<SurfaceControl> layer;
820 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700821 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700822
823 // request setPosition to be applied with the next resize
824 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
825 {
826 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800827 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700828 }
829
830 Transaction().setPosition(layer, 15, 20).apply();
831 {
832 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800833 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 }
835
836 Transaction().setSize(layer, 64, 64).apply();
837 {
838 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800839 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700840 }
841
842 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700843 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700844 {
845 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800846 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700847 }
848}
849
Alec Mouri80863a62019-01-17 15:19:35 -0800850TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700851 sp<SurfaceControl> layer;
852 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700853 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700854
855 // setPosition is not immediate even with SCALE_TO_WINDOW override
856 Transaction()
857 .setPosition(layer, 5, 10)
858 .setSize(layer, 64, 64)
859 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
860 .setGeometryAppliesWithResize(layer)
861 .apply();
862 {
863 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800864 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700865 }
866
Marissa Wall61c58622018-07-18 10:12:20 -0700867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700868 {
869 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800870 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700871 }
872}
873
Alec Mouri80863a62019-01-17 15:19:35 -0800874TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700875 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700876 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
877 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700878
879 Transaction().setSize(layer, 64, 64).apply();
880 {
881 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800882 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700883 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700884 shot->expectColor(rect, Color::RED);
885 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700886 }
887
Marissa Wall861616d2018-10-22 12:52:23 -0700888 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 {
890 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800891 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700892 const Rect rect(0, 0, 64, 64);
893 shot->expectColor(rect, Color::RED);
894 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700895 }
896}
897
Alec Mouri80863a62019-01-17 15:19:35 -0800898TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700899 // cannot test robustness against invalid sizes (zero or really huge)
900}
901
Alec Mouri80863a62019-01-17 15:19:35 -0800902TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903 sp<SurfaceControl> layer;
904 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700905 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700906
907 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
908 Transaction()
909 .setSize(layer, 64, 64)
910 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
911 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800912 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700913}
914
Alec Mouri80863a62019-01-17 15:19:35 -0800915TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700916 sp<SurfaceControl> layerR;
917 sp<SurfaceControl> layerG;
918 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700919 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700920 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700921 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700922
923 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
924 {
925 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800926 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700927 }
928
929 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
930 {
931 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800932 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700933 }
934}
935
Alec Mouri80863a62019-01-17 15:19:35 -0800936TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700937 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800938 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700939 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800940 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700941 sp<SurfaceControl> layerR;
942 sp<SurfaceControl> layerG;
943 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700944 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700945 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700946 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947
chaviw0e3479f2018-09-10 16:49:30 -0700948 Transaction()
949 .reparent(layerR, parent->getHandle())
950 .reparent(layerG, parent->getHandle())
951 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700952 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
953 {
954 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800955 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700956 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700957 }
958
959 Transaction().setLayer(layerR, -3).apply();
960 {
961 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800962 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700963 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700964 }
965}
966
Alec Mouri80863a62019-01-17 15:19:35 -0800967void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700968 sp<SurfaceControl> layerR;
969 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700970 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
971 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
972 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
973 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700974
Marissa Wall861616d2018-10-22 12:52:23 -0700975 switch (layerType) {
976 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
977 Transaction()
978 .setPosition(layerG, 16, 16)
979 .setRelativeLayer(layerG, layerR->getHandle(), 1)
980 .apply();
981 break;
982 case ISurfaceComposerClient::eFXSurfaceBufferState:
983 Transaction()
984 .setFrame(layerR, Rect(0, 0, 32, 32))
985 .setFrame(layerG, Rect(16, 16, 48, 48))
986 .setRelativeLayer(layerG, layerR->getHandle(), 1)
987 .apply();
988 break;
989 default:
990 ASSERT_FALSE(true) << "Unsupported layer type";
991 }
Chia-I Wu49313302017-10-31 10:14:40 -0700992 {
993 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800994 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700995 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
996 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
997 }
998
999 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1000 {
1001 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001002 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001003 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1004 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1005 }
1006}
1007
Alec Mouri80863a62019-01-17 15:19:35 -08001008TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001009 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1010}
1011
Alec Mouri80863a62019-01-17 15:19:35 -08001012TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001013 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1014}
1015
Marissa Wall61c58622018-07-18 10:12:20 -07001016TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001017 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001018 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001019 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001020 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001021 sp<SurfaceControl> layerR;
1022 sp<SurfaceControl> layerG;
1023 sp<SurfaceControl> layerB;
1024 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001025 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001026 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001027 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001028 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001029 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001030
chaviw0e3479f2018-09-10 16:49:30 -07001031 Transaction()
1032 .reparent(layerB, parent->getHandle())
1033 .apply();
1034
Chia-I Wuec2d9852017-11-21 09:21:01 -08001035 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1036 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1037
chaviw0e3479f2018-09-10 16:49:30 -07001038 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001039 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001040 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001041 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001042 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1043}
1044
Alec Mouri80863a62019-01-17 15:19:35 -08001045void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001046 sp<SurfaceControl> layerR;
1047 sp<SurfaceControl> layerG;
1048 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001049 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1050 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1051 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1052 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1053 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1054 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001055
1056 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001057 switch (layerType) {
1058 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1059 Transaction()
1060 .setPosition(layerG, 8, 8)
1061 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1062 .setPosition(layerB, 16, 16)
1063 .setLayer(layerB, mLayerZBase + 2)
1064 .apply();
1065 break;
1066 case ISurfaceComposerClient::eFXSurfaceBufferState:
1067 Transaction()
1068 .setFrame(layerR, Rect(0, 0, 32, 32))
1069 .setFrame(layerG, Rect(8, 8, 40, 40))
1070 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1071 .setFrame(layerB, Rect(16, 16, 48, 48))
1072 .setLayer(layerB, mLayerZBase + 2)
1073 .apply();
1074 break;
1075 default:
1076 ASSERT_FALSE(true) << "Unsupported layer type";
1077 }
1078
Chia-I Wu49313302017-10-31 10:14:40 -07001079 {
1080 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001081 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001082 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1083 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1084 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1085 }
1086
1087 // layerR = 4, layerG = layerR + 3, layerB = 2
1088 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1089 {
1090 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001091 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001092 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1093 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1094 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1095 }
1096
1097 // layerR = 4, layerG = layerR - 3, layerB = 2
1098 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1099 {
1100 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001101 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001102 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1103 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1104 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1105 }
1106
1107 // restore to absolute z
1108 // layerR = 4, layerG = 0, layerB = 2
1109 Transaction().setLayer(layerG, mLayerZBase).apply();
1110 {
1111 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001112 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001113 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1114 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1115 }
1116
1117 // layerR should not affect layerG anymore
1118 // layerR = 1, layerG = 0, layerB = 2
1119 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1120 {
1121 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001122 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001123 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1124 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1125 }
1126}
1127
Alec Mouri80863a62019-01-17 15:19:35 -08001128TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001129 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1130}
1131
Alec Mouri80863a62019-01-17 15:19:35 -08001132TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001133 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1134}
1135
Alec Mouri80863a62019-01-17 15:19:35 -08001136TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001137 sp<SurfaceControl> layerR;
1138 sp<SurfaceControl> layerG;
1139
1140 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001141 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001142 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001143 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001144
1145 Transaction()
1146 .setPosition(layerG, 16, 16)
1147 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1148 .apply();
1149
Robert Carr87246532019-02-04 15:20:26 -08001150 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001151 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001152 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001153}
1154
Alec Mouri80863a62019-01-17 15:19:35 -08001155TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001156 sp<SurfaceControl> layer;
1157 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001158 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001159
1160 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1161 {
1162 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001163 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001164 }
1165
1166 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1167 {
1168 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001169 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001170 }
1171}
1172
Alec Mouri80863a62019-01-17 15:19:35 -08001173TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001174 const Color translucentRed = {100, 0, 0, 100};
1175 sp<SurfaceControl> layerR;
1176 sp<SurfaceControl> layerG;
1177 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001178 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001179 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001180 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001181
1182 Transaction()
1183 .setLayer(layerR, mLayerZBase + 1)
1184 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1185 .apply();
1186 {
1187 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001188 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001189 }
1190
1191 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1192 {
1193 SCOPED_TRACE("layerR translucent");
1194 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001195 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001196 }
1197}
1198
Marissa Wall61c58622018-07-18 10:12:20 -07001199TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001200 sp<SurfaceControl> layer;
1201 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001202 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001203
1204 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001205 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001206 Transaction()
1207 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1208 .apply(true);
1209 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001210 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001211
1212 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1213 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001214 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001215}
1216
Robert Carrfa8855f2019-02-19 10:05:00 -08001217/** RAII Wrapper around get/seteuid */
1218class UIDFaker {
1219 uid_t oldId;
1220public:
1221 UIDFaker(uid_t uid) {
1222 oldId = geteuid();
1223 seteuid(uid);
1224 }
1225 ~UIDFaker() {
1226 seteuid(oldId);
1227 }
1228};
1229
1230TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1231 sp<SurfaceControl> layer;
1232 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1233 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1234
1235 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1236 sp<GraphicBuffer> outBuffer;
1237 Transaction()
1238 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1239 .apply(true);
1240 ASSERT_EQ(PERMISSION_DENIED,
1241 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1242
1243 UIDFaker f(AID_SYSTEM);
1244
1245 // By default the system can capture screenshots with secure layers but they
1246 // will be blacked out
1247 ASSERT_EQ(NO_ERROR,
1248 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1249
1250 {
1251 SCOPED_TRACE("as system");
1252 auto shot = screenshot();
1253 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1254 }
1255
1256 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1257 // to receive them...we are expected to take care with the results.
1258 ASSERT_EQ(NO_ERROR,
1259 composer->captureScreen(mDisplay, &outBuffer,
1260 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888,
1261 Rect(), 0, 0, false,
1262 ISurfaceComposer::eRotateNone, true));
1263 ScreenCapture sc(outBuffer);
1264 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1265}
1266
Alec Mouri80863a62019-01-17 15:19:35 -08001267TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001268 const Rect top(0, 0, 32, 16);
1269 const Rect bottom(0, 16, 32, 32);
1270 sp<SurfaceControl> layer;
1271 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1272
1273 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001274 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1275 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1276 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001277 // setTransparentRegionHint always applies to the following buffer
1278 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001279 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001280 {
1281 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001282 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001283 shot->expectColor(top, Color::BLACK);
1284 shot->expectColor(bottom, Color::RED);
1285 }
1286
1287 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1288 {
1289 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001290 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001291 shot->expectColor(top, Color::BLACK);
1292 shot->expectColor(bottom, Color::RED);
1293 }
1294
Marissa Wall61c58622018-07-18 10:12:20 -07001295 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1296 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1297 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1298 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001299 {
1300 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001301 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001302 shot->expectColor(top, Color::RED);
1303 shot->expectColor(bottom, Color::BLACK);
1304 }
1305}
1306
Alec Mouri80863a62019-01-17 15:19:35 -08001307TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001308 const Rect top(0, 0, 32, 16);
1309 const Rect bottom(0, 16, 32, 32);
1310 sp<SurfaceControl> layer;
1311 ASSERT_NO_FATAL_FAILURE(
1312 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1313
1314 sp<GraphicBuffer> buffer =
1315 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1316 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1317 BufferUsage::COMPOSER_OVERLAY,
1318 "test");
1319
1320 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1321 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1322 Transaction()
1323 .setTransparentRegionHint(layer, Region(top))
1324 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001325 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001326 .apply();
1327 {
1328 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001329 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001330 shot->expectColor(top, Color::BLACK);
1331 shot->expectColor(bottom, Color::RED);
1332 }
1333
1334 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1335 {
1336 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001337 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001338 shot->expectColor(top, Color::BLACK);
1339 shot->expectColor(bottom, Color::BLACK);
1340 }
1341
1342 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1343 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1344 BufferUsage::COMPOSER_OVERLAY,
1345 "test");
1346
1347 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1348 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001349 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001350 {
1351 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001352 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001353 shot->expectColor(top, Color::RED);
1354 shot->expectColor(bottom, Color::BLACK);
1355 }
1356}
1357
Alec Mouri80863a62019-01-17 15:19:35 -08001358TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001359 sp<SurfaceControl> layerTransparent;
1360 sp<SurfaceControl> layerR;
1361 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1362 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1363
1364 // check that transparent region hint is bound by the layer size
1365 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001366 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001367 .setPosition(layerR, 16, 16)
1368 .setLayer(layerR, mLayerZBase + 1)
1369 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001370 ASSERT_NO_FATAL_FAILURE(
1371 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1372 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001373 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001374}
1375
Alec Mouri80863a62019-01-17 15:19:35 -08001376TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001377 sp<SurfaceControl> layerTransparent;
1378 sp<SurfaceControl> layerR;
1379 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1380 ASSERT_NO_FATAL_FAILURE(
1381 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1382
1383 // check that transparent region hint is bound by the layer size
1384 Transaction()
1385 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1386 .setFrame(layerR, Rect(16, 16, 48, 48))
1387 .setLayer(layerR, mLayerZBase + 1)
1388 .apply();
1389 ASSERT_NO_FATAL_FAILURE(
1390 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1391 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001392 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001393}
1394
Alec Mouri80863a62019-01-17 15:19:35 -08001395void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001396 sp<SurfaceControl> layer1;
1397 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001398 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1399 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1400 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1401 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001402
Marissa Wall861616d2018-10-22 12:52:23 -07001403 switch (layerType) {
1404 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1405 Transaction()
1406 .setAlpha(layer1, 0.25f)
1407 .setAlpha(layer2, 0.75f)
1408 .setPosition(layer2, 16, 0)
1409 .setLayer(layer2, mLayerZBase + 1)
1410 .apply();
1411 break;
1412 case ISurfaceComposerClient::eFXSurfaceBufferState:
1413 Transaction()
1414 .setAlpha(layer1, 0.25f)
1415 .setAlpha(layer2, 0.75f)
1416 .setFrame(layer1, Rect(0, 0, 32, 32))
1417 .setFrame(layer2, Rect(16, 0, 48, 32))
1418 .setLayer(layer2, mLayerZBase + 1)
1419 .apply();
1420 break;
1421 default:
1422 ASSERT_FALSE(true) << "Unsupported layer type";
1423 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001424 {
Alec Mouri80863a62019-01-17 15:19:35 -08001425 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001426 uint8_t r = 16; // 64 * 0.25f
1427 uint8_t g = 48; // 64 * 0.75f
1428 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1429 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1430
1431 r /= 4; // r * (1.0f - 0.75f)
1432 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1433 }
1434}
1435
Alec Mouri80863a62019-01-17 15:19:35 -08001436TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001437 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1438}
1439
Alec Mouri80863a62019-01-17 15:19:35 -08001440TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001441 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1442}
1443
Alec Mouri80863a62019-01-17 15:19:35 -08001444TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001445 const Color color = {64, 0, 0, 255};
1446 sp<SurfaceControl> layer;
1447 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001448 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001449
1450 Transaction().setAlpha(layer, 2.0f).apply();
1451 {
1452 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001453 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001454 }
1455
1456 Transaction().setAlpha(layer, -1.0f).apply();
1457 {
1458 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001459 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001460 }
1461}
1462
Alec Mouri80863a62019-01-17 15:19:35 -08001463TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001464 sp<SurfaceControl> layer;
1465 const uint8_t size = 64;
1466 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001467 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001468 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1469 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1470
1471 Transaction()
1472 .setCornerRadius(layer, cornerRadius)
1473 .apply();
1474 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001475 const uint8_t bottom = size - 1;
1476 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001477 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001478 // Transparent corners
1479 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001480 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1481 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1482 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1483 }
1484}
1485
Alec Mouri80863a62019-01-17 15:19:35 -08001486TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001487 sp<SurfaceControl> parent;
1488 sp<SurfaceControl> child;
1489 const uint8_t size = 64;
1490 const uint8_t testArea = 4;
1491 const float cornerRadius = 20.0f;
1492 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1493 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1494 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1495 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1496
1497 Transaction()
1498 .setCornerRadius(parent, cornerRadius)
1499 .reparent(child, parent->getHandle())
1500 .setPosition(child, 0, size / 2)
1501 .apply();
1502 {
1503 const uint8_t bottom = size - 1;
1504 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001505 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001506 // Top edge of child should not have rounded corners because it's translated in the parent
1507 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1508 Color::GREEN);
1509 // But bottom edges should have been clipped according to parent bounds
1510 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1511 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001512 }
1513}
1514
Alec Mouri80863a62019-01-17 15:19:35 -08001515TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001516 sp<SurfaceControl> bufferLayer;
1517 sp<SurfaceControl> colorLayer;
1518 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001519 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001520 ASSERT_NO_FATAL_FAILURE(colorLayer =
1521 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1522 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001523
Vishnu Nair88a11f22018-11-28 18:30:57 -08001524 Transaction()
1525 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1526 .setLayer(colorLayer, mLayerZBase + 1)
1527 .apply();
1528
Chia-I Wue4ef6102017-11-01 15:16:35 -07001529 {
1530 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001531 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001532 }
1533
1534 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1535 const Color expected = {15, 51, 85, 255};
1536 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1537 // channel) should be less than one
1538 const uint8_t tolerance = 1;
1539 Transaction().setColor(colorLayer, color).apply();
1540 {
1541 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001542 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001543 }
1544}
1545
Valerie Haudd0b7572019-01-29 14:59:27 -08001546// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1547// BLUE: prior background color
1548// GREEN: final background color
1549// BLACK: no color or fill
1550void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1551 bool bufferFill, float alpha,
1552 Color finalColor) {
1553 sp<SurfaceControl> layer;
1554 int32_t width = 500;
1555 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001556
Valerie Haudd0b7572019-01-29 14:59:27 -08001557 Color fillColor = Color::RED;
1558 Color priorBgColor = Color::BLUE;
1559 Color expectedColor = Color::BLACK;
1560 switch (layerType) {
1561 case ISurfaceComposerClient::eFXSurfaceColor:
1562 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1563 Transaction()
1564 .setCrop_legacy(layer, Rect(0, 0, width, height))
1565 .setColor(layer, half3(1.0f, 0, 0))
1566 .apply();
1567 expectedColor = fillColor;
1568 break;
1569 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1570 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1571 if (bufferFill) {
1572 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1573 expectedColor = fillColor;
1574 }
1575 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1576 break;
1577 case ISurfaceComposerClient::eFXSurfaceBufferState:
1578 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1579 if (bufferFill) {
1580 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1581 expectedColor = fillColor;
1582 }
1583 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1584 break;
1585 default:
1586 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1587 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001588 }
1589
Valerie Haudd0b7572019-01-29 14:59:27 -08001590 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1591 Transaction()
1592 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1593 .apply();
1594 if (!bufferFill) {
1595 expectedColor = priorBgColor;
1596 }
1597 }
1598
1599 {
1600 SCOPED_TRACE("default before setting background color layer");
1601 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1602 }
Valerie Haua72e2812019-01-23 13:40:39 -08001603 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001604 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001605 .apply();
1606
1607 {
Valerie Haua72e2812019-01-23 13:40:39 -08001608 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001609 shot->expectColor(Rect(0, 0, width, height), finalColor);
1610 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001611 }
1612}
1613
Valerie Haudd0b7572019-01-29 14:59:27 -08001614TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1615 bool priorColor = false;
1616 bool bufferFill = false;
1617 float alpha = 1.0f;
1618 Color finalColor = Color::RED;
1619 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1620 priorColor, bufferFill, alpha, finalColor));
1621}
Valerie Haua72e2812019-01-23 13:40:39 -08001622
Valerie Haudd0b7572019-01-29 14:59:27 -08001623TEST_P(LayerRenderTypeTransactionTest,
1624 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1625 bool priorColor = false;
1626 bool bufferFill = true;
1627 float alpha = 1.0f;
1628 Color finalColor = Color::RED;
1629 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1630 priorColor, bufferFill, alpha, finalColor));
1631}
Valerie Haua72e2812019-01-23 13:40:39 -08001632
Valerie Haudd0b7572019-01-29 14:59:27 -08001633TEST_P(LayerRenderTypeTransactionTest,
1634 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1635 bool priorColor = false;
1636 bool bufferFill = false;
1637 float alpha = 1.0f;
1638 Color finalColor = Color::GREEN;
1639 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1640 priorColor, bufferFill, alpha, finalColor));
1641}
Valerie Haua72e2812019-01-23 13:40:39 -08001642
Valerie Haudd0b7572019-01-29 14:59:27 -08001643TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1644 bool priorColor = true;
1645 bool bufferFill = true;
1646 float alpha = 1.0f;
1647 Color finalColor = Color::RED;
1648 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1649 priorColor, bufferFill, alpha, finalColor));
1650}
1651
1652TEST_P(LayerRenderTypeTransactionTest,
1653 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1654 bool priorColor = true;
1655 bool bufferFill = false;
1656 float alpha = 1.0f;
1657 Color finalColor = Color::GREEN;
1658 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1659 priorColor, bufferFill, alpha, finalColor));
1660}
1661TEST_P(LayerRenderTypeTransactionTest,
1662 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1663 bool priorColor = false;
1664 bool bufferFill = false;
1665 float alpha = 0;
1666 Color finalColor = Color::BLACK;
1667 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1668 priorColor, bufferFill, alpha, finalColor));
1669}
1670
1671TEST_P(LayerRenderTypeTransactionTest,
1672 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1673 bool priorColor = true;
1674 bool bufferFill = false;
1675 float alpha = 0;
1676 Color finalColor = Color::BLACK;
1677 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1678 priorColor, bufferFill, alpha, finalColor));
1679}
1680
1681TEST_P(LayerRenderTypeTransactionTest,
1682 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1683 bool priorColor = false;
1684 bool bufferFill = true;
1685 float alpha = 1.0f;
1686 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001687 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001688 priorColor, bufferFill, alpha, finalColor));
1689}
1690
1691TEST_P(LayerRenderTypeTransactionTest,
1692 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1693 bool priorColor = false;
1694 bool bufferFill = false;
1695 float alpha = 1.0f;
1696 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001697 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001698 priorColor, bufferFill, alpha, finalColor));
1699}
1700
1701TEST_P(LayerRenderTypeTransactionTest,
1702 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1703 bool priorColor = true;
1704 bool bufferFill = false;
1705 float alpha = 1.0f;
1706 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001707 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001708 priorColor, bufferFill, alpha, finalColor));
1709}
1710
1711TEST_P(LayerRenderTypeTransactionTest,
1712 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1713 bool priorColor = false;
1714 bool bufferFill = false;
1715 float alpha = 0;
1716 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001717 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001718 priorColor, bufferFill, alpha, finalColor));
1719}
1720
1721TEST_P(LayerRenderTypeTransactionTest,
1722 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1723 bool priorColor = true;
1724 bool bufferFill = false;
1725 float alpha = 0;
1726 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001727 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001728 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001729}
1730
Alec Mouri80863a62019-01-17 15:19:35 -08001731TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001732 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001733 ASSERT_NO_FATAL_FAILURE(colorLayer =
1734 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1735 ISurfaceComposerClient::eFXSurfaceColor));
1736 Transaction()
1737 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1738 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1739 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001740
Alec Mouri80863a62019-01-17 15:19:35 -08001741 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001742}
1743
Alec Mouri80863a62019-01-17 15:19:35 -08001744TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001745 sp<SurfaceControl> bufferLayer;
1746 sp<SurfaceControl> colorLayer;
1747 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001748 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001749 ASSERT_NO_FATAL_FAILURE(colorLayer =
1750 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1751 ISurfaceComposerClient::eFXSurfaceColor));
1752 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001753
1754 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1755 const float alpha = 0.25f;
1756 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1757 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1758 // channel) should be less than one
1759 const uint8_t tolerance = 1;
1760 Transaction()
1761 .setColor(colorLayer, color)
1762 .setAlpha(colorLayer, alpha)
1763 .setLayer(colorLayer, mLayerZBase + 1)
1764 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001765 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1766 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001767}
1768
Alec Mouri80863a62019-01-17 15:19:35 -08001769TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001770 sp<SurfaceControl> bufferLayer;
1771 sp<SurfaceControl> parentLayer;
1772 sp<SurfaceControl> colorLayer;
1773 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1774 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001775 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001776 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1777 0 /* buffer height */,
1778 ISurfaceComposerClient::eFXSurfaceColor));
1779 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001780 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1781 const float alpha = 0.25f;
1782 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1783 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1784 // channel) should be less than one
1785 const uint8_t tolerance = 1;
1786 Transaction()
1787 .reparent(colorLayer, parentLayer->getHandle())
1788 .setColor(colorLayer, color)
1789 .setAlpha(parentLayer, alpha)
1790 .setLayer(parentLayer, mLayerZBase + 1)
1791 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001792 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1793 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001794}
1795
Alec Mouri80863a62019-01-17 15:19:35 -08001796TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001797 sp<SurfaceControl> bufferLayer;
1798 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001799 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001800
1801 // color is ignored
1802 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001803 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001804}
1805
Alec Mouri80863a62019-01-17 15:19:35 -08001806TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001807 sp<SurfaceControl> layer;
1808 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001809 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001810
1811 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1812 {
1813 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001814 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001815 }
1816
1817 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1818 {
1819 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001820 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001821 }
1822}
1823
Alec Mouri80863a62019-01-17 15:19:35 -08001824TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001825 sp<SurfaceControl> layer;
1826 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001827 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1828 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001829
1830 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1831 {
1832 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001833 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1834 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001835 }
1836
1837 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1838 {
1839 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001840 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1841 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001842 }
1843
1844 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1845 {
1846 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001847 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1848 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001849 }
1850
1851 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1852 {
1853 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001854 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1855 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001856 }
1857
1858 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1859 {
1860 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001861 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1862 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001863 }
1864}
1865
Alec Mouri80863a62019-01-17 15:19:35 -08001866TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001867 sp<SurfaceControl> layer;
1868 ASSERT_NO_FATAL_FAILURE(
1869 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1870 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1871 Color::BLUE, Color::WHITE));
1872
1873 Transaction()
1874 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1875 .setFrame(layer, Rect(0, 0, 32, 32))
1876 .apply();
1877 {
1878 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001879 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1880 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001881 }
1882
1883 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1884 {
1885 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001886 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1887 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001888 }
1889
1890 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1891 {
1892 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001893 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1894 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001895 }
1896
1897 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1898 {
1899 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001900 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1901 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001902 }
1903
1904 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1905 {
1906 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001907 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1908 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001909 }
1910}
1911
Alec Mouri80863a62019-01-17 15:19:35 -08001912TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001913 sp<SurfaceControl> layer;
1914 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001915 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1916 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001917
1918 const float rot = M_SQRT1_2; // 45 degrees
1919 const float trans = M_SQRT2 * 16.0f;
1920 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1921
Alec Mouri80863a62019-01-17 15:19:35 -08001922 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001923 // check a 8x8 region inside each color
1924 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1925 const int32_t halfL = 4;
1926 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1927 };
1928 const int32_t unit = int32_t(trans / 2);
1929 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1930 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1931 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1932 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1933}
1934
Alec Mouri80863a62019-01-17 15:19:35 -08001935TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001936 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001937 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1938 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001939
1940 // setMatrix is applied after any pending resize, unlike setPosition
1941 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1942 {
1943 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001944 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001945 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001946 shot->expectColor(rect, Color::RED);
1947 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001948 }
1949
Marissa Wall861616d2018-10-22 12:52:23 -07001950 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001951 {
1952 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001953 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001954 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001955 }
1956}
1957
Alec Mouri80863a62019-01-17 15:19:35 -08001958TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001959 sp<SurfaceControl> layer;
1960 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001961 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001962
1963 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1964 Transaction()
1965 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1966 .setSize(layer, 64, 64)
1967 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1968 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001969 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001970}
1971
Alec Mouri80863a62019-01-17 15:19:35 -08001972TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001973 sp<SurfaceControl> layer;
1974 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001975 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1976 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001977
1978 // XXX SCALE_CROP is not respected; calling setSize and
1979 // setOverrideScalingMode in separate transactions does not work
1980 // (b/69315456)
1981 Transaction()
1982 .setSize(layer, 64, 16)
1983 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1984 .apply();
1985 {
1986 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001987 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1988 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001989 }
1990}
1991
Dan Stoza000dd012018-08-01 13:31:52 -07001992TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1993 sp<SurfaceControl> layer;
1994 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1995
1996 sp<IBinder> handle = layer->getHandle();
1997 ASSERT_TRUE(handle != nullptr);
1998
1999 FrameStats frameStats;
2000 mClient->getLayerFrameStats(handle, &frameStats);
2001
2002 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2003}
2004
Alec Mouri80863a62019-01-17 15:19:35 -08002005TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002006 sp<SurfaceControl> layer;
2007 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002008 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002009 const Rect crop(8, 8, 24, 24);
2010
Marissa Wallf58c14b2018-07-24 10:50:43 -07002011 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002012 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002013 shot->expectColor(crop, Color::RED);
2014 shot->expectBorder(crop, Color::BLACK);
2015}
2016
Alec Mouri80863a62019-01-17 15:19:35 -08002017TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002018 sp<SurfaceControl> layer;
2019 ASSERT_NO_FATAL_FAILURE(
2020 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2021 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2022 const Rect crop(8, 8, 24, 24);
2023
2024 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002025 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002026 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2027 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002028}
2029
Alec Mouri80863a62019-01-17 15:19:35 -08002030TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002031 sp<SurfaceControl> layer;
2032 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002033 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002034
2035 {
2036 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002037 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002038 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002039 }
2040
2041 {
2042 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002043 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002044 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002045 }
2046}
2047
Alec Mouri80863a62019-01-17 15:19:35 -08002048TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002049 sp<SurfaceControl> layer;
2050 ASSERT_NO_FATAL_FAILURE(
2051 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2052 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2053
2054 {
2055 SCOPED_TRACE("empty rect");
2056 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002057 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002058 }
2059
2060 {
2061 SCOPED_TRACE("negative rect");
2062 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002063 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002064 }
2065}
2066
Alec Mouri80863a62019-01-17 15:19:35 -08002067TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002068 sp<SurfaceControl> layer;
2069 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002070 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002071
Marissa Wallf58c14b2018-07-24 10:50:43 -07002072 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002073 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002074 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2075 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2076}
2077
Alec Mouri80863a62019-01-17 15:19:35 -08002078TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002079 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002080 ASSERT_NO_FATAL_FAILURE(
2081 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002082 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002083 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002084 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2085 BufferUsage::COMPOSER_OVERLAY,
2086 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002087 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2088 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2089
2090 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002091
2092 Transaction().setBuffer(layer, buffer).apply();
2093
2094 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002095 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002096 {
2097 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002098 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002099 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2100 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002101 }
2102
2103 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002104 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002105 {
2106 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002107 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002108 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2109 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002110 }
2111
2112 // Fully out of buffer space bounds
2113 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2114 {
2115 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002116 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002117 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2118 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2119 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002120 }
2121}
2122
Alec Mouri80863a62019-01-17 15:19:35 -08002123TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002124 sp<SurfaceControl> layer;
2125 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002126 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002127
2128 const Point position(32, 32);
2129 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002130 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002131 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002132 shot->expectColor(crop + position, Color::RED);
2133 shot->expectBorder(crop + position, Color::BLACK);
2134}
2135
Alec Mouri80863a62019-01-17 15:19:35 -08002136TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002137 sp<SurfaceControl> layer;
2138 ASSERT_NO_FATAL_FAILURE(
2139 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2140 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2141
Marissa Wall861616d2018-10-22 12:52:23 -07002142 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002143 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002144 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002145 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002146 shot->expectColor(frame, Color::RED);
2147 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002148}
2149
Alec Mouri80863a62019-01-17 15:19:35 -08002150TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002151 sp<SurfaceControl> layer;
2152 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002153 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002154
Marissa Wall861616d2018-10-22 12:52:23 -07002155 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002156 Transaction()
2157 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002158 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002160 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002161 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2162 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2163}
2164
Alec Mouri80863a62019-01-17 15:19:35 -08002165TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002166 sp<SurfaceControl> layer;
2167 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002168 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002169
Marissa Wallf58c14b2018-07-24 10:50:43 -07002170 // setCrop_legacy is applied immediately by default, with or without resize pending
2171 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002172 {
2173 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002174 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002175 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2176 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2177 }
2178
Marissa Wall61c58622018-07-18 10:12:20 -07002179 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002180 {
2181 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002182 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002183 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2184 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2185 }
2186}
2187
Alec Mouri80863a62019-01-17 15:19:35 -08002188TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189 sp<SurfaceControl> layer;
2190 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002191 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002192
Marissa Wallf58c14b2018-07-24 10:50:43 -07002193 // request setCrop_legacy to be applied with the next resize
2194 Transaction()
2195 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2196 .setGeometryAppliesWithResize(layer)
2197 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198 {
2199 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002200 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002201 }
2202
Marissa Wallf58c14b2018-07-24 10:50:43 -07002203 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002204 {
2205 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002206 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002207 }
2208
2209 Transaction().setSize(layer, 16, 16).apply();
2210 {
2211 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002212 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002213 }
2214
2215 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002216 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002217 {
2218 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002219 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002220 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2221 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2222 }
2223}
2224
Alec Mouri80863a62019-01-17 15:19:35 -08002225TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002226 sp<SurfaceControl> layer;
2227 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002228 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002229
Marissa Wallf58c14b2018-07-24 10:50:43 -07002230 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002231 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002232 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002233 .setSize(layer, 16, 16)
2234 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2235 .setGeometryAppliesWithResize(layer)
2236 .apply();
2237 {
2238 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002239 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002240 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2241 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2242 }
2243
2244 // XXX crop is never latched without other geometry change (b/69315677)
2245 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002246 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002247 Transaction().setPosition(layer, 0, 0).apply();
2248 {
2249 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002250 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002251 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2252 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2253 }
2254}
2255
Alec Mouri80863a62019-01-17 15:19:35 -08002256TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002257 sp<SurfaceControl> layer;
2258 ASSERT_NO_FATAL_FAILURE(
2259 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2260 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2261 const Rect frame(8, 8, 24, 24);
2262
2263 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002264 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002265 shot->expectColor(frame, Color::RED);
2266 shot->expectBorder(frame, Color::BLACK);
2267}
2268
Alec Mouri80863a62019-01-17 15:19:35 -08002269TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002270 sp<SurfaceControl> layer;
2271 ASSERT_NO_FATAL_FAILURE(
2272 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2273 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2274
Marissa Wall61c58622018-07-18 10:12:20 -07002275 {
Marissa Wall861616d2018-10-22 12:52:23 -07002276 SCOPED_TRACE("empty rect");
2277 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002278 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002279 }
2280
Marissa Wall61c58622018-07-18 10:12:20 -07002281 {
Marissa Wall861616d2018-10-22 12:52:23 -07002282 SCOPED_TRACE("negative rect");
2283 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002284 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002285 }
2286}
2287
Alec Mouri80863a62019-01-17 15:19:35 -08002288TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002289 sp<SurfaceControl> layer;
2290 ASSERT_NO_FATAL_FAILURE(
2291 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2292 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2293
2294 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002295 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002296 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2297 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002298}
2299
Alec Mouri80863a62019-01-17 15:19:35 -08002300TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002301 sp<SurfaceControl> parent, child;
2302 ASSERT_NO_FATAL_FAILURE(
2303 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2304 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2305 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2306
2307 ASSERT_NO_FATAL_FAILURE(
2308 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2309 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2310
2311 Transaction().reparent(child, parent->getHandle()).apply();
2312
2313 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002314 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002315 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2316 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2317}
2318
Alec Mouri80863a62019-01-17 15:19:35 -08002319TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002320 sp<SurfaceControl> parent, child;
2321 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2322 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2323
2324 ASSERT_NO_FATAL_FAILURE(
2325 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2326 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2327
2328 Transaction().reparent(child, parent->getHandle()).apply();
2329
2330 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002331 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002332 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2333 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2334}
2335
Alec Mouri80863a62019-01-17 15:19:35 -08002336TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002337 sp<SurfaceControl> layer;
2338 ASSERT_NO_FATAL_FAILURE(
2339 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2340 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2341 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2342
2343 std::this_thread::sleep_for(500ms);
2344
2345 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2346
Alec Mouri80863a62019-01-17 15:19:35 -08002347 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -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, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002353 sp<SurfaceControl> parent, child;
2354 ASSERT_NO_FATAL_FAILURE(
2355 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2356 ASSERT_NO_FATAL_FAILURE(
2357 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2358 Transaction().reparent(child, parent->getHandle()).apply();
2359
2360 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2361 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2362
2363 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2364 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2365
Alec Mouri80863a62019-01-17 15:19:35 -08002366 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002367 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2368 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2369 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2370}
2371
Alec Mouri80863a62019-01-17 15:19:35 -08002372TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002373 sp<SurfaceControl> layer;
2374 ASSERT_NO_FATAL_FAILURE(
2375 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2376
2377 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2378
Alec Mouri80863a62019-01-17 15:19:35 -08002379 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002380 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2381 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002382}
2383
Alec Mouri80863a62019-01-17 15:19:35 -08002384TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002385 sp<SurfaceControl> layer;
2386 ASSERT_NO_FATAL_FAILURE(
2387 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2388
2389 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2390
2391 {
2392 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002393 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002394 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2395 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002396 }
2397
2398 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2399
2400 {
2401 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002402 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002403 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2404 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002405 }
2406
2407 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2408
2409 {
2410 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002411 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002412 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2413 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002414 }
2415}
2416
Alec Mouri80863a62019-01-17 15:19:35 -08002417TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002418 sp<SurfaceControl> layer1;
2419 ASSERT_NO_FATAL_FAILURE(
2420 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2421
2422 sp<SurfaceControl> layer2;
2423 ASSERT_NO_FATAL_FAILURE(
2424 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2425
2426 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2427
Marissa Wall861616d2018-10-22 12:52:23 -07002428 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002429 {
2430 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002431 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002432 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2433 }
2434
2435 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2436
Marissa Wall861616d2018-10-22 12:52:23 -07002437 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002438 {
2439 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002440 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002441 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2442 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2443 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2444 }
2445
2446 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2447 {
2448 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002449 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002450 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2451 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2452 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2453 }
2454
2455 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2456
2457 {
2458 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002459 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002460 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2461 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2462 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2463 }
2464}
2465
Valerie Haua6b15a12019-02-05 14:16:30 -08002466TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002467 sp<SurfaceControl> layer;
2468 ASSERT_NO_FATAL_FAILURE(
2469 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2470
2471 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2472
2473 std::array<sp<GraphicBuffer>, 10> buffers;
2474
2475 size_t idx = 0;
2476 for (auto& buffer : buffers) {
2477 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2478 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2479 BufferUsage::COMPOSER_OVERLAY,
2480 "test");
2481 Color color = colors[idx % colors.size()];
2482 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2483 idx++;
2484 }
2485
2486 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2487 // cache is working.
2488 idx = 0;
2489 for (auto& buffer : buffers) {
2490 for (int i = 0; i < 2; i++) {
2491 Transaction().setBuffer(layer, buffer).apply();
2492
2493 Color color = colors[idx % colors.size()];
2494 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002495 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2496 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002497 }
2498 idx++;
2499 }
2500}
2501
Valerie Haua6b15a12019-02-05 14:16:30 -08002502TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002503 sp<SurfaceControl> layer;
2504 ASSERT_NO_FATAL_FAILURE(
2505 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2506
2507 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2508
2509 std::array<sp<GraphicBuffer>, 70> buffers;
2510
2511 size_t idx = 0;
2512 for (auto& buffer : buffers) {
2513 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2514 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2515 BufferUsage::COMPOSER_OVERLAY,
2516 "test");
2517 Color color = colors[idx % colors.size()];
2518 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2519 idx++;
2520 }
2521
2522 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2523 // cache is working.
2524 idx = 0;
2525 for (auto& buffer : buffers) {
2526 for (int i = 0; i < 2; i++) {
2527 Transaction().setBuffer(layer, buffer).apply();
2528
2529 Color color = colors[idx % colors.size()];
2530 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002531 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2532 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002533 }
2534 idx++;
2535 }
2536}
2537
Valerie Haua6b15a12019-02-05 14:16:30 -08002538TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002539 sp<SurfaceControl> layer;
2540 ASSERT_NO_FATAL_FAILURE(
2541 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2542
2543 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2544
2545 std::array<sp<GraphicBuffer>, 65> buffers;
2546
2547 size_t idx = 0;
2548 for (auto& buffer : buffers) {
2549 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2550 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2551 BufferUsage::COMPOSER_OVERLAY,
2552 "test");
2553 Color color = colors[idx % colors.size()];
2554 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2555 idx++;
2556 }
2557
2558 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2559 // cache is working.
2560 idx = 0;
2561 for (auto& buffer : buffers) {
2562 for (int i = 0; i < 2; i++) {
2563 Transaction().setBuffer(layer, buffer).apply();
2564
2565 Color color = colors[idx % colors.size()];
2566 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002567 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2568 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002569 }
2570 if (idx == 0) {
2571 buffers[0].clear();
2572 }
2573 idx++;
2574 }
2575}
2576
Alec Mouri80863a62019-01-17 15:19:35 -08002577TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002578 sp<SurfaceControl> layer;
2579 ASSERT_NO_FATAL_FAILURE(
2580 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2581
2582 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2583 Color::BLUE, Color::WHITE));
2584
Marissa Wall861616d2018-10-22 12:52:23 -07002585 Transaction()
2586 .setFrame(layer, Rect(0, 0, 32, 32))
2587 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2588 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002589
Alec Mouri80863a62019-01-17 15:19:35 -08002590 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2591 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002592}
2593
Alec Mouri80863a62019-01-17 15:19:35 -08002594TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002595 sp<SurfaceControl> layer;
2596 ASSERT_NO_FATAL_FAILURE(
2597 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2598
2599 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2600 Color::BLUE, Color::WHITE));
2601
Marissa Wall861616d2018-10-22 12:52:23 -07002602 Transaction()
2603 .setFrame(layer, Rect(0, 0, 32, 32))
2604 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2605 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002606
Alec Mouri80863a62019-01-17 15:19:35 -08002607 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2608 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002609}
2610
Alec Mouri80863a62019-01-17 15:19:35 -08002611TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002612 sp<SurfaceControl> layer;
2613 ASSERT_NO_FATAL_FAILURE(
2614 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2615
2616 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2617 Color::BLUE, Color::WHITE));
2618
Marissa Wall861616d2018-10-22 12:52:23 -07002619 Transaction()
2620 .setFrame(layer, Rect(0, 0, 32, 32))
2621 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2622 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002623
Alec Mouri80863a62019-01-17 15:19:35 -08002624 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2625 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002626}
2627
2628TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2629 sp<SurfaceControl> layer;
2630 ASSERT_NO_FATAL_FAILURE(
2631 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2632
2633 Transaction().setTransformToDisplayInverse(layer, false).apply();
2634
2635 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2636
2637 Transaction().setTransformToDisplayInverse(layer, true).apply();
2638}
2639
Alec Mouri80863a62019-01-17 15:19:35 -08002640TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002641 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002642 Transaction transaction;
2643 ASSERT_NO_FATAL_FAILURE(
2644 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2645
2646 sp<GraphicBuffer> buffer =
2647 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2648 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2649 BufferUsage::COMPOSER_OVERLAY,
2650 "test");
2651 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2652
2653 sp<Fence> fence;
2654 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2655 GTEST_SUCCEED() << "test not supported";
2656 return;
2657 }
2658
2659 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2660
2661 status_t status = fence->wait(1000);
2662 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2663 std::this_thread::sleep_for(200ms);
2664
Alec Mouri80863a62019-01-17 15:19:35 -08002665 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002666 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2667 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002668}
2669
Alec Mouri80863a62019-01-17 15:19:35 -08002670TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002671 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002672 ASSERT_NO_FATAL_FAILURE(
2673 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2674
2675 sp<GraphicBuffer> buffer =
2676 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2677 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2678 BufferUsage::COMPOSER_OVERLAY,
2679 "test");
2680 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2681
Marissa Wallfda30bb2018-10-12 11:34:28 -07002682 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002683
2684 Transaction()
2685 .setBuffer(layer, buffer)
2686 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002687 .apply();
2688
Alec Mouri80863a62019-01-17 15:19:35 -08002689 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002690 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2691 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002692}
2693
Alec Mouri80863a62019-01-17 15:19:35 -08002694TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002695 sp<SurfaceControl> layer;
2696 ASSERT_NO_FATAL_FAILURE(
2697 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2698
2699 sp<GraphicBuffer> buffer =
2700 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 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2705
2706 Transaction()
2707 .setBuffer(layer, buffer)
2708 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002709 .apply();
2710
Alec Mouri80863a62019-01-17 15:19:35 -08002711 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002712 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2713 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002714}
2715
Alec Mouri80863a62019-01-17 15:19:35 -08002716TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002717 sp<SurfaceControl> layer;
2718 ASSERT_NO_FATAL_FAILURE(
2719 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2720
2721 sp<GraphicBuffer> buffer =
2722 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2723 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2724 BufferUsage::COMPOSER_OVERLAY,
2725 "test");
2726 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2727
2728 HdrMetadata hdrMetadata;
2729 hdrMetadata.validTypes = 0;
2730 Transaction()
2731 .setBuffer(layer, buffer)
2732 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002733 .apply();
2734
Alec Mouri80863a62019-01-17 15:19:35 -08002735 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002736 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2737 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002738}
2739
Alec Mouri80863a62019-01-17 15:19:35 -08002740TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002741 sp<SurfaceControl> layer;
2742 ASSERT_NO_FATAL_FAILURE(
2743 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2744
2745 sp<GraphicBuffer> buffer =
2746 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2747 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2748 BufferUsage::COMPOSER_OVERLAY,
2749 "test");
2750 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2751
2752 Region region;
2753 region.set(32, 32);
2754 Transaction()
2755 .setBuffer(layer, buffer)
2756 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002757 .apply();
2758
Alec Mouri80863a62019-01-17 15:19:35 -08002759 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002760 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2761 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002762}
2763
Alec Mouri80863a62019-01-17 15:19:35 -08002764TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_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 sp<GraphicBuffer> buffer =
2770 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2771 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2772 BufferUsage::COMPOSER_OVERLAY,
2773 "test");
2774 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2775
2776 Transaction()
2777 .setBuffer(layer, buffer)
2778 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002779 .apply();
2780
Alec Mouri80863a62019-01-17 15:19:35 -08002781 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002782 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2783 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002784}
2785
2786TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2787 sp<SurfaceControl> layer;
2788 ASSERT_NO_FATAL_FAILURE(
2789 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2790
2791 // verify this doesn't cause a crash
2792 Transaction().setSidebandStream(layer, nullptr).apply();
2793}
2794
Robert Carr54cf5b12019-01-25 14:02:28 -08002795TEST_F(LayerTransactionTest, ReparentToSelf) {
2796 sp<SurfaceControl> layer;
2797 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2798 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2799 Transaction().reparent(layer, layer->getHandle()).apply();
2800
2801 {
2802 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2803 // to still be functioning.
2804 SCOPED_TRACE("after reparent to self");
2805 const Rect rect(0, 0, 32, 32);
2806 auto shot = screenshot();
2807 shot->expectColor(rect, Color::RED);
2808 shot->expectBorder(rect, Color::BLACK);
2809 }
2810}
2811
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002812class ColorTransformHelper {
2813public:
2814 static void DegammaColorSingle(half& s) {
2815 if (s <= 0.03928f)
2816 s = s / 12.92f;
2817 else
2818 s = pow((s + 0.055f) / 1.055f, 2.4f);
2819 }
2820
2821 static void DegammaColor(half3& color) {
2822 DegammaColorSingle(color.r);
2823 DegammaColorSingle(color.g);
2824 DegammaColorSingle(color.b);
2825 }
2826
2827 static void GammaColorSingle(half& s) {
2828 if (s <= 0.0031308f) {
2829 s = s * 12.92f;
2830 } else {
2831 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2832 }
2833 }
2834
2835 static void GammaColor(half3& color) {
2836 GammaColorSingle(color.r);
2837 GammaColorSingle(color.g);
2838 GammaColorSingle(color.b);
2839 }
2840
2841 static void applyMatrix(half3& color, const mat3& mat) {
2842 half3 ret = half3(0);
2843
2844 for (int i = 0; i < 3; i++) {
2845 for (int j = 0; j < 3; j++) {
2846 ret[i] = ret[i] + color[j] * mat[j][i];
2847 }
2848 }
2849 color = ret;
2850 }
2851};
2852
Alec Mouri80863a62019-01-17 15:19:35 -08002853TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002854 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002855 ASSERT_NO_FATAL_FAILURE(colorLayer =
2856 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2857 ISurfaceComposerClient::eFXSurfaceColor));
2858 Transaction()
2859 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2860 .setLayer(colorLayer, mLayerZBase + 1)
2861 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002862 {
2863 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002864 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002865 }
2866
2867 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002868 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002869 mat3 matrix;
2870 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2871 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2872 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002873
2874 // degamma before applying the matrix
2875 if (mColorManagementUsed) {
2876 ColorTransformHelper::DegammaColor(expected);
2877 }
2878
2879 ColorTransformHelper::applyMatrix(expected, matrix);
2880
2881 if (mColorManagementUsed) {
2882 ColorTransformHelper::GammaColor(expected);
2883 }
2884
2885 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2886 uint8_t(expected.b * 255), 255};
2887
2888 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2889 // channel) should be less than one
2890 const uint8_t tolerance = 1;
2891
Peiyong Lind3788632018-09-18 16:01:31 -07002892 Transaction().setColor(colorLayer, color)
2893 .setColorTransform(colorLayer, matrix, vec3()).apply();
2894 {
2895 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002896 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002897 }
2898}
2899
Alec Mouri80863a62019-01-17 15:19:35 -08002900TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002901 sp<SurfaceControl> parentLayer;
2902 sp<SurfaceControl> colorLayer;
2903 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2904 0 /* buffer height */,
2905 ISurfaceComposerClient::eFXSurfaceContainer));
2906 ASSERT_NO_FATAL_FAILURE(
2907 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2908 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2909
2910 Transaction()
2911 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2912 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2913 .setLayer(parentLayer, mLayerZBase + 1)
2914 .apply();
2915 {
2916 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002917 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002918 }
2919
2920 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2921 half3 expected = color;
2922 mat3 matrix;
2923 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2924 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2925 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2926
2927 // degamma before applying the matrix
2928 if (mColorManagementUsed) {
2929 ColorTransformHelper::DegammaColor(expected);
2930 }
2931
2932 ColorTransformHelper::applyMatrix(expected, matrix);
2933
2934 if (mColorManagementUsed) {
2935 ColorTransformHelper::GammaColor(expected);
2936 }
2937
2938 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2939 uint8_t(expected.b * 255), 255};
2940
2941 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2942 // channel) should be less than one
2943 const uint8_t tolerance = 1;
2944
2945 Transaction()
2946 .setColor(colorLayer, color)
2947 .setColorTransform(parentLayer, matrix, vec3())
2948 .apply();
2949 {
2950 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002951 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002952 }
2953}
2954
Alec Mouri80863a62019-01-17 15:19:35 -08002955TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002956 sp<SurfaceControl> parentLayer;
2957 sp<SurfaceControl> colorLayer;
2958 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2959 0 /* buffer height */,
2960 ISurfaceComposerClient::eFXSurfaceContainer));
2961 ASSERT_NO_FATAL_FAILURE(
2962 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2963 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2964
2965 Transaction()
2966 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2967 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2968 .setLayer(parentLayer, mLayerZBase + 1)
2969 .apply();
2970 {
2971 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002972 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002973 }
2974
2975 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2976 half3 expected = color;
2977 mat3 matrixChild;
2978 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2979 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2980 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2981 mat3 matrixParent;
2982 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2983 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2984 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2985
2986 // degamma before applying the matrix
2987 if (mColorManagementUsed) {
2988 ColorTransformHelper::DegammaColor(expected);
2989 }
2990
2991 ColorTransformHelper::applyMatrix(expected, matrixChild);
2992 ColorTransformHelper::applyMatrix(expected, matrixParent);
2993
2994 if (mColorManagementUsed) {
2995 ColorTransformHelper::GammaColor(expected);
2996 }
2997
2998 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2999 uint8_t(expected.b * 255), 255};
3000
3001 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3002 // channel) should be less than one
3003 const uint8_t tolerance = 1;
3004
3005 Transaction()
3006 .setColor(colorLayer, color)
3007 .setColorTransform(parentLayer, matrixParent, vec3())
3008 .setColorTransform(colorLayer, matrixChild, vec3())
3009 .apply();
3010 {
3011 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003012 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003013 }
3014}
3015
Marissa Wall80d94ad2019-01-18 16:04:36 -08003016struct CallbackData {
3017 CallbackData() = default;
3018 CallbackData(nsecs_t time, const sp<Fence>& fence,
3019 const std::vector<SurfaceControlStats>& stats)
3020 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3021
3022 nsecs_t latchTime;
3023 sp<Fence> presentFence;
3024 std::vector<SurfaceControlStats> surfaceControlStats;
3025};
3026
Marissa Wallfda30bb2018-10-12 11:34:28 -07003027class ExpectedResult {
3028public:
3029 enum Transaction {
3030 NOT_PRESENTED = 0,
3031 PRESENTED,
3032 };
3033
3034 enum Buffer {
3035 NOT_ACQUIRED = 0,
3036 ACQUIRED,
3037 };
3038
3039 enum PreviousBuffer {
3040 NOT_RELEASED = 0,
3041 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003042 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003043 };
3044
3045 void reset() {
3046 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3047 mExpectedSurfaceResults.clear();
3048 }
3049
3050 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003051 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003052 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3053 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003054 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003055 std::forward_as_tuple(bufferResult, previousBufferResult));
3056 }
3057
3058 void addSurfaces(ExpectedResult::Transaction transactionResult,
3059 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003060 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003061 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3062 for (const auto& layer : layers) {
3063 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3064 }
3065 }
3066
Marissa Wall17b4e452018-12-26 16:32:34 -08003067 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3068 mExpectedPresentTime = expectedPresentTime;
3069 }
3070
Marissa Wall80d94ad2019-01-18 16:04:36 -08003071 void verifyCallbackData(const CallbackData& callbackData) const {
3072 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003073 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3074 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003075 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003076 if (mExpectedPresentTime >= 0) {
3077 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3078 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3079 // if the panel is running at 30 hz, at the worst case, our expected time just
3080 // misses vsync and we have to wait another 33.3ms
3081 ASSERT_LE(presentFence->getSignalTime(),
3082 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3083 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003084 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003085 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003086 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3087 }
3088
Marissa Wall80d94ad2019-01-18 16:04:36 -08003089 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003090 << "wrong number of surfaces";
3091
Marissa Wall80d94ad2019-01-18 16:04:36 -08003092 for (const auto& stats : surfaceControlStats) {
3093 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3094
Marissa Wallfda30bb2018-10-12 11:34:28 -07003095 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3096 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3097 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003098 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003099 }
3100 }
3101
3102private:
3103 class ExpectedSurfaceResult {
3104 public:
3105 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3106 ExpectedResult::PreviousBuffer previousBufferResult)
3107 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3108
Marissa Wall80d94ad2019-01-18 16:04:36 -08003109 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3110 nsecs_t latchTime) const {
3111 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003112
3113 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3114 << "bad acquire time";
3115 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003116
3117 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3118 ASSERT_NE(previousReleaseFence, nullptr)
3119 << "failed to set release prev buffer fence";
3120 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3121 ASSERT_EQ(previousReleaseFence, nullptr)
3122 << "should not have set released prev buffer fence";
3123 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003124 }
3125
3126 private:
3127 ExpectedResult::Buffer mBufferResult;
3128 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3129 };
3130
Marissa Wall80d94ad2019-01-18 16:04:36 -08003131 struct SCHash {
3132 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3133 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003134 }
3135 };
3136 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003137 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003138 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003139};
3140
3141class CallbackHelper {
3142public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003143 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3144 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003145 if (!callbackContext) {
3146 ALOGE("failed to get callback context");
3147 }
3148 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3149 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003150 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003151 helper->mConditionVariable.notify_all();
3152 }
3153
Marissa Wall80d94ad2019-01-18 16:04:36 -08003154 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003155 std::unique_lock lock(mMutex);
3156
Marissa Wall80d94ad2019-01-18 16:04:36 -08003157 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003158 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3159 std::cv_status::timeout)
3160 << "did not receive callback";
3161 }
3162
Marissa Wall80d94ad2019-01-18 16:04:36 -08003163 *outData = std::move(mCallbackDataQueue.front());
3164 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003165 }
3166
3167 void verifyFinalState() {
3168 // Wait to see if there are extra callbacks
3169 std::this_thread::sleep_for(500ms);
3170
3171 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003172 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3173 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003174 }
3175
3176 void* getContext() { return static_cast<void*>(this); }
3177
3178 std::mutex mMutex;
3179 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003180 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003181};
3182
3183class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003184public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003185 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003186 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003187 }
3188
Marissa Wall713b63f2018-10-17 15:42:43 -07003189 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003190 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3191 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003192 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003193 sp<GraphicBuffer> buffer;
3194 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003195 if (setBuffer) {
3196 int err = getBuffer(&buffer, &fence);
3197 if (err != NO_ERROR) {
3198 return err;
3199 }
3200
3201 transaction.setBuffer(layer, buffer);
3202 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003204
Valerie Hauaa194562019-02-05 16:21:38 -08003205 if (setBackgroundColor) {
3206 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3207 ui::Dataspace::UNKNOWN);
3208 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003209 }
3210
3211 transaction.addTransactionCompletedCallback(callbackHelper->function,
3212 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003213 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003214 }
3215
Marissa Wall861616d2018-10-22 12:52:23 -07003216 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3217 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003218 CallbackData callbackData;
3219 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3220 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003221
3222 if (finalState) {
3223 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3224 }
3225 }
3226
Marissa Wall861616d2018-10-22 12:52:23 -07003227 static void waitForCallbacks(CallbackHelper& helper,
3228 const std::vector<ExpectedResult>& expectedResults,
3229 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003230 for (const auto& expectedResult : expectedResults) {
3231 waitForCallback(helper, expectedResult);
3232 }
3233 if (finalState) {
3234 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3235 }
3236 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003237};
3238
Valerie Hauaa194562019-02-05 16:21:38 -08003239TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003240 sp<SurfaceControl> layer;
3241 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3242
3243 Transaction transaction;
3244 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003245 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003246 if (err) {
3247 GTEST_SUCCEED() << "test not supported";
3248 return;
3249 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003250
3251 transaction.apply();
3252
3253 ExpectedResult expected;
3254 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3255 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3256}
3257
Valerie Hauaa194562019-02-05 16:21:38 -08003258TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259 sp<SurfaceControl> layer;
3260 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3261
3262 Transaction transaction;
3263 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003264 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003265 if (err) {
3266 GTEST_SUCCEED() << "test not supported";
3267 return;
3268 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003269
Marissa Wall861616d2018-10-22 12:52:23 -07003270 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003271
3272 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003273 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3274 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003275 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3276}
3277
Valerie Hauaa194562019-02-05 16:21:38 -08003278TEST_F(LayerCallbackTest, BufferNoColor) {
3279 sp<SurfaceControl> layer;
3280 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3281
3282 Transaction transaction;
3283 CallbackHelper callback;
3284 int err = fillTransaction(transaction, &callback, layer, true, false);
3285 if (err) {
3286 GTEST_SUCCEED() << "test not supported";
3287 return;
3288 }
3289
3290 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3291
3292 ExpectedResult expected;
3293 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3294 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3295}
3296
3297TEST_F(LayerCallbackTest, NoBufferColor) {
3298 sp<SurfaceControl> layer;
3299 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3300
3301 Transaction transaction;
3302 CallbackHelper callback;
3303 int err = fillTransaction(transaction, &callback, layer, false, true);
3304 if (err) {
3305 GTEST_SUCCEED() << "test not supported";
3306 return;
3307 }
3308
3309 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3310
3311 ExpectedResult expected;
3312 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3313 ExpectedResult::Buffer::NOT_ACQUIRED);
3314 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3315}
3316
Marissa Wallfda30bb2018-10-12 11:34:28 -07003317TEST_F(LayerCallbackTest, NoStateChange) {
3318 Transaction transaction;
3319 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003320 int err = fillTransaction(transaction, &callback);
3321 if (err) {
3322 GTEST_SUCCEED() << "test not supported";
3323 return;
3324 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003325
3326 transaction.apply();
3327
3328 ExpectedResult expected;
3329 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3330}
3331
3332TEST_F(LayerCallbackTest, OffScreen) {
3333 sp<SurfaceControl> layer;
3334 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3335
3336 Transaction transaction;
3337 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003338 int err = fillTransaction(transaction, &callback, layer);
3339 if (err) {
3340 GTEST_SUCCEED() << "test not supported";
3341 return;
3342 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003343
Marissa Wall861616d2018-10-22 12:52:23 -07003344 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003345
3346 ExpectedResult expected;
3347 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3348 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3349}
3350
Valerie Hauaa194562019-02-05 16:21:38 -08003351TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003352 sp<SurfaceControl> layer1, layer2;
3353 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3354 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3355
3356 Transaction transaction1, transaction2;
3357 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003358 int err = fillTransaction(transaction1, &callback1, layer1);
3359 if (err) {
3360 GTEST_SUCCEED() << "test not supported";
3361 return;
3362 }
3363 err = fillTransaction(transaction2, &callback2, layer2);
3364 if (err) {
3365 GTEST_SUCCEED() << "test not supported";
3366 return;
3367 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003368
Marissa Wall861616d2018-10-22 12:52:23 -07003369 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3370 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003371
3372 ExpectedResult expected;
3373 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3374 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3375 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3376}
3377
Valerie Hauaa194562019-02-05 16:21:38 -08003378TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3379 sp<SurfaceControl> layer1, layer2;
3380 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3381 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3382
3383 Transaction transaction1, transaction2;
3384 CallbackHelper callback1, callback2;
3385 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3386 if (err) {
3387 GTEST_SUCCEED() << "test not supported";
3388 return;
3389 }
3390 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3391 if (err) {
3392 GTEST_SUCCEED() << "test not supported";
3393 return;
3394 }
3395
3396 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3397 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3398
3399 ExpectedResult expected;
3400 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3401 ExpectedResult::Buffer::NOT_ACQUIRED);
3402 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3403 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3404}
3405
3406TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3407 sp<SurfaceControl> layer1, layer2;
3408 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3409 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3410
3411 Transaction transaction1, transaction2;
3412 CallbackHelper callback1, callback2;
3413 int err = fillTransaction(transaction1, &callback1, layer1);
3414 if (err) {
3415 GTEST_SUCCEED() << "test not supported";
3416 return;
3417 }
3418 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3419 if (err) {
3420 GTEST_SUCCEED() << "test not supported";
3421 return;
3422 }
3423
3424 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3425 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3426
3427 ExpectedResult expected;
3428 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3429 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3430 ExpectedResult::Buffer::NOT_ACQUIRED);
3431 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3432 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3433}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003434TEST_F(LayerCallbackTest, Merge_SameCallback) {
3435 sp<SurfaceControl> layer1, layer2;
3436 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3437 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3438
3439 Transaction transaction1, transaction2;
3440 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003441 int err = fillTransaction(transaction1, &callback, layer1);
3442 if (err) {
3443 GTEST_SUCCEED() << "test not supported";
3444 return;
3445 }
3446 err = fillTransaction(transaction2, &callback, layer2);
3447 if (err) {
3448 GTEST_SUCCEED() << "test not supported";
3449 return;
3450 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003451
3452 transaction2.merge(std::move(transaction1)).apply();
3453
3454 ExpectedResult expected;
3455 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3456 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3457 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3458}
3459
3460TEST_F(LayerCallbackTest, Merge_SameLayer) {
3461 sp<SurfaceControl> layer;
3462 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3463
3464 Transaction transaction1, transaction2;
3465 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003466 int err = fillTransaction(transaction1, &callback1, layer);
3467 if (err) {
3468 GTEST_SUCCEED() << "test not supported";
3469 return;
3470 }
3471 err = fillTransaction(transaction2, &callback2, layer);
3472 if (err) {
3473 GTEST_SUCCEED() << "test not supported";
3474 return;
3475 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003476
3477 transaction2.merge(std::move(transaction1)).apply();
3478
3479 ExpectedResult expected;
3480 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3481 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3482 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3483}
3484
Marissa Wallfda30bb2018-10-12 11:34:28 -07003485TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3486 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3487 client2(new SurfaceComposerClient);
3488
3489 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3490 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3491
3492 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003493 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003494 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003495 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003496 ISurfaceComposerClient::eFXSurfaceBufferState));
3497
3498 Transaction transaction1, transaction2;
3499 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003500 int err = fillTransaction(transaction1, &callback1, layer1);
3501 if (err) {
3502 GTEST_SUCCEED() << "test not supported";
3503 return;
3504 }
3505 err = fillTransaction(transaction2, &callback2, layer2);
3506 if (err) {
3507 GTEST_SUCCEED() << "test not supported";
3508 return;
3509 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003510
Marissa Wall861616d2018-10-22 12:52:23 -07003511 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3512 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003513
3514 ExpectedResult expected;
3515 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3516 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3517 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3518}
3519
3520TEST_F(LayerCallbackTest, MultipleTransactions) {
3521 sp<SurfaceControl> layer;
3522 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3523
3524 Transaction transaction;
3525 CallbackHelper callback;
3526 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003527 int err = fillTransaction(transaction, &callback, layer);
3528 if (err) {
3529 GTEST_SUCCEED() << "test not supported";
3530 return;
3531 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003532
3533 transaction.apply();
3534
3535 ExpectedResult expected;
3536 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003537 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003538 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3539 : ExpectedResult::PreviousBuffer::RELEASED);
3540 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3541 }
3542 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3543}
3544
3545TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3546 sp<SurfaceControl> layer;
3547 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3548
3549 Transaction transaction;
3550 CallbackHelper callback;
3551 for (size_t i = 0; i < 10; i++) {
3552 ExpectedResult expected;
3553
3554 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003555 int err = fillTransaction(transaction, &callback, layer);
3556 if (err) {
3557 GTEST_SUCCEED() << "test not supported";
3558 return;
3559 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003560 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3561 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003562 int err = fillTransaction(transaction, &callback);
3563 if (err) {
3564 GTEST_SUCCEED() << "test not supported";
3565 return;
3566 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003567 }
3568
3569 transaction.apply();
3570
3571 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3572 }
3573 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3574}
3575
3576TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3577 sp<SurfaceControl> layer;
3578 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3579
3580 Transaction transaction;
3581 CallbackHelper callback;
3582 for (size_t i = 0; i < 10; i++) {
3583 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003584 int err = fillTransaction(transaction, &callback, layer);
3585 if (err) {
3586 GTEST_SUCCEED() << "test not supported";
3587 return;
3588 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003589 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003590 int err = fillTransaction(transaction, &callback);
3591 if (err) {
3592 GTEST_SUCCEED() << "test not supported";
3593 return;
3594 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003595 }
3596
Marissa Wall861616d2018-10-22 12:52:23 -07003597 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003598
3599 ExpectedResult expected;
3600 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3601 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003602 layer,
3603 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3604 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003605 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3606 }
3607 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3608}
3609
3610TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3611 sp<SurfaceControl> layer1, layer2;
3612 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3613 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3614
3615 Transaction transaction1, transaction2;
3616 CallbackHelper callback1, callback2;
3617 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003618 int err = fillTransaction(transaction1, &callback1, layer1);
3619 if (err) {
3620 GTEST_SUCCEED() << "test not supported";
3621 return;
3622 }
3623 err = fillTransaction(transaction2, &callback2, layer2);
3624 if (err) {
3625 GTEST_SUCCEED() << "test not supported";
3626 return;
3627 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003628
Marissa Wall861616d2018-10-22 12:52:23 -07003629 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3630 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003631
3632 ExpectedResult expected;
3633 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003634 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003635 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3636 : ExpectedResult::PreviousBuffer::RELEASED);
3637 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3638 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3639 }
3640 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3641 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3642}
3643
3644TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3645 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3646 client2(new SurfaceComposerClient);
3647 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3648 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3649
3650 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003651 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003652 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003653 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003654 ISurfaceComposerClient::eFXSurfaceBufferState));
3655
3656 Transaction transaction1, transaction2;
3657 CallbackHelper callback1, callback2;
3658 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003659 int err = fillTransaction(transaction1, &callback1, layer1);
3660 if (err) {
3661 GTEST_SUCCEED() << "test not supported";
3662 return;
3663 }
3664 err = fillTransaction(transaction2, &callback2, layer2);
3665 if (err) {
3666 GTEST_SUCCEED() << "test not supported";
3667 return;
3668 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003669
Marissa Wall861616d2018-10-22 12:52:23 -07003670 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3671 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003672
3673 ExpectedResult expected;
3674 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003675 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003676 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3677 : ExpectedResult::PreviousBuffer::RELEASED);
3678 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3679 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3680 }
3681 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3682 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3683}
3684
3685TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3686 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3687 client2(new SurfaceComposerClient);
3688 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3689 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3690
3691 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003692 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003693 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003694 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003695 ISurfaceComposerClient::eFXSurfaceBufferState));
3696
3697 Transaction transaction1, transaction2;
3698 CallbackHelper callback1, callback2;
3699
3700 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003701 int err = fillTransaction(transaction1, &callback1, layer1);
3702 if (err) {
3703 GTEST_SUCCEED() << "test not supported";
3704 return;
3705 }
3706 err = fillTransaction(transaction2, &callback2, layer2);
3707 if (err) {
3708 GTEST_SUCCEED() << "test not supported";
3709 return;
3710 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003711
Marissa Wall861616d2018-10-22 12:52:23 -07003712 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3713 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003714
3715 ExpectedResult expected;
3716 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3717 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3718 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3719 expected.reset();
3720
3721 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003722 err = fillTransaction(transaction1, &callback1);
3723 if (err) {
3724 GTEST_SUCCEED() << "test not supported";
3725 return;
3726 }
3727 err = fillTransaction(transaction2, &callback2);
3728 if (err) {
3729 GTEST_SUCCEED() << "test not supported";
3730 return;
3731 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003732
3733 transaction2.merge(std::move(transaction1)).apply();
3734
3735 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3736 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3737}
3738
3739TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3740 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3741 client2(new SurfaceComposerClient);
3742
3743 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3744 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3745
3746 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003747 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003748 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003749 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003750 ISurfaceComposerClient::eFXSurfaceBufferState));
3751
3752 Transaction transaction1, transaction2;
3753 CallbackHelper callback1, callback2;
3754
3755 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003756 int err = fillTransaction(transaction1, &callback1, layer1);
3757 if (err) {
3758 GTEST_SUCCEED() << "test not supported";
3759 return;
3760 }
3761 err = fillTransaction(transaction2, &callback2, layer2);
3762 if (err) {
3763 GTEST_SUCCEED() << "test not supported";
3764 return;
3765 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003766
Marissa Wall861616d2018-10-22 12:52:23 -07003767 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3768 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003769
3770 ExpectedResult expected;
3771 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3772 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3773 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3774 expected.reset();
3775
3776 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003777 err = fillTransaction(transaction1, &callback1);
3778 if (err) {
3779 GTEST_SUCCEED() << "test not supported";
3780 return;
3781 }
3782 err = fillTransaction(transaction2, &callback2);
3783 if (err) {
3784 GTEST_SUCCEED() << "test not supported";
3785 return;
3786 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003787
Marissa Wall861616d2018-10-22 12:52:23 -07003788 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003789
Marissa Wall713b63f2018-10-17 15:42:43 -07003790 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3791 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003792 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3793 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3794}
3795
3796TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3797 sp<SurfaceControl> layer;
3798 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3799
3800 Transaction transaction;
3801 CallbackHelper callback;
3802 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003803 for (auto& expected : expectedResults) {
3804 expected.reset();
3805 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003806 ExpectedResult::Buffer::ACQUIRED,
3807 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003808
Marissa Wall713b63f2018-10-17 15:42:43 -07003809 int err = fillTransaction(transaction, &callback, layer);
3810 if (err) {
3811 GTEST_SUCCEED() << "test not supported";
3812 return;
3813 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003814
3815 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003816 }
3817 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3818}
3819
3820TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3821 sp<SurfaceControl> layer;
3822 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3823
Marissa Wall713b63f2018-10-17 15:42:43 -07003824 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003825 Transaction transaction;
3826 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003827 int err = fillTransaction(transaction, &callback, layer);
3828 if (err) {
3829 GTEST_SUCCEED() << "test not supported";
3830 return;
3831 }
3832
3833 transaction.apply();
3834
3835 ExpectedResult expected;
3836 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3837 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3838
3839 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003840 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003841 for (auto& expected : expectedResults) {
3842 expected.reset();
3843
Marissa Wall713b63f2018-10-17 15:42:43 -07003844 err = fillTransaction(transaction, &callback);
3845 if (err) {
3846 GTEST_SUCCEED() << "test not supported";
3847 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003848 }
3849
3850 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003851 }
3852 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3853}
3854
3855TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3856 sp<SurfaceControl> layer;
3857 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3858
3859 // Normal call to set up test
3860 Transaction transaction;
3861 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003862 int err = fillTransaction(transaction, &callback, layer);
3863 if (err) {
3864 GTEST_SUCCEED() << "test not supported";
3865 return;
3866 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003867
Marissa Wall861616d2018-10-22 12:52:23 -07003868 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003869
3870 ExpectedResult expectedResult;
3871 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3872 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3873
3874 // Test
3875 std::vector<ExpectedResult> expectedResults(50);
3876 for (auto& expected : expectedResults) {
3877 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003878 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3879 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003880
Marissa Wall713b63f2018-10-17 15:42:43 -07003881 err = fillTransaction(transaction, &callback);
3882 if (err) {
3883 GTEST_SUCCEED() << "test not supported";
3884 return;
3885 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003886
Marissa Wall861616d2018-10-22 12:52:23 -07003887 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003888 }
3889 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3890}
3891
Marissa Wall17b4e452018-12-26 16:32:34 -08003892TEST_F(LayerCallbackTest, DesiredPresentTime) {
3893 sp<SurfaceControl> layer;
3894 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3895
3896 Transaction transaction;
3897 CallbackHelper callback;
3898 int err = fillTransaction(transaction, &callback, layer);
3899 if (err) {
3900 GTEST_SUCCEED() << "test not supported";
3901 return;
3902 }
3903
3904 // Try to present 100ms in the future
3905 nsecs_t time = systemTime() + (100 * 1e6);
3906
3907 transaction.setDesiredPresentTime(time);
3908 transaction.apply();
3909
3910 ExpectedResult expected;
3911 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3912 expected.addExpectedPresentTime(time);
3913 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3914}
3915
3916TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3917 sp<SurfaceControl> layer;
3918 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3919
3920 Transaction transaction;
3921 CallbackHelper callback1;
3922 int err = fillTransaction(transaction, &callback1, layer);
3923 if (err) {
3924 GTEST_SUCCEED() << "test not supported";
3925 return;
3926 }
3927
3928 // Try to present 100ms in the future
3929 nsecs_t time = systemTime() + (100 * 1e6);
3930
3931 transaction.setDesiredPresentTime(time);
3932 transaction.apply();
3933
3934 ExpectedResult expected1;
3935 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3936 expected1.addExpectedPresentTime(time);
3937
3938 CallbackHelper callback2;
3939 err = fillTransaction(transaction, &callback2, layer);
3940 if (err) {
3941 GTEST_SUCCEED() << "test not supported";
3942 return;
3943 }
3944
3945 // Try to present 33ms after the first frame
3946 time += (33.3 * 1e6);
3947
3948 transaction.setDesiredPresentTime(time);
3949 transaction.apply();
3950
3951 ExpectedResult expected2;
3952 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3953 ExpectedResult::Buffer::ACQUIRED,
3954 ExpectedResult::PreviousBuffer::RELEASED);
3955 expected2.addExpectedPresentTime(time);
3956
3957 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3958 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3959}
3960
3961TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3962 sp<SurfaceControl> layer;
3963 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3964
3965 Transaction transaction;
3966 CallbackHelper callback1;
3967 int err = fillTransaction(transaction, &callback1, layer);
3968 if (err) {
3969 GTEST_SUCCEED() << "test not supported";
3970 return;
3971 }
3972
3973 // Try to present 100ms in the future
3974 nsecs_t time = systemTime() + (100 * 1e6);
3975
3976 transaction.setDesiredPresentTime(time);
3977 transaction.apply();
3978
3979 ExpectedResult expected1;
3980 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3981 expected1.addExpectedPresentTime(time);
3982
3983 CallbackHelper callback2;
3984 err = fillTransaction(transaction, &callback2, layer);
3985 if (err) {
3986 GTEST_SUCCEED() << "test not supported";
3987 return;
3988 }
3989
3990 // Try to present 33ms before the previous frame
3991 time -= (33.3 * 1e6);
3992
3993 transaction.setDesiredPresentTime(time);
3994 transaction.apply();
3995
3996 ExpectedResult expected2;
3997 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3998 ExpectedResult::Buffer::ACQUIRED,
3999 ExpectedResult::PreviousBuffer::RELEASED);
4000
4001 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4002 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4003}
4004
4005TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4006 sp<SurfaceControl> layer;
4007 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4008
4009 Transaction transaction;
4010 CallbackHelper callback;
4011 int err = fillTransaction(transaction, &callback, layer);
4012 if (err) {
4013 GTEST_SUCCEED() << "test not supported";
4014 return;
4015 }
4016
4017 // Try to present 100ms in the past
4018 nsecs_t time = systemTime() - (100 * 1e6);
4019
4020 transaction.setDesiredPresentTime(time);
4021 transaction.apply();
4022
4023 ExpectedResult expected;
4024 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4025 expected.addExpectedPresentTime(systemTime());
4026 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4027}
4028
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004029class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004030protected:
4031 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004032 LayerTransactionTest::SetUp();
4033 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004034
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004035 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4036 ASSERT_FALSE(display == nullptr);
4037
Mathias Agopianc666cae2012-07-25 18:56:13 -07004038 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004039 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004040
4041 ssize_t displayWidth = info.w;
4042 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004043
4044 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004045 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4046 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004047 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004048 ASSERT_TRUE(mBGSurfaceControl->isValid());
4049 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4050
4051 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004052 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4053
Peiyong Lin566a3b42018-01-09 18:22:43 -08004054 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004055 ASSERT_TRUE(mFGSurfaceControl->isValid());
4056
4057 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4058
4059 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004060 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004061 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004062 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4063
4064 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4065
Robert Carr4cdc58f2017-08-23 14:22:20 -07004066 asTransaction([&](Transaction& t) {
4067 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004068
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004069 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004070
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004071 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4072 .setPosition(mFGSurfaceControl, 64, 64)
4073 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004074
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004075 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4076 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4077 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004078 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004079 }
4080
4081 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004082 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004083 mBGSurfaceControl = 0;
4084 mFGSurfaceControl = 0;
4085 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004086 }
4087
4088 void waitForPostedBuffers() {
4089 // Since the sync surface is in synchronous mode (i.e. double buffered)
4090 // posting three buffers to it should ensure that at least two
4091 // SurfaceFlinger::handlePageFlip calls have been made, which should
4092 // guaranteed that a buffer posted to another Surface has been retired.
4093 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4094 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4095 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4096 }
4097
Robert Carr4cdc58f2017-08-23 14:22:20 -07004098
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004099 sp<SurfaceControl> mBGSurfaceControl;
4100 sp<SurfaceControl> mFGSurfaceControl;
4101
4102 // This surface is used to ensure that the buffers posted to
4103 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4104 sp<SurfaceControl> mSyncSurfaceControl;
4105};
4106
Robert Carr7f619b22017-11-06 12:56:35 -08004107TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004108
chaviw0e3479f2018-09-10 16:49:30 -07004109 std::unique_ptr<ScreenCapture> sc;
4110
4111 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004112 fillSurfaceRGBA8(relative, 10, 10, 10);
4113 waitForPostedBuffers();
4114
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004115 Transaction{}
4116 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004117 .setPosition(relative, 64, 64)
4118 .apply();
4119
4120 {
4121 // The relative should be on top of the FG control.
4122 ScreenCapture::captureScreen(&sc);
4123 sc->checkPixel(64, 64, 10, 10, 10);
4124 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004125 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004126
4127 {
4128 // Nothing should change at this point.
4129 ScreenCapture::captureScreen(&sc);
4130 sc->checkPixel(64, 64, 10, 10, 10);
4131 }
4132
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004133 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004134
4135 {
4136 // Ensure that the relative was actually hidden, rather than
4137 // being left in the detached but visible state.
4138 ScreenCapture::captureScreen(&sc);
4139 sc->expectFGColor(64, 64);
4140 }
4141}
4142
Robert Carr8d5227b2017-03-16 15:41:03 -07004143class GeometryLatchingTest : public LayerUpdateTest {
4144protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004145 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004146 SCOPED_TRACE(trace);
4147 ScreenCapture::captureScreen(&sc);
4148 // We find the leading edge of the FG surface.
4149 sc->expectFGColor(127, 127);
4150 sc->expectBGColor(128, 128);
4151 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004152
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004153 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004154
4155 void unlockFGBuffer() {
4156 sp<Surface> s = mFGSurfaceControl->getSurface();
4157 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4158 waitForPostedBuffers();
4159 }
4160
Robert Carr8d5227b2017-03-16 15:41:03 -07004161 void completeFGResize() {
4162 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4163 waitForPostedBuffers();
4164 }
4165 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004166 asTransaction([&](Transaction& t) {
4167 t.setSize(mFGSurfaceControl, 64, 64);
4168 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004169 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004170 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004171
4172 EXPECT_INITIAL_STATE("After restoring initial state");
4173 }
chaviw0e3479f2018-09-10 16:49:30 -07004174 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004175};
4176
Robert Carr8d5227b2017-03-16 15:41:03 -07004177class CropLatchingTest : public GeometryLatchingTest {
4178protected:
4179 void EXPECT_CROPPED_STATE(const char* trace) {
4180 SCOPED_TRACE(trace);
4181 ScreenCapture::captureScreen(&sc);
4182 // The edge should be moved back one pixel by our crop.
4183 sc->expectFGColor(126, 126);
4184 sc->expectBGColor(127, 127);
4185 sc->expectBGColor(128, 128);
4186 }
chaviw59f5c562017-06-28 16:39:06 -07004187
4188 void EXPECT_RESIZE_STATE(const char* trace) {
4189 SCOPED_TRACE(trace);
4190 ScreenCapture::captureScreen(&sc);
4191 // The FG is now resized too 128,128 at 64,64
4192 sc->expectFGColor(64, 64);
4193 sc->expectFGColor(191, 191);
4194 sc->expectBGColor(192, 192);
4195 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004196};
4197
Pablo Ceballos05289c22016-04-14 15:49:55 -07004198TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004199 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004200 {
4201 SCOPED_TRACE("before anything");
4202 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004203 sc->expectBGColor(32, 32);
4204 sc->expectFGColor(96, 96);
4205 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004206 }
4207
4208 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004209 asTransaction([&](Transaction& t) {
4210 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004211 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4212 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004213 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004214
Robert Carr4cdc58f2017-08-23 14:22:20 -07004215 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004216 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004217 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4218 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004219 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004220
4221 {
4222 SCOPED_TRACE("before any trigger");
4223 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004224 sc->expectBGColor(32, 32);
4225 sc->expectFGColor(96, 96);
4226 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004227 }
4228
4229 // should trigger the first deferred transaction, but not the second one
4230 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4231 {
4232 SCOPED_TRACE("after first trigger");
4233 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004234 sc->expectBGColor(32, 32);
4235 sc->checkPixel(96, 96, 162, 63, 96);
4236 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004237 }
4238
4239 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004240 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004241
4242 // trigger the second deferred transaction
4243 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4244 {
4245 SCOPED_TRACE("after second trigger");
4246 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004247 sc->expectBGColor(32, 32);
4248 sc->expectBGColor(96, 96);
4249 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004250 }
4251}
4252
Robert Carre392b552017-09-19 12:16:05 -07004253TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004254 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004255
4256 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004257 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4258 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4259 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4260 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004261 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004262 SurfaceComposerClient::Transaction{}
4263 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4264 .show(childNoBuffer)
4265 .show(childBuffer)
4266 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004267 {
4268 ScreenCapture::captureScreen(&sc);
4269 sc->expectChildColor(73, 73);
4270 sc->expectFGColor(74, 74);
4271 }
Vishnu Nair60356342018-11-13 13:00:45 -08004272 SurfaceComposerClient::Transaction{}
4273 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4274 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004275 {
4276 ScreenCapture::captureScreen(&sc);
4277 sc->expectChildColor(73, 73);
4278 sc->expectChildColor(74, 74);
4279 }
4280}
4281
Robert Carr2c5f6d22017-09-26 12:30:35 -07004282TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004283 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004284 {
4285 SCOPED_TRACE("before move");
4286 ScreenCapture::captureScreen(&sc);
4287 sc->expectBGColor(0, 12);
4288 sc->expectFGColor(75, 75);
4289 sc->expectBGColor(145, 145);
4290 }
4291
4292 Transaction t1, t2;
4293 t1.setPosition(mFGSurfaceControl, 128, 128);
4294 t2.setPosition(mFGSurfaceControl, 0, 0);
4295 // We expect that the position update from t2 now
4296 // overwrites the position update from t1.
4297 t1.merge(std::move(t2));
4298 t1.apply();
4299
4300 {
4301 ScreenCapture::captureScreen(&sc);
4302 sc->expectFGColor(1, 1);
4303 }
4304}
4305
Robert Carr1f0a16a2016-10-24 16:27:39 -07004306class ChildLayerTest : public LayerUpdateTest {
4307protected:
4308 void SetUp() override {
4309 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004310 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4311 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004312 fillSurfaceRGBA8(mChild, 200, 200, 200);
4313
4314 {
4315 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004316 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004317 mCapture->expectChildColor(64, 64);
4318 }
4319 }
4320 void TearDown() override {
4321 LayerUpdateTest::TearDown();
4322 mChild = 0;
4323 }
4324
4325 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004326 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004327};
4328
4329TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004330 asTransaction([&](Transaction& t) {
4331 t.show(mChild);
4332 t.setPosition(mChild, 10, 10);
4333 t.setPosition(mFGSurfaceControl, 64, 64);
4334 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004335
4336 {
chaviw0e3479f2018-09-10 16:49:30 -07004337 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004338 // Top left of foreground must now be visible
4339 mCapture->expectFGColor(64, 64);
4340 // But 10 pixels in we should see the child surface
4341 mCapture->expectChildColor(74, 74);
4342 // And 10 more pixels we should be back to the foreground surface
4343 mCapture->expectFGColor(84, 84);
4344 }
4345
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004346 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004347
4348 {
chaviw0e3479f2018-09-10 16:49:30 -07004349 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004350 // Top left of foreground should now be at 0, 0
4351 mCapture->expectFGColor(0, 0);
4352 // But 10 pixels in we should see the child surface
4353 mCapture->expectChildColor(10, 10);
4354 // And 10 more pixels we should be back to the foreground surface
4355 mCapture->expectFGColor(20, 20);
4356 }
4357}
4358
Robert Carr41b08b52017-06-01 16:11:34 -07004359TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004360 asTransaction([&](Transaction& t) {
4361 t.show(mChild);
4362 t.setPosition(mChild, 0, 0);
4363 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004364 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004365 });
Robert Carr41b08b52017-06-01 16:11:34 -07004366
4367 {
chaviw0e3479f2018-09-10 16:49:30 -07004368 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004369 mCapture->expectChildColor(0, 0);
4370 mCapture->expectChildColor(4, 4);
4371 mCapture->expectBGColor(5, 5);
4372 }
4373}
4374
Robert Carr1f0a16a2016-10-24 16:27:39 -07004375TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004376 asTransaction([&](Transaction& t) {
4377 t.show(mChild);
4378 t.setPosition(mFGSurfaceControl, 0, 0);
4379 t.setPosition(mChild, 63, 63);
4380 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004381
4382 {
chaviw0e3479f2018-09-10 16:49:30 -07004383 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004384 mCapture->expectFGColor(0, 0);
4385 // Last pixel in foreground should now be the child.
4386 mCapture->expectChildColor(63, 63);
4387 // But the child should be constrained and the next pixel
4388 // must be the background
4389 mCapture->expectBGColor(64, 64);
4390 }
4391}
4392
4393TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004394 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004395
4396 // Find the boundary between the parent and child
4397 {
chaviw0e3479f2018-09-10 16:49:30 -07004398 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004399 mCapture->expectChildColor(9, 9);
4400 mCapture->expectFGColor(10, 10);
4401 }
4402
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004403 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004404
4405 // The boundary should be twice as far from the origin now.
4406 // The pixels from the last test should all be child now
4407 {
chaviw0e3479f2018-09-10 16:49:30 -07004408 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004409 mCapture->expectChildColor(9, 9);
4410 mCapture->expectChildColor(10, 10);
4411 mCapture->expectChildColor(19, 19);
4412 mCapture->expectFGColor(20, 20);
4413 }
4414}
Robert Carr9524cb32017-02-13 11:32:32 -08004415
Robert Carr6452f122017-03-21 10:41:29 -07004416TEST_F(ChildLayerTest, ChildLayerAlpha) {
4417 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4418 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4419 fillSurfaceRGBA8(mChild, 0, 254, 0);
4420 waitForPostedBuffers();
4421
Robert Carr4cdc58f2017-08-23 14:22:20 -07004422 asTransaction([&](Transaction& t) {
4423 t.show(mChild);
4424 t.setPosition(mChild, 0, 0);
4425 t.setPosition(mFGSurfaceControl, 0, 0);
4426 });
Robert Carr6452f122017-03-21 10:41:29 -07004427
4428 {
chaviw0e3479f2018-09-10 16:49:30 -07004429 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004430 // Unblended child color
4431 mCapture->checkPixel(0, 0, 0, 254, 0);
4432 }
4433
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004434 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004435
4436 {
chaviw0e3479f2018-09-10 16:49:30 -07004437 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004438 // Child and BG blended.
4439 mCapture->checkPixel(0, 0, 127, 127, 0);
4440 }
4441
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004442 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004443
4444 {
chaviw0e3479f2018-09-10 16:49:30 -07004445 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004446 // Child and BG blended.
4447 mCapture->checkPixel(0, 0, 95, 64, 95);
4448 }
4449}
4450
Robert Carr9524cb32017-02-13 11:32:32 -08004451TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004452 asTransaction([&](Transaction& t) {
4453 t.show(mChild);
4454 t.setPosition(mChild, 10, 10);
4455 t.setPosition(mFGSurfaceControl, 64, 64);
4456 });
Robert Carr9524cb32017-02-13 11:32:32 -08004457
4458 {
chaviw0e3479f2018-09-10 16:49:30 -07004459 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004460 // Top left of foreground must now be visible
4461 mCapture->expectFGColor(64, 64);
4462 // But 10 pixels in we should see the child surface
4463 mCapture->expectChildColor(74, 74);
4464 // And 10 more pixels we should be back to the foreground surface
4465 mCapture->expectFGColor(84, 84);
4466 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004467
4468 asTransaction([&](Transaction& t) {
4469 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4470 });
4471
Robert Carr9524cb32017-02-13 11:32:32 -08004472 {
chaviw0e3479f2018-09-10 16:49:30 -07004473 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004474 mCapture->expectFGColor(64, 64);
4475 // In reparenting we should have exposed the entire foreground surface.
4476 mCapture->expectFGColor(74, 74);
4477 // And the child layer should now begin at 10, 10 (since the BG
4478 // layer is at (0, 0)).
4479 mCapture->expectBGColor(9, 9);
4480 mCapture->expectChildColor(10, 10);
4481 }
4482}
4483
Robert Carr2e102c92018-10-23 12:11:15 -07004484TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4485 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004486 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004487 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4488
4489 {
4490 SCOPED_TRACE("Grandchild visible");
4491 ScreenCapture::captureScreen(&mCapture);
4492 mCapture->checkPixel(64, 64, 111, 111, 111);
4493 }
4494
Robert Carr87246532019-02-04 15:20:26 -08004495 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004496
4497 {
4498 SCOPED_TRACE("After destroying child");
4499 ScreenCapture::captureScreen(&mCapture);
4500 mCapture->expectFGColor(64, 64);
4501 }
4502
4503 asTransaction([&](Transaction& t) {
4504 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4505 });
4506
4507 {
4508 SCOPED_TRACE("After reparenting grandchild");
4509 ScreenCapture::captureScreen(&mCapture);
4510 mCapture->checkPixel(64, 64, 111, 111, 111);
4511 }
4512}
4513
chaviw161410b02017-07-27 10:46:08 -07004514TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004515 asTransaction([&](Transaction& t) {
4516 t.show(mChild);
4517 t.setPosition(mChild, 10, 10);
4518 t.setPosition(mFGSurfaceControl, 64, 64);
4519 });
Robert Carr9524cb32017-02-13 11:32:32 -08004520
4521 {
chaviw0e3479f2018-09-10 16:49:30 -07004522 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004523 // Top left of foreground must now be visible
4524 mCapture->expectFGColor(64, 64);
4525 // But 10 pixels in we should see the child surface
4526 mCapture->expectChildColor(74, 74);
4527 // And 10 more pixels we should be back to the foreground surface
4528 mCapture->expectFGColor(84, 84);
4529 }
4530
chaviw0e3479f2018-09-10 16:49:30 -07004531
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004532 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004533
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004534 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004535
chaviw161410b02017-07-27 10:46:08 -07004536 // Since the child has the same client as the parent, it will not get
4537 // detached and will be hidden.
4538 {
chaviw0e3479f2018-09-10 16:49:30 -07004539 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004540 mCapture->expectFGColor(64, 64);
4541 mCapture->expectFGColor(74, 74);
4542 mCapture->expectFGColor(84, 84);
4543 }
4544}
4545
4546TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4547 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004548 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004549 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4550 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004551
chaviw161410b02017-07-27 10:46:08 -07004552 ASSERT_TRUE(mChildNewClient->isValid());
4553
4554 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4555
Robert Carr4cdc58f2017-08-23 14:22:20 -07004556 asTransaction([&](Transaction& t) {
4557 t.hide(mChild);
4558 t.show(mChildNewClient);
4559 t.setPosition(mChildNewClient, 10, 10);
4560 t.setPosition(mFGSurfaceControl, 64, 64);
4561 });
chaviw161410b02017-07-27 10:46:08 -07004562
4563 {
chaviw0e3479f2018-09-10 16:49:30 -07004564 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004565 // Top left of foreground must now be visible
4566 mCapture->expectFGColor(64, 64);
4567 // But 10 pixels in we should see the child surface
4568 mCapture->expectChildColor(74, 74);
4569 // And 10 more pixels we should be back to the foreground surface
4570 mCapture->expectFGColor(84, 84);
4571 }
4572
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004573 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004574
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004575 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004576
Robert Carr9524cb32017-02-13 11:32:32 -08004577 // Nothing should have changed.
4578 {
chaviw0e3479f2018-09-10 16:49:30 -07004579 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004580 mCapture->expectFGColor(64, 64);
4581 mCapture->expectChildColor(74, 74);
4582 mCapture->expectFGColor(84, 84);
4583 }
4584}
4585
chaviw5aedec92018-10-22 10:40:38 -07004586TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4587 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4588 sp<SurfaceControl> childNewClient =
4589 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4590 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4591
4592 ASSERT_TRUE(childNewClient != nullptr);
4593 ASSERT_TRUE(childNewClient->isValid());
4594
4595 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4596
4597 Transaction()
4598 .hide(mChild)
4599 .show(childNewClient)
4600 .setPosition(childNewClient, 10, 10)
4601 .setPosition(mFGSurfaceControl, 64, 64)
4602 .apply();
4603
4604 {
4605 mCapture = screenshot();
4606 // Top left of foreground must now be visible
4607 mCapture->expectFGColor(64, 64);
4608 // But 10 pixels in we should see the child surface
4609 mCapture->expectChildColor(74, 74);
4610 // And 10 more pixels we should be back to the foreground surface
4611 mCapture->expectFGColor(84, 84);
4612 }
4613
4614 Transaction().detachChildren(mFGSurfaceControl).apply();
4615 Transaction().hide(childNewClient).apply();
4616
4617 // Nothing should have changed.
4618 {
4619 mCapture = screenshot();
4620 mCapture->expectFGColor(64, 64);
4621 mCapture->expectChildColor(74, 74);
4622 mCapture->expectFGColor(84, 84);
4623 }
4624
4625 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4626 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4627 32);
4628 Transaction()
4629 .setLayer(newParentSurface, INT32_MAX - 1)
4630 .show(newParentSurface)
4631 .setPosition(newParentSurface, 20, 20)
4632 .reparent(childNewClient, newParentSurface->getHandle())
4633 .apply();
4634 {
4635 mCapture = screenshot();
4636 // Child is now hidden.
4637 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4638 }
4639}
4640
Robert Carr9b429f42017-04-17 14:56:57 -07004641TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004642 asTransaction([&](Transaction& t) {
4643 t.show(mChild);
4644 t.setPosition(mChild, 0, 0);
4645 t.setPosition(mFGSurfaceControl, 0, 0);
4646 });
Robert Carr9b429f42017-04-17 14:56:57 -07004647
4648 {
chaviw0e3479f2018-09-10 16:49:30 -07004649 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004650 // We've positioned the child in the top left.
4651 mCapture->expectChildColor(0, 0);
4652 // But it's only 10x10.
4653 mCapture->expectFGColor(10, 10);
4654 }
4655
Robert Carr4cdc58f2017-08-23 14:22:20 -07004656 asTransaction([&](Transaction& t) {
4657 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4658 // We cause scaling by 2.
4659 t.setSize(mFGSurfaceControl, 128, 128);
4660 });
Robert Carr9b429f42017-04-17 14:56:57 -07004661
4662 {
chaviw0e3479f2018-09-10 16:49:30 -07004663 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004664 // We've positioned the child in the top left.
4665 mCapture->expectChildColor(0, 0);
4666 mCapture->expectChildColor(10, 10);
4667 mCapture->expectChildColor(19, 19);
4668 // And now it should be scaled all the way to 20x20
4669 mCapture->expectFGColor(20, 20);
4670 }
4671}
4672
Robert Carr1725eee2017-04-26 18:32:15 -07004673// Regression test for b/37673612
4674TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004675 asTransaction([&](Transaction& t) {
4676 t.show(mChild);
4677 t.setPosition(mChild, 0, 0);
4678 t.setPosition(mFGSurfaceControl, 0, 0);
4679 });
Robert Carr1725eee2017-04-26 18:32:15 -07004680
4681 {
chaviw0e3479f2018-09-10 16:49:30 -07004682 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004683 // We've positioned the child in the top left.
4684 mCapture->expectChildColor(0, 0);
4685 // But it's only 10x10.
4686 mCapture->expectFGColor(10, 10);
4687 }
Robert Carr1725eee2017-04-26 18:32:15 -07004688 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4689 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004690 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004691 sp<Surface> s = mFGSurfaceControl->getSurface();
4692 auto anw = static_cast<ANativeWindow*>(s.get());
4693 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4694 native_window_set_buffers_dimensions(anw, 64, 128);
4695 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4696 waitForPostedBuffers();
4697
4698 {
4699 // The child should still be in the same place and not have any strange scaling as in
4700 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004701 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004702 mCapture->expectChildColor(0, 0);
4703 mCapture->expectFGColor(10, 10);
4704 }
4705}
4706
Dan Stoza412903f2017-04-27 13:42:17 -07004707TEST_F(ChildLayerTest, Bug36858924) {
4708 // Destroy the child layer
4709 mChild.clear();
4710
4711 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004712 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4713 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004714
4715 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004716 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004717 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4718 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004719 t.show(mChild);
4720 });
Dan Stoza412903f2017-04-27 13:42:17 -07004721
4722 // Render the foreground surface a few times
4723 //
4724 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4725 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4726 // never acquire/release the first buffer
4727 ALOGI("Filling 1");
4728 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4729 ALOGI("Filling 2");
4730 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4731 ALOGI("Filling 3");
4732 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4733 ALOGI("Filling 4");
4734 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4735}
4736
chaviwf1961f72017-09-18 16:41:07 -07004737TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004738 asTransaction([&](Transaction& t) {
4739 t.show(mChild);
4740 t.setPosition(mChild, 10, 10);
4741 t.setPosition(mFGSurfaceControl, 64, 64);
4742 });
chaviw06178942017-07-27 10:25:59 -07004743
4744 {
chaviw0e3479f2018-09-10 16:49:30 -07004745 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004746 // Top left of foreground must now be visible
4747 mCapture->expectFGColor(64, 64);
4748 // But 10 pixels in we should see the child surface
4749 mCapture->expectChildColor(74, 74);
4750 // And 10 more pixels we should be back to the foreground surface
4751 mCapture->expectFGColor(84, 84);
4752 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004753
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004754 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004755
chaviw06178942017-07-27 10:25:59 -07004756 {
chaviw0e3479f2018-09-10 16:49:30 -07004757 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004758 mCapture->expectFGColor(64, 64);
4759 // In reparenting we should have exposed the entire foreground surface.
4760 mCapture->expectFGColor(74, 74);
4761 // And the child layer should now begin at 10, 10 (since the BG
4762 // layer is at (0, 0)).
4763 mCapture->expectBGColor(9, 9);
4764 mCapture->expectChildColor(10, 10);
4765 }
4766}
4767
chaviwf1961f72017-09-18 16:41:07 -07004768TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004769 asTransaction([&](Transaction& t) {
4770 t.show(mChild);
4771 t.setPosition(mChild, 10, 10);
4772 t.setPosition(mFGSurfaceControl, 64, 64);
4773 });
chaviwf1961f72017-09-18 16:41:07 -07004774
4775 {
chaviw0e3479f2018-09-10 16:49:30 -07004776 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004777 // Top left of foreground must now be visible
4778 mCapture->expectFGColor(64, 64);
4779 // But 10 pixels in we should see the child surface
4780 mCapture->expectChildColor(74, 74);
4781 // And 10 more pixels we should be back to the foreground surface
4782 mCapture->expectFGColor(84, 84);
4783 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004784 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004785 {
chaviw0e3479f2018-09-10 16:49:30 -07004786 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004787 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004788 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004789 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004790 mCapture->expectFGColor(84, 84);
4791 }
4792}
4793
4794TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004795 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004796 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004797 ASSERT_TRUE(newSurface->isValid());
4798
4799 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004800 asTransaction([&](Transaction& t) {
4801 t.hide(mChild);
4802 t.show(newSurface);
4803 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004804 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004805 t.setPosition(mFGSurfaceControl, 64, 64);
4806 });
chaviwf1961f72017-09-18 16:41:07 -07004807
4808 {
chaviw0e3479f2018-09-10 16:49:30 -07004809 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004810 // Top left of foreground must now be visible
4811 mCapture->expectFGColor(64, 64);
4812 // At 10, 10 we should see the new surface
4813 mCapture->checkPixel(10, 10, 63, 195, 63);
4814 }
4815
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004816 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004817
4818 {
chaviw0e3479f2018-09-10 16:49:30 -07004819 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004820 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4821 // mFGSurface, putting it at 74, 74.
4822 mCapture->expectFGColor(64, 64);
4823 mCapture->checkPixel(74, 74, 63, 195, 63);
4824 mCapture->expectFGColor(84, 84);
4825 }
4826}
4827
chaviwc9674332017-08-28 12:32:18 -07004828TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004829 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4830 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004831 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4832
4833 {
chaviw0e3479f2018-09-10 16:49:30 -07004834 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004835 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4836 // which begins at 64, 64
4837 mCapture->checkPixel(64, 64, 50, 50, 50);
4838 }
4839}
4840
Robert Carr503c7042017-09-27 15:06:08 -07004841TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004842 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004843 fillSurfaceRGBA8(relative, 255, 255, 255);
4844
4845 Transaction t;
4846 t.setLayer(relative, INT32_MAX)
4847 .setRelativeLayer(mChild, relative->getHandle(), 1)
4848 .setPosition(mFGSurfaceControl, 0, 0)
4849 .apply(true);
4850
4851 // We expect that the child should have been elevated above our
4852 // INT_MAX layer even though it's not a child of it.
4853 {
chaviw0e3479f2018-09-10 16:49:30 -07004854 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004855 mCapture->expectChildColor(0, 0);
4856 mCapture->expectChildColor(9, 9);
4857 mCapture->checkPixel(10, 10, 255, 255, 255);
4858 }
4859}
Vishnu Nair60356342018-11-13 13:00:45 -08004860class BoundlessLayerTest : public LayerUpdateTest {
4861protected:
4862 std::unique_ptr<ScreenCapture> mCapture;
4863};
4864
4865// Verify setting a size on a buffer layer has no effect.
4866TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4867 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004868 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4869 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004870 ASSERT_TRUE(bufferLayer->isValid());
4871 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4872 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4873 {
4874 mCapture = screenshot();
4875 // Top left of background must now be visible
4876 mCapture->expectBGColor(0, 0);
4877 // Foreground Surface bounds must be color layer
4878 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4879 // Buffer layer should not extend past buffer bounds
4880 mCapture->expectFGColor(95, 95);
4881 }
4882}
4883
4884// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4885// which will crop the color layer.
4886TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4887 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004888 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4889 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004890 ASSERT_TRUE(colorLayer->isValid());
4891 asTransaction([&](Transaction& t) {
4892 t.setColor(colorLayer, half3{0, 0, 0});
4893 t.show(colorLayer);
4894 });
4895 {
4896 mCapture = screenshot();
4897 // Top left of background must now be visible
4898 mCapture->expectBGColor(0, 0);
4899 // Foreground Surface bounds must be color layer
4900 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4901 // Color layer should not extend past foreground bounds
4902 mCapture->expectBGColor(129, 129);
4903 }
4904}
4905
4906// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4907// a crop which will be used to crop the color layer.
4908TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004909 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4910 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004911 ASSERT_TRUE(cropLayer->isValid());
4912 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004913 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4914 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004915 ASSERT_TRUE(colorLayer->isValid());
4916 asTransaction([&](Transaction& t) {
4917 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4918 t.setColor(colorLayer, half3{0, 0, 0});
4919 t.show(cropLayer);
4920 t.show(colorLayer);
4921 });
4922 {
4923 mCapture = screenshot();
4924 // Top left of background must now be visible
4925 mCapture->expectBGColor(0, 0);
4926 // Top left of foreground must now be visible
4927 mCapture->expectFGColor(64, 64);
4928 // 5 pixels from the foreground we should see the child surface
4929 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4930 // 10 pixels from the foreground we should be back to the foreground surface
4931 mCapture->expectFGColor(74, 74);
4932 }
4933}
4934
4935// Verify for boundless layer with no children, their transforms have no effect.
4936TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4937 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004938 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4939 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004940 ASSERT_TRUE(colorLayer->isValid());
4941 asTransaction([&](Transaction& t) {
4942 t.setPosition(colorLayer, 320, 320);
4943 t.setMatrix(colorLayer, 2, 0, 0, 2);
4944 t.setColor(colorLayer, half3{0, 0, 0});
4945 t.show(colorLayer);
4946 });
4947 {
4948 mCapture = screenshot();
4949 // Top left of background must now be visible
4950 mCapture->expectBGColor(0, 0);
4951 // Foreground Surface bounds must be color layer
4952 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4953 // Color layer should not extend past foreground bounds
4954 mCapture->expectBGColor(129, 129);
4955 }
4956}
4957
4958// Verify for boundless layer with children, their transforms have an effect.
4959TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4960 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004961 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4962 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004963 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4964 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004965 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4966 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004967 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4968 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004969 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4970 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004971 ASSERT_TRUE(colorLayer->isValid());
4972 asTransaction([&](Transaction& t) {
4973 t.setPosition(boundlessLayerRightShift, 32, 0);
4974 t.show(boundlessLayerRightShift);
4975 t.setPosition(boundlessLayerDownShift, 0, 32);
4976 t.show(boundlessLayerDownShift);
4977 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4978 t.setColor(colorLayer, half3{0, 0, 0});
4979 t.show(colorLayer);
4980 });
4981 {
4982 mCapture = screenshot();
4983 // Top left of background must now be visible
4984 mCapture->expectBGColor(0, 0);
4985 // Top left of foreground must now be visible
4986 mCapture->expectFGColor(64, 64);
4987 // Foreground Surface bounds must be color layer
4988 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4989 // Color layer should not extend past foreground bounds
4990 mCapture->expectBGColor(129, 129);
4991 }
4992}
4993
4994// Verify child layers do not get clipped if they temporarily move into the negative
4995// coordinate space as the result of an intermediate transformation.
4996TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4997 sp<SurfaceControl> boundlessLayer =
4998 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4999 0 /* flags */, mFGSurfaceControl.get());
5000 ASSERT_TRUE(boundlessLayer != nullptr);
5001 ASSERT_TRUE(boundlessLayer->isValid());
5002 sp<SurfaceControl> colorLayer =
5003 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5004 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5005 ASSERT_TRUE(colorLayer != nullptr);
5006 ASSERT_TRUE(colorLayer->isValid());
5007 asTransaction([&](Transaction& t) {
5008 // shift child layer off bounds. If this layer was not boundless, we will
5009 // expect the child layer to be cropped.
5010 t.setPosition(boundlessLayer, 32, 32);
5011 t.show(boundlessLayer);
5012 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5013 // undo shift by parent
5014 t.setPosition(colorLayer, -32, -32);
5015 t.setColor(colorLayer, half3{0, 0, 0});
5016 t.show(colorLayer);
5017 });
5018 {
5019 mCapture = screenshot();
5020 // Top left of background must now be visible
5021 mCapture->expectBGColor(0, 0);
5022 // Foreground Surface bounds must be color layer
5023 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5024 // Color layer should not extend past foreground bounds
5025 mCapture->expectBGColor(129, 129);
5026 }
5027}
5028
5029// Verify for boundless root layers with children, their transforms have an effect.
5030TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005031 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5032 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005033 ASSERT_TRUE(rootBoundlessLayer->isValid());
5034 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005035 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5036 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5037
Vishnu Nair60356342018-11-13 13:00:45 -08005038 ASSERT_TRUE(colorLayer->isValid());
5039 asTransaction([&](Transaction& t) {
5040 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5041 t.setPosition(rootBoundlessLayer, 32, 32);
5042 t.show(rootBoundlessLayer);
5043 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5044 t.setColor(colorLayer, half3{0, 0, 0});
5045 t.show(colorLayer);
5046 t.hide(mFGSurfaceControl);
5047 });
5048 {
5049 mCapture = screenshot();
5050 // Top left of background must now be visible
5051 mCapture->expectBGColor(0, 0);
5052 // Top left of foreground must now be visible
5053 mCapture->expectBGColor(31, 31);
5054 // Foreground Surface bounds must be color layer
5055 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5056 // Color layer should not extend past foreground bounds
5057 mCapture->expectBGColor(97, 97);
5058 }
5059}
Robert Carr503c7042017-09-27 15:06:08 -07005060
chaviwa76b2712017-09-20 12:02:26 -07005061class ScreenCaptureTest : public LayerUpdateTest {
5062protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005063 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005064};
5065
5066TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5067 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005068 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005069 mCapture->expectBGColor(0, 0);
5070 // Doesn't capture FG layer which is at 64, 64
5071 mCapture->expectBGColor(64, 64);
5072}
5073
5074TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5075 auto fgHandle = mFGSurfaceControl->getHandle();
5076
Vishnu Nair88a11f22018-11-28 18:30:57 -08005077 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5078 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005079 fillSurfaceRGBA8(child, 200, 200, 200);
5080
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005081 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005082
5083 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005084 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005085 mCapture->expectFGColor(10, 10);
5086 mCapture->expectChildColor(0, 0);
5087}
5088
Robert Carr578038f2018-03-09 12:25:24 -08005089TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5090 auto fgHandle = mFGSurfaceControl->getHandle();
5091
Vishnu Nair88a11f22018-11-28 18:30:57 -08005092 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5093 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005094 fillSurfaceRGBA8(child, 200, 200, 200);
5095
5096 SurfaceComposerClient::Transaction().show(child).apply(true);
5097
5098 // Captures mFGSurfaceControl's child
5099 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5100 mCapture->checkPixel(10, 10, 0, 0, 0);
5101 mCapture->expectChildColor(0, 0);
5102}
5103
chaviw50da5042018-04-09 13:49:37 -07005104TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005105 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5106 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005107
5108 fillSurfaceRGBA8(child, 200, 200, 200);
5109
5110 SurfaceComposerClient::Transaction().show(child).apply(true);
5111
5112 auto childHandle = child->getHandle();
5113
5114 // Captures child
5115 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5116 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5117 // Area outside of child's bounds is transparent.
5118 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5119}
5120
chaviw4b129c22018-04-09 16:19:43 -07005121TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5122 auto fgHandle = mFGSurfaceControl->getHandle();
5123
Vishnu Nair88a11f22018-11-28 18:30:57 -08005124 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5125 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5126 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005127 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005128 fillSurfaceRGBA8(child, 200, 200, 200);
5129 fillSurfaceRGBA8(relative, 100, 100, 100);
5130
5131 SurfaceComposerClient::Transaction()
5132 .show(child)
5133 // Set relative layer above fg layer so should be shown above when computing all layers.
5134 .setRelativeLayer(relative, fgHandle, 1)
5135 .show(relative)
5136 .apply(true);
5137
5138 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5139 ScreenCapture::captureLayers(&mCapture, fgHandle);
5140 mCapture->expectFGColor(10, 10);
5141 mCapture->expectChildColor(0, 0);
5142}
5143
5144TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5145 auto fgHandle = mFGSurfaceControl->getHandle();
5146
Vishnu Nair88a11f22018-11-28 18:30:57 -08005147 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5148 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5149 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5150 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005151 fillSurfaceRGBA8(child, 200, 200, 200);
5152 fillSurfaceRGBA8(relative, 100, 100, 100);
5153
5154 SurfaceComposerClient::Transaction()
5155 .show(child)
5156 // Set relative layer below fg layer but relative to child layer so it should be shown
5157 // above child layer.
5158 .setLayer(relative, -1)
5159 .setRelativeLayer(relative, child->getHandle(), 1)
5160 .show(relative)
5161 .apply(true);
5162
5163 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5164 // relative value should be taken into account, placing it above child layer.
5165 ScreenCapture::captureLayers(&mCapture, fgHandle);
5166 mCapture->expectFGColor(10, 10);
5167 // Relative layer is showing on top of child layer
5168 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5169}
Robert Carr578038f2018-03-09 12:25:24 -08005170
5171// In the following tests we verify successful skipping of a parent layer,
5172// so we use the same verification logic and only change how we mutate
5173// the parent layer to verify that various properties are ignored.
5174class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5175public:
5176 void SetUp() override {
5177 LayerUpdateTest::SetUp();
5178
Vishnu Nair88a11f22018-11-28 18:30:57 -08005179 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5180 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005181 fillSurfaceRGBA8(mChild, 200, 200, 200);
5182
5183 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5184 }
5185
Vishnu Nair333a9572019-02-15 16:05:56 -08005186 void verify(std::function<void()> verifyStartingState) {
5187 // Verify starting state before a screenshot is taken.
5188 verifyStartingState();
5189
5190 // Verify child layer does not inherit any of the properties of its
5191 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005192 auto fgHandle = mFGSurfaceControl->getHandle();
5193 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5194 mCapture->checkPixel(10, 10, 0, 0, 0);
5195 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005196
5197 // Verify all assumptions are still true after the screenshot is taken.
5198 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005199 }
5200
5201 std::unique_ptr<ScreenCapture> mCapture;
5202 sp<SurfaceControl> mChild;
5203};
5204
Vishnu Nair333a9572019-02-15 16:05:56 -08005205// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005206TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5207
5208 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5209
5210 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005211
5212 // Before and after reparenting, verify child is properly hidden
5213 // when rendering full-screen.
5214 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005215}
5216
5217TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005218 SurfaceComposerClient::Transaction()
5219 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5220 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005221
5222 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005223
5224 // Before and after reparenting, verify child is cropped by parent.
5225 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005226}
5227
Vishnu Nair333a9572019-02-15 16:05:56 -08005228// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005229TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005230 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005231
5232 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005233
Vishnu Nair333a9572019-02-15 16:05:56 -08005234 // Before and after reparenting, verify child is properly scaled.
5235 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005236}
5237
5238
chaviwa76b2712017-09-20 12:02:26 -07005239TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5240 auto fgHandle = mFGSurfaceControl->getHandle();
5241
Vishnu Nair88a11f22018-11-28 18:30:57 -08005242 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5243 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005244 fillSurfaceRGBA8(child, 200, 200, 200);
5245
Vishnu Nair88a11f22018-11-28 18:30:57 -08005246 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5247 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005248
5249 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5250 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005251 .show(child)
5252 .setPosition(grandchild, 5, 5)
5253 .show(grandchild)
5254 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005255
5256 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005257 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005258 mCapture->expectFGColor(10, 10);
5259 mCapture->expectChildColor(0, 0);
5260 mCapture->checkPixel(5, 5, 50, 50, 50);
5261}
5262
5263TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005264 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5265 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005266 fillSurfaceRGBA8(child, 200, 200, 200);
5267 auto childHandle = child->getHandle();
5268
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005269 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005270
5271 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005272 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005273 mCapture->expectChildColor(0, 0);
5274 mCapture->expectChildColor(9, 9);
5275}
5276
5277TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005278 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5279 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005280 fillSurfaceRGBA8(child, 200, 200, 200);
5281 auto childHandle = child->getHandle();
5282
Vishnu Nair88a11f22018-11-28 18:30:57 -08005283 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5284 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005285 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5286
5287 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005288 .show(child)
5289 .setPosition(grandchild, 5, 5)
5290 .show(grandchild)
5291 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005292
5293 auto grandchildHandle = grandchild->getHandle();
5294
5295 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005296 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005297 mCapture->checkPixel(0, 0, 50, 50, 50);
5298 mCapture->checkPixel(4, 4, 50, 50, 50);
5299}
5300
chaviw7206d492017-11-10 16:16:12 -08005301TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005302 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005303 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5304 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005305
Marissa Wall61c58622018-07-18 10:12:20 -07005306 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5307 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005308
5309 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005310 .setLayer(redLayer, INT32_MAX - 1)
5311 .show(redLayer)
5312 .show(blueLayer)
5313 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005314
5315 auto redLayerHandle = redLayer->getHandle();
5316
5317 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005318 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5319 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5320 // red area below the blue area
5321 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5322 // red area to the right of the blue area
5323 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005324
Marissa Wall861616d2018-10-22 12:52:23 -07005325 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005326 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005327 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5328 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005329 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005330 mCapture->checkPixel(30, 30, 0, 0, 0);
5331}
5332
5333TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005334 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005335 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5336 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005337
Marissa Wall61c58622018-07-18 10:12:20 -07005338 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5339 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005340
5341 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005342 .setLayer(redLayer, INT32_MAX - 1)
5343 .show(redLayer)
5344 .show(blueLayer)
5345 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005346
5347 auto redLayerHandle = redLayer->getHandle();
5348
5349 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005350 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5351 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5352 // red area below the blue area
5353 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5354 // red area to the right of the blue area
5355 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005356
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005357 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005358 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005359 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5360 // red area below the blue area
5361 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5362 // red area to the right of the blue area
5363 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005364 mCapture->checkPixel(30, 30, 0, 0, 0);
5365}
5366
5367TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005368 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005369
Marissa Wall61c58622018-07-18 10:12:20 -07005370 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005371
5372 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005373 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005374 SurfaceComposerClient::Transaction().apply(true);
5375
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005376 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005377
5378 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005379 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5380 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005381}
5382
chaviw8e3fe5d2018-02-22 10:55:42 -08005383
5384class DereferenceSurfaceControlTest : public LayerTransactionTest {
5385protected:
5386 void SetUp() override {
5387 LayerTransactionTest::SetUp();
5388 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005389 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005390 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005391 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005392 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5393 {
5394 SCOPED_TRACE("before anything");
5395 auto shot = screenshot();
5396 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5397 }
5398 }
5399 void TearDown() override {
5400 LayerTransactionTest::TearDown();
5401 bgLayer = 0;
5402 fgLayer = 0;
5403 }
5404
5405 sp<SurfaceControl> bgLayer;
5406 sp<SurfaceControl> fgLayer;
5407};
5408
5409TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5410 fgLayer = nullptr;
5411 {
5412 SCOPED_TRACE("after setting null");
5413 auto shot = screenshot();
5414 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5415 }
5416}
5417
5418TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5419 auto transaction = Transaction().show(fgLayer);
5420 fgLayer = nullptr;
5421 {
5422 SCOPED_TRACE("after setting null");
5423 auto shot = screenshot();
5424 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5425 }
5426}
5427
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005428class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5429protected:
5430 virtual void SetUp() {
5431 LayerTransactionTest::SetUp();
5432 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5433
5434 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5435 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5436
5437 sp<IGraphicBufferConsumer> consumer;
5438 BufferQueue::createBufferQueue(&mProducer, &consumer);
5439 consumer->setConsumerName(String8("Virtual disp consumer"));
5440 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5441 }
5442
5443 virtual void TearDown() {
5444 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5445 LayerTransactionTest::TearDown();
5446 mColorLayer = 0;
5447 }
5448
5449 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5450 mVirtualDisplay =
5451 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5452 asTransaction([&](Transaction& t) {
5453 t.setDisplaySurface(mVirtualDisplay, mProducer);
5454 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5455 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5456 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5457 });
5458 }
5459
5460 void createColorLayer(uint32_t layerStack) {
5461 mColorLayer =
5462 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5463 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5464 ASSERT_TRUE(mColorLayer != nullptr);
5465 ASSERT_TRUE(mColorLayer->isValid());
5466 asTransaction([&](Transaction& t) {
5467 t.setLayerStack(mColorLayer, layerStack);
5468 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5469 t.setLayer(mColorLayer, INT32_MAX - 2);
5470 t.setColor(mColorLayer,
5471 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5472 mExpectedColor.b / 255.0f});
5473 t.show(mColorLayer);
5474 });
5475 }
5476
5477 DisplayInfo mMainDisplayInfo;
5478 sp<IBinder> mMainDisplay;
5479 sp<IBinder> mVirtualDisplay;
5480 sp<IGraphicBufferProducer> mProducer;
5481 sp<SurfaceControl> mColorLayer;
5482 Color mExpectedColor = {63, 63, 195, 255};
5483};
5484
5485TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5486 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5487 createColorLayer(1 /* layerStack */);
5488
5489 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5490
5491 // Verify color layer does not render on main display.
5492 std::unique_ptr<ScreenCapture> sc;
5493 ScreenCapture::captureScreen(&sc, mMainDisplay);
5494 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5495 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5496
5497 // Verify color layer renders correctly on virtual display.
5498 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5499 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5500 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5501}
5502
5503TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5504 // Create a display and set its layer stack to the main display's layer stack so
5505 // the contents of the main display are mirrored on to the virtual display.
5506
5507 // Assumption here is that the new mirrored display has the same viewport as the
5508 // primary display that it is mirroring.
5509 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5510 createColorLayer(0 /* layerStack */);
5511
5512 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5513
5514 // Verify color layer renders correctly on main display and it is mirrored on the
5515 // virtual display.
5516 std::unique_ptr<ScreenCapture> sc;
5517 ScreenCapture::captureScreen(&sc, mMainDisplay);
5518 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5519 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5520
5521 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5522 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5523 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5524}
5525
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005526class DisplayActiveConfigTest : public ::testing::Test {
5527protected:
5528 void SetUp() override {
5529 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5530 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5531 EXPECT_GT(mDisplayconfigs.size(), 0);
5532
5533 // set display power to on to make sure config can be changed
5534 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5535 }
5536
5537 sp<IBinder> mDisplayToken;
5538 Vector<DisplayInfo> mDisplayconfigs;
5539};
5540
5541TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5542 std::vector<int32_t> allowedConfigs;
5543
5544 // Add all configs to the allowed configs
5545 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5546 allowedConfigs.push_back(i);
5547 }
5548
5549 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5550 EXPECT_EQ(res, NO_ERROR);
5551
5552 std::vector<int32_t> outConfigs;
5553 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5554 EXPECT_EQ(res, NO_ERROR);
5555 EXPECT_EQ(allowedConfigs, outConfigs);
5556}
5557
5558TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5559 // we need at least 2 configs available for this test
5560 if (mDisplayconfigs.size() <= 1) return;
5561
5562 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5563
5564 // We want to set the allowed config to everything but the active config
5565 std::vector<int32_t> allowedConfigs;
5566 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5567 if (i != activeConfig) {
5568 allowedConfigs.push_back(i);
5569 }
5570 }
5571
5572 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5573 EXPECT_EQ(res, NO_ERROR);
5574
5575 // Allow some time for the config change
5576 std::this_thread::sleep_for(200ms);
5577
5578 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5579 EXPECT_NE(activeConfig, newActiveConfig);
5580
5581 // Make sure the new config is part of allowed config
5582 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5583 allowedConfigs.end());
5584}
5585
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005586} // namespace android