blob: f83b3eafe67c9775fb6da8230801f2dc8c93d62c [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
Robert Carr866455f2019-04-02 16:28:26 -0700234 static void captureChildLayersExcluding(
235 std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
236 std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>> excludeLayers) {
237 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
238 SurfaceComposerClient::Transaction().apply(true);
239
240 sp<GraphicBuffer> outBuffer;
241 ASSERT_EQ(NO_ERROR,
242 sf->captureLayers(parentHandle, &outBuffer, ui::Dataspace::V0_SRGB,
243 ui::PixelFormat::RGBA_8888, Rect::EMPTY_RECT, excludeLayers,
244 1.0f, true));
245 *sc = std::make_unique<ScreenCapture>(outBuffer);
246 }
247
Chia-I Wu718daf82017-10-20 11:57:17 -0700248 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000249 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
250 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700251 }
252
253 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000254 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700255 const bool leftBorder = rect.left > 0;
256 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000257 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
258 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700259
260 if (topBorder) {
261 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
262 if (leftBorder) {
263 top.left -= 1;
264 }
265 if (rightBorder) {
266 top.right += 1;
267 }
268 expectColor(top, color, tolerance);
269 }
270 if (leftBorder) {
271 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
272 expectColor(left, color, tolerance);
273 }
274 if (rightBorder) {
275 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
276 expectColor(right, color, tolerance);
277 }
278 if (bottomBorder) {
279 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
280 if (leftBorder) {
281 bottom.left -= 1;
282 }
283 if (rightBorder) {
284 bottom.right += 1;
285 }
286 expectColor(bottom, color, tolerance);
287 }
288 }
289
Chia-I Wu93853fe2017-11-02 08:30:27 -0700290 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
291 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
292 uint8_t tolerance = 0) {
293 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
294
295 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
296 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
297 // avoid checking borders due to unspecified filtering behavior
298 const int32_t offsetX = filtered ? 2 : 0;
299 const int32_t offsetY = filtered ? 2 : 0;
300 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
301 tolerance);
302 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
303 tolerance);
304 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
305 tolerance);
306 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
307 bottomRight, tolerance);
308 }
309
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700310 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000311 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
312 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700313 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
314 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700315 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
316 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700317 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700318 }
319 }
320
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700321 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700322
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700323 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700324
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700325 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700326
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800327 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000328 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700329 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700330
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000331 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700332
333private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000334 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800335 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700336};
337
Chia-I Wu718daf82017-10-20 11:57:17 -0700338class LayerTransactionTest : public ::testing::Test {
339protected:
340 void SetUp() override {
341 mClient = new SurfaceComposerClient;
342 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
343
344 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700345
346 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700347 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700348 }
349
chaviw0e3479f2018-09-10 16:49:30 -0700350 virtual void TearDown() {
351 mBlackBgSurface = 0;
352 mClient->dispose();
353 mClient = 0;
354 }
355
Marissa Wallfda30bb2018-10-12 11:34:28 -0700356 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
357 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800358 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
359 auto layer =
360 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700361
Vishnu Nair60356342018-11-13 13:00:45 -0800362 Transaction t;
363 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800364
365 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700366 if (error != NO_ERROR) {
367 ADD_FAILURE() << "failed to initialize SurfaceControl";
368 layer.clear();
369 }
370
371 return layer;
372 }
373
Vishnu Nair88a11f22018-11-28 18:30:57 -0800374 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
375 const char* name, uint32_t width, uint32_t height,
376 PixelFormat format, uint32_t flags,
377 SurfaceControl* parent = nullptr) {
378 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
379 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
380 return layer;
381 }
382
Marissa Wallfda30bb2018-10-12 11:34:28 -0700383 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800384 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
385 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700386 }
387
Vishnu Nairda9c85a2019-06-03 17:26:48 -0700388 sp<SurfaceControl> createColorLayer(const char* name, const Color& color,
389 SurfaceControl* parent = nullptr) {
390 auto colorLayer = createSurface(mClient, name, 0 /* buffer width */, 0 /* buffer height */,
391 PIXEL_FORMAT_RGBA_8888,
392 ISurfaceComposerClient::eFXSurfaceColor, parent);
393 asTransaction([&](Transaction& t) {
394 t.setColor(colorLayer, half3{color.r / 255.0f, color.g / 255.0f, color.b / 255.0f});
395 t.setAlpha(colorLayer, color.a / 255.0f);
396 });
397 return colorLayer;
398 }
399
Marissa Wall61c58622018-07-18 10:12:20 -0700400 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700401 // wait for previous transactions (such as setSize) to complete
402 Transaction().apply(true);
403
404 ANativeWindow_Buffer buffer = {};
405 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
406
407 return buffer;
408 }
409
Marissa Wall61c58622018-07-18 10:12:20 -0700410 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700411 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
412
413 // wait for the newly posted buffer to be latched
414 waitForLayerBuffers();
415 }
416
Marissa Wall61c58622018-07-18 10:12:20 -0700417 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
418 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700419 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700420 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
421 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
422 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700423 }
424
Marissa Wall61c58622018-07-18 10:12:20 -0700425 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
426 int32_t bufferWidth, int32_t bufferHeight) {
427 sp<GraphicBuffer> buffer =
428 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
429 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
430 BufferUsage::COMPOSER_OVERLAY,
431 "test");
432 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700433 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700434 }
435
436 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
437 int32_t bufferWidth, int32_t bufferHeight) {
438 switch (mLayerType) {
439 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
440 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
441 break;
442 case ISurfaceComposerClient::eFXSurfaceBufferState:
443 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
444 break;
445 default:
446 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
447 }
448 }
449
450 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
451 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700452 const Color& topRight, const Color& bottomLeft,
453 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700454 switch (mLayerType) {
455 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
456 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
457 bottomLeft, bottomRight);
458 break;
459 case ISurfaceComposerClient::eFXSurfaceBufferState:
460 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
461 bottomLeft, bottomRight);
462 break;
463 default:
464 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
465 }
466 }
467
468 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
469 int32_t bufferHeight, const Color& topLeft,
470 const Color& topRight, const Color& bottomLeft,
471 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700472 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700473 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
474 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700475
Marissa Wall61c58622018-07-18 10:12:20 -0700476 const int32_t halfW = bufferWidth / 2;
477 const int32_t halfH = bufferHeight / 2;
478 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
479 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
480 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
481 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
482 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700483
Marissa Wall61c58622018-07-18 10:12:20 -0700484 postBufferQueueLayerBuffer(layer);
485 }
486
487 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
488 int32_t bufferHeight, const Color& topLeft,
489 const Color& topRight, const Color& bottomLeft,
490 const Color& bottomRight) {
491 sp<GraphicBuffer> buffer =
492 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
493 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
494 BufferUsage::COMPOSER_OVERLAY,
495 "test");
496
497 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
498
499 const int32_t halfW = bufferWidth / 2;
500 const int32_t halfH = bufferHeight / 2;
501 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
502 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
503 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
504 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
505
506 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700507 }
508
chaviw0e3479f2018-09-10 16:49:30 -0700509 std::unique_ptr<ScreenCapture> screenshot() {
510 std::unique_ptr<ScreenCapture> screenshot;
511 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700512 return screenshot;
513 }
514
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800515 void asTransaction(const std::function<void(Transaction&)>& exec) {
516 Transaction t;
517 exec(t);
518 t.apply(true);
519 }
520
Marissa Wall713b63f2018-10-17 15:42:43 -0700521 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
522 static BufferGenerator bufferGenerator;
523 return bufferGenerator.get(outBuffer, outFence);
524 }
525
Chia-I Wu718daf82017-10-20 11:57:17 -0700526 sp<SurfaceComposerClient> mClient;
527
528 sp<IBinder> mDisplay;
529 uint32_t mDisplayWidth;
530 uint32_t mDisplayHeight;
531 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700532 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700533
534 // leave room for ~256 layers
535 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
536
chaviw0e3479f2018-09-10 16:49:30 -0700537 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700538 bool mColorManagementUsed;
539
Chia-I Wu718daf82017-10-20 11:57:17 -0700540private:
541 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800542 mDisplay = mClient->getInternalDisplayToken();
543 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700544
545 // get display width/height
546 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800547 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700548 mDisplayWidth = info.w;
549 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700550 mDisplayRect =
551 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700552
553 // After a new buffer is queued, SurfaceFlinger is notified and will
554 // latch the new buffer on next vsync. Let's heuristically wait for 3
555 // vsyncs.
556 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
557
558 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700559
Vishnu Nair88a11f22018-11-28 18:30:57 -0800560 mBlackBgSurface =
561 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
562 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700563
Chia-I Wu718daf82017-10-20 11:57:17 -0700564 // set layer stack (b/68888219)
565 Transaction t;
566 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800567 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700568 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
569 t.setColor(mBlackBgSurface, half3{0, 0, 0});
570 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700571 t.apply();
572 }
573
chaviw0e3479f2018-09-10 16:49:30 -0700574 void waitForLayerBuffers() {
575 // Request an empty transaction to get applied synchronously to ensure the buffer is
576 // latched.
577 Transaction().apply(true);
578 usleep(mBufferPostDelay);
579 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700580
581 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800582
583 friend class LayerRenderPathTestHarness;
584};
585enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
586
587class LayerRenderPathTestHarness {
588public:
589 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
590 : mDelegate(delegate), mRenderPath(renderPath) {}
591
592 std::unique_ptr<ScreenCapture> getScreenCapture() {
593 switch (mRenderPath) {
594 case RenderPath::SCREENSHOT:
595 return mDelegate->screenshot();
596 case RenderPath::VIRTUAL_DISPLAY:
597
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800598 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800599 DisplayInfo mainDisplayInfo;
600 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
601
602 sp<IBinder> vDisplay;
603 sp<IGraphicBufferProducer> producer;
604 sp<IGraphicBufferConsumer> consumer;
605 sp<BufferItemConsumer> itemConsumer;
606 BufferQueue::createBufferQueue(&producer, &consumer);
607
608 consumer->setConsumerName(String8("Virtual disp consumer"));
609 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
610
611 itemConsumer = new BufferItemConsumer(consumer,
612 // Sample usage bits from screenrecord
613 GRALLOC_USAGE_HW_VIDEO_ENCODER |
614 GRALLOC_USAGE_SW_READ_OFTEN);
615
616 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
617 false /*secure*/);
618
619 SurfaceComposerClient::Transaction t;
620 t.setDisplaySurface(vDisplay, producer);
621 t.setDisplayLayerStack(vDisplay, 0);
622 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
623 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
624 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
625 t.apply();
626 SurfaceComposerClient::Transaction().apply(true);
627 BufferItem item;
628 itemConsumer->acquireBuffer(&item, 0, true);
629 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
630 itemConsumer->releaseBuffer(item);
631 SurfaceComposerClient::destroyDisplay(vDisplay);
632 return sc;
633 }
634 }
635
636protected:
637 LayerTransactionTest* mDelegate;
638 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700639};
640
Alec Mouri80863a62019-01-17 15:19:35 -0800641class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700642public:
Alec Mouri80863a62019-01-17 15:19:35 -0800643 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700644
645 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800646 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700647 // if the flags already have a layer type specified, return an error
648 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
649 return nullptr;
650 }
chaviwf66724d2018-11-28 16:35:21 -0800651 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700652 }
653
654 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
655 int32_t bufferHeight) {
656 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
657 bufferWidth, bufferHeight));
658 }
659
660 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
661 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
662 const Color& bottomLeft, const Color& bottomRight) {
663 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
664 bufferWidth, bufferHeight,
665 topLeft, topRight,
666 bottomLeft, bottomRight));
667 }
668
669protected:
670 uint32_t mLayerType;
671};
672
Alec Mouri80863a62019-01-17 15:19:35 -0800673class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
674 public ::testing::WithParamInterface<uint32_t> {
675public:
676 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
677};
678
679class LayerTypeAndRenderTypeTransactionTest
680 : public LayerTypeTransactionHarness,
681 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
682public:
683 LayerTypeAndRenderTypeTransactionTest()
684 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
685 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
686
687 std::unique_ptr<ScreenCapture> getScreenCapture() {
688 return mRenderPathHarness.getScreenCapture();
689 }
690
691protected:
692 LayerRenderPathTestHarness mRenderPathHarness;
693};
694
695// Environment for starting up binder threads. This is required for testing
696// virtual displays, as BufferQueue parameters may be queried over binder.
697class BinderEnvironment : public ::testing::Environment {
698public:
699 void SetUp() override { ProcessState::self()->startThreadPool(); }
700};
701
702::testing::Environment* const binderEnv =
703 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
704
705class LayerRenderTypeTransactionTest : public LayerTransactionTest,
706 public ::testing::WithParamInterface<RenderPath> {
707public:
708 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
709
710 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
711 void setRelativeZBasicHelper(uint32_t layerType);
712 void setRelativeZGroupHelper(uint32_t layerType);
713 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800714 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
715 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800716
717protected:
718 LayerRenderPathTestHarness mHarness;
719};
720
721INSTANTIATE_TEST_CASE_P(
722 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
723 ::testing::Combine(
724 ::testing::Values(
725 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
726 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
727 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
728
729INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
730 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
731
Marissa Wall61c58622018-07-18 10:12:20 -0700732INSTANTIATE_TEST_CASE_P(
733 LayerTypeTransactionTests, LayerTypeTransactionTest,
734 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
735 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
736
Alec Mouri80863a62019-01-17 15:19:35 -0800737TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700738 sp<SurfaceControl> layer;
739 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700740 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700741
742 {
743 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700744 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800745 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700746 shot->expectColor(rect, Color::RED);
747 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700748 }
749
750 Transaction().setPosition(layer, 5, 10).apply();
751 {
752 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700753 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800754 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700755 shot->expectColor(rect, Color::RED);
756 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700757 }
758}
759
Alec Mouri80863a62019-01-17 15:19:35 -0800760TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 sp<SurfaceControl> layer;
762 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700763 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700764
765 // GLES requires only 4 bits of subpixel precision during rasterization
766 // XXX GLES composition does not match HWC composition due to precision
767 // loss (b/69315223)
768 const float epsilon = 1.0f / 16.0f;
769 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
770 {
771 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800772 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700773 }
774
775 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
776 {
777 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800778 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700779 }
780}
781
Alec Mouri80863a62019-01-17 15:19:35 -0800782TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700783 sp<SurfaceControl> layer;
784 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700785 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700786
787 Transaction().setPosition(layer, -32, -32).apply();
788 {
789 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800790 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700791 }
792
793 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
794 {
795 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800796 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700797 }
798}
799
Alec Mouri80863a62019-01-17 15:19:35 -0800800TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700801 sp<SurfaceControl> layer;
802 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700803 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700804
805 // partially out of bounds
806 Transaction().setPosition(layer, -30, -30).apply();
807 {
808 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800809 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700810 }
811
812 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
813 {
814 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800815 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
816 mDisplayHeight),
817 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700818 }
819}
820
Alec Mouri80863a62019-01-17 15:19:35 -0800821TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700822 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700823 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
824 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700825
826 // setPosition is applied immediately by default, with or without resize
827 // pending
828 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
829 {
830 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800831 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700832 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700833 shot->expectColor(rect, Color::RED);
834 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700835 }
836
Marissa Wall861616d2018-10-22 12:52:23 -0700837 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700838 {
839 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800840 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700841 }
842}
843
Alec Mouri80863a62019-01-17 15:19:35 -0800844TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700845 sp<SurfaceControl> layer;
846 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700847 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700848
849 // request setPosition to be applied with the next resize
850 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
851 {
852 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800853 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700854 }
855
856 Transaction().setPosition(layer, 15, 20).apply();
857 {
858 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800859 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700860 }
861
862 Transaction().setSize(layer, 64, 64).apply();
863 {
864 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800865 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700866 }
867
868 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700869 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700870 {
871 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800872 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700873 }
874}
875
Alec Mouri80863a62019-01-17 15:19:35 -0800876TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700877 sp<SurfaceControl> layer;
878 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700879 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700880
881 // setPosition is not immediate even with SCALE_TO_WINDOW override
882 Transaction()
883 .setPosition(layer, 5, 10)
884 .setSize(layer, 64, 64)
885 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
886 .setGeometryAppliesWithResize(layer)
887 .apply();
888 {
889 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800890 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700891 }
892
Marissa Wall61c58622018-07-18 10:12:20 -0700893 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700894 {
895 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800896 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700897 }
898}
899
Alec Mouri80863a62019-01-17 15:19:35 -0800900TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700901 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700902 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
903 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700904
905 Transaction().setSize(layer, 64, 64).apply();
906 {
907 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800908 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700909 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700910 shot->expectColor(rect, Color::RED);
911 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700912 }
913
Marissa Wall861616d2018-10-22 12:52:23 -0700914 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700915 {
916 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800917 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700918 const Rect rect(0, 0, 64, 64);
919 shot->expectColor(rect, Color::RED);
920 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700921 }
922}
923
Alec Mouri80863a62019-01-17 15:19:35 -0800924TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700925 // cannot test robustness against invalid sizes (zero or really huge)
926}
927
Alec Mouri80863a62019-01-17 15:19:35 -0800928TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700929 sp<SurfaceControl> layer;
930 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700931 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700932
933 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
934 Transaction()
935 .setSize(layer, 64, 64)
936 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
937 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800938 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700939}
940
Alec Mouri80863a62019-01-17 15:19:35 -0800941TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700942 sp<SurfaceControl> layerR;
943 sp<SurfaceControl> layerG;
944 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700945 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700946 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700947 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700948
949 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
950 {
951 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800952 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700953 }
954
955 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
956 {
957 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800958 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700959 }
960}
961
Alec Mouri80863a62019-01-17 15:19:35 -0800962TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700963 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800964 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700965 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800966 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700967 sp<SurfaceControl> layerR;
968 sp<SurfaceControl> layerG;
969 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700970 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700971 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700972 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700973
chaviw0e3479f2018-09-10 16:49:30 -0700974 Transaction()
975 .reparent(layerR, parent->getHandle())
976 .reparent(layerG, parent->getHandle())
977 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700978 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
979 {
980 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800981 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700982 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700983 }
984
985 Transaction().setLayer(layerR, -3).apply();
986 {
987 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800988 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700989 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700990 }
991}
992
Alec Mouri80863a62019-01-17 15:19:35 -0800993void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700994 sp<SurfaceControl> layerR;
995 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700996 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
997 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
998 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
999 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001000
Marissa Wall861616d2018-10-22 12:52:23 -07001001 switch (layerType) {
1002 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1003 Transaction()
1004 .setPosition(layerG, 16, 16)
1005 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1006 .apply();
1007 break;
1008 case ISurfaceComposerClient::eFXSurfaceBufferState:
1009 Transaction()
1010 .setFrame(layerR, Rect(0, 0, 32, 32))
1011 .setFrame(layerG, Rect(16, 16, 48, 48))
1012 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1013 .apply();
1014 break;
1015 default:
1016 ASSERT_FALSE(true) << "Unsupported layer type";
1017 }
Chia-I Wu49313302017-10-31 10:14:40 -07001018 {
1019 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -08001020 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001021 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1022 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
1023 }
1024
1025 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1026 {
1027 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001028 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001029 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1030 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1031 }
1032}
1033
Alec Mouri80863a62019-01-17 15:19:35 -08001034TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001035 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1036}
1037
Alec Mouri80863a62019-01-17 15:19:35 -08001038TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001039 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1040}
1041
Marissa Wall61c58622018-07-18 10:12:20 -07001042TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001043 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001044 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001045 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001046 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001047 sp<SurfaceControl> layerR;
1048 sp<SurfaceControl> layerG;
1049 sp<SurfaceControl> layerB;
1050 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001051 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001052 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001053 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001054 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001055 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001056
chaviw0e3479f2018-09-10 16:49:30 -07001057 Transaction()
1058 .reparent(layerB, parent->getHandle())
1059 .apply();
1060
Chia-I Wuec2d9852017-11-21 09:21:01 -08001061 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1062 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1063
chaviw0e3479f2018-09-10 16:49:30 -07001064 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001065 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001066 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001067 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001068 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1069}
1070
chaviw32377582019-05-13 11:15:19 -07001071TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) {
1072 sp<SurfaceControl> parent =
1073 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1074 ISurfaceComposerClient::eFXSurfaceColor);
1075
1076 sp<SurfaceControl> childLayer;
1077 ASSERT_NO_FATAL_FAILURE(
1078 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1079 0 /* buffer height */,
1080 ISurfaceComposerClient::eFXSurfaceColor,
1081 parent.get()));
1082 Transaction()
1083 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1084 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1085 .show(childLayer)
1086 .show(parent)
1087 .setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight))
1088 .setCrop_legacy(childLayer, Rect(0, 0, 20, 30))
1089 .apply();
1090
1091 Transaction()
1092 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1093 .setLayer(childLayer, 1)
1094 .apply();
1095
1096 {
1097 SCOPED_TRACE("setLayer above");
1098 // Set layer should get applied and place the child above.
1099 std::unique_ptr<ScreenCapture> screenshot;
1100 ScreenCapture::captureScreen(&screenshot);
1101 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1102 }
1103
1104 Transaction()
1105 .setLayer(childLayer, 1)
1106 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1107 .apply();
1108
1109 {
1110 SCOPED_TRACE("setRelative below");
1111 // Set relative layer should get applied and place the child below.
1112 std::unique_ptr<ScreenCapture> screenshot;
1113 ScreenCapture::captureScreen(&screenshot);
1114 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1115 }
1116}
1117
Alec Mouri80863a62019-01-17 15:19:35 -08001118void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001119 sp<SurfaceControl> layerR;
1120 sp<SurfaceControl> layerG;
1121 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001122 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1123 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1124 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1125 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1126 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1127 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001128
1129 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001130 switch (layerType) {
1131 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1132 Transaction()
1133 .setPosition(layerG, 8, 8)
1134 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1135 .setPosition(layerB, 16, 16)
1136 .setLayer(layerB, mLayerZBase + 2)
1137 .apply();
1138 break;
1139 case ISurfaceComposerClient::eFXSurfaceBufferState:
1140 Transaction()
1141 .setFrame(layerR, Rect(0, 0, 32, 32))
1142 .setFrame(layerG, Rect(8, 8, 40, 40))
1143 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1144 .setFrame(layerB, Rect(16, 16, 48, 48))
1145 .setLayer(layerB, mLayerZBase + 2)
1146 .apply();
1147 break;
1148 default:
1149 ASSERT_FALSE(true) << "Unsupported layer type";
1150 }
1151
Chia-I Wu49313302017-10-31 10:14:40 -07001152 {
1153 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001154 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001155 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1156 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1157 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1158 }
1159
1160 // layerR = 4, layerG = layerR + 3, layerB = 2
1161 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1162 {
1163 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001164 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001165 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1166 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1167 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1168 }
1169
1170 // layerR = 4, layerG = layerR - 3, layerB = 2
1171 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1172 {
1173 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001174 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001175 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1176 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1177 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1178 }
1179
1180 // restore to absolute z
1181 // layerR = 4, layerG = 0, layerB = 2
1182 Transaction().setLayer(layerG, mLayerZBase).apply();
1183 {
1184 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001185 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001186 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1187 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1188 }
1189
1190 // layerR should not affect layerG anymore
1191 // layerR = 1, layerG = 0, layerB = 2
1192 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1193 {
1194 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001195 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001196 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1197 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1198 }
1199}
1200
Alec Mouri80863a62019-01-17 15:19:35 -08001201TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001202 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1203}
1204
Alec Mouri80863a62019-01-17 15:19:35 -08001205TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001206 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1207}
1208
Alec Mouri80863a62019-01-17 15:19:35 -08001209TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001210 sp<SurfaceControl> layerR;
1211 sp<SurfaceControl> layerG;
1212
1213 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001214 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001215 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001216 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001217
1218 Transaction()
1219 .setPosition(layerG, 16, 16)
1220 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1221 .apply();
1222
Robert Carr87246532019-02-04 15:20:26 -08001223 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001224 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001225 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001226}
1227
Alec Mouri80863a62019-01-17 15:19:35 -08001228TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001229 sp<SurfaceControl> layer;
1230 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001231 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001232
1233 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1234 {
1235 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001236 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001237 }
1238
1239 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1240 {
1241 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001242 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001243 }
1244}
1245
Alec Mouri80863a62019-01-17 15:19:35 -08001246TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001247 const Color translucentRed = {100, 0, 0, 100};
1248 sp<SurfaceControl> layerR;
1249 sp<SurfaceControl> layerG;
1250 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001251 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001252 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001253 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001254
1255 Transaction()
1256 .setLayer(layerR, mLayerZBase + 1)
1257 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1258 .apply();
1259 {
1260 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001261 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001262 }
1263
1264 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1265 {
1266 SCOPED_TRACE("layerR translucent");
1267 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001268 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001269 }
1270}
1271
Marissa Wall61c58622018-07-18 10:12:20 -07001272TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001273 sp<SurfaceControl> layer;
1274 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001275 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001276
1277 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001278 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001279 Transaction()
1280 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1281 .apply(true);
1282 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001283 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001284
1285 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1286 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001287 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001288}
1289
Robert Carrfa8855f2019-02-19 10:05:00 -08001290/** RAII Wrapper around get/seteuid */
1291class UIDFaker {
1292 uid_t oldId;
1293public:
1294 UIDFaker(uid_t uid) {
1295 oldId = geteuid();
1296 seteuid(uid);
1297 }
1298 ~UIDFaker() {
1299 seteuid(oldId);
1300 }
1301};
1302
1303TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1304 sp<SurfaceControl> layer;
1305 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1306 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1307
1308 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1309 sp<GraphicBuffer> outBuffer;
1310 Transaction()
1311 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1312 .apply(true);
1313 ASSERT_EQ(PERMISSION_DENIED,
1314 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1315
1316 UIDFaker f(AID_SYSTEM);
1317
1318 // By default the system can capture screenshots with secure layers but they
1319 // will be blacked out
1320 ASSERT_EQ(NO_ERROR,
1321 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1322
1323 {
1324 SCOPED_TRACE("as system");
1325 auto shot = screenshot();
1326 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1327 }
1328
1329 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1330 // to receive them...we are expected to take care with the results.
Robert Carr108b2c72019-04-02 16:32:58 -07001331 bool outCapturedSecureLayers;
Robert Carrfa8855f2019-02-19 10:05:00 -08001332 ASSERT_EQ(NO_ERROR,
Robert Carr108b2c72019-04-02 16:32:58 -07001333 composer->captureScreen(mDisplay, &outBuffer, outCapturedSecureLayers,
1334 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, Rect(), 0,
1335 0, false, ISurfaceComposer::eRotateNone, true));
1336 ASSERT_EQ(true, outCapturedSecureLayers);
Robert Carrfa8855f2019-02-19 10:05:00 -08001337 ScreenCapture sc(outBuffer);
1338 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1339}
1340
Alec Mouri80863a62019-01-17 15:19:35 -08001341TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001342 const Rect top(0, 0, 32, 16);
1343 const Rect bottom(0, 16, 32, 32);
1344 sp<SurfaceControl> layer;
1345 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1346
1347 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001348 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1349 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1350 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001351 // setTransparentRegionHint always applies to the following buffer
1352 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001353 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001354 {
1355 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001356 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001357 shot->expectColor(top, Color::BLACK);
1358 shot->expectColor(bottom, Color::RED);
1359 }
1360
1361 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1362 {
1363 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001364 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001365 shot->expectColor(top, Color::BLACK);
1366 shot->expectColor(bottom, Color::RED);
1367 }
1368
Marissa Wall61c58622018-07-18 10:12:20 -07001369 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1370 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1371 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1372 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001373 {
1374 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001375 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001376 shot->expectColor(top, Color::RED);
1377 shot->expectColor(bottom, Color::BLACK);
1378 }
1379}
1380
Alec Mouri80863a62019-01-17 15:19:35 -08001381TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001382 const Rect top(0, 0, 32, 16);
1383 const Rect bottom(0, 16, 32, 32);
1384 sp<SurfaceControl> layer;
1385 ASSERT_NO_FATAL_FAILURE(
1386 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1387
1388 sp<GraphicBuffer> buffer =
1389 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1390 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1391 BufferUsage::COMPOSER_OVERLAY,
1392 "test");
1393
1394 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1395 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1396 Transaction()
1397 .setTransparentRegionHint(layer, Region(top))
1398 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001399 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001400 .apply();
1401 {
1402 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001403 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001404 shot->expectColor(top, Color::BLACK);
1405 shot->expectColor(bottom, Color::RED);
1406 }
1407
1408 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1409 {
1410 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001411 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001412 shot->expectColor(top, Color::BLACK);
1413 shot->expectColor(bottom, Color::BLACK);
1414 }
1415
1416 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1417 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1418 BufferUsage::COMPOSER_OVERLAY,
1419 "test");
1420
1421 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1422 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001423 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001424 {
1425 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001426 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001427 shot->expectColor(top, Color::RED);
1428 shot->expectColor(bottom, Color::BLACK);
1429 }
1430}
1431
Alec Mouri80863a62019-01-17 15:19:35 -08001432TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001433 sp<SurfaceControl> layerTransparent;
1434 sp<SurfaceControl> layerR;
1435 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1436 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1437
1438 // check that transparent region hint is bound by the layer size
1439 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001440 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001441 .setPosition(layerR, 16, 16)
1442 .setLayer(layerR, mLayerZBase + 1)
1443 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001444 ASSERT_NO_FATAL_FAILURE(
1445 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1446 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001447 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001448}
1449
Alec Mouri80863a62019-01-17 15:19:35 -08001450TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001451 sp<SurfaceControl> layerTransparent;
1452 sp<SurfaceControl> layerR;
1453 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1454 ASSERT_NO_FATAL_FAILURE(
1455 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1456
1457 // check that transparent region hint is bound by the layer size
1458 Transaction()
1459 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1460 .setFrame(layerR, Rect(16, 16, 48, 48))
1461 .setLayer(layerR, mLayerZBase + 1)
1462 .apply();
1463 ASSERT_NO_FATAL_FAILURE(
1464 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1465 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001466 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001467}
1468
Alec Mouri80863a62019-01-17 15:19:35 -08001469void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001470 sp<SurfaceControl> layer1;
1471 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001472 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1473 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1474 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1475 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001476
Marissa Wall861616d2018-10-22 12:52:23 -07001477 switch (layerType) {
1478 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1479 Transaction()
1480 .setAlpha(layer1, 0.25f)
1481 .setAlpha(layer2, 0.75f)
1482 .setPosition(layer2, 16, 0)
1483 .setLayer(layer2, mLayerZBase + 1)
1484 .apply();
1485 break;
1486 case ISurfaceComposerClient::eFXSurfaceBufferState:
1487 Transaction()
1488 .setAlpha(layer1, 0.25f)
1489 .setAlpha(layer2, 0.75f)
1490 .setFrame(layer1, Rect(0, 0, 32, 32))
1491 .setFrame(layer2, Rect(16, 0, 48, 32))
1492 .setLayer(layer2, mLayerZBase + 1)
1493 .apply();
1494 break;
1495 default:
1496 ASSERT_FALSE(true) << "Unsupported layer type";
1497 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001498 {
Alec Mouri80863a62019-01-17 15:19:35 -08001499 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001500 uint8_t r = 16; // 64 * 0.25f
1501 uint8_t g = 48; // 64 * 0.75f
1502 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1503 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1504
1505 r /= 4; // r * (1.0f - 0.75f)
1506 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1507 }
1508}
1509
Alec Mouri80863a62019-01-17 15:19:35 -08001510TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001511 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1512}
1513
Alec Mouri80863a62019-01-17 15:19:35 -08001514TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001515 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1516}
1517
Alec Mouri80863a62019-01-17 15:19:35 -08001518TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001519 const Color color = {64, 0, 0, 255};
1520 sp<SurfaceControl> layer;
1521 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001522 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001523
1524 Transaction().setAlpha(layer, 2.0f).apply();
1525 {
1526 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001527 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001528 }
1529
1530 Transaction().setAlpha(layer, -1.0f).apply();
1531 {
1532 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001533 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001534 }
1535}
1536
Alec Mouri80863a62019-01-17 15:19:35 -08001537TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001538 sp<SurfaceControl> layer;
1539 const uint8_t size = 64;
1540 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001541 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001542 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1543 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1544
1545 Transaction()
1546 .setCornerRadius(layer, cornerRadius)
1547 .apply();
1548 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001549 const uint8_t bottom = size - 1;
1550 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001551 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001552 // Transparent corners
1553 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001554 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1555 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1556 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1557 }
1558}
1559
Alec Mouri80863a62019-01-17 15:19:35 -08001560TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001561 sp<SurfaceControl> parent;
1562 sp<SurfaceControl> child;
1563 const uint8_t size = 64;
1564 const uint8_t testArea = 4;
1565 const float cornerRadius = 20.0f;
1566 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1567 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1568 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1569 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1570
1571 Transaction()
1572 .setCornerRadius(parent, cornerRadius)
1573 .reparent(child, parent->getHandle())
1574 .setPosition(child, 0, size / 2)
1575 .apply();
1576 {
1577 const uint8_t bottom = size - 1;
1578 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001579 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001580 // Top edge of child should not have rounded corners because it's translated in the parent
1581 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1582 Color::GREEN);
1583 // But bottom edges should have been clipped according to parent bounds
1584 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1585 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001586 }
1587}
1588
Alec Mouri80863a62019-01-17 15:19:35 -08001589TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001590 sp<SurfaceControl> bufferLayer;
1591 sp<SurfaceControl> colorLayer;
1592 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001593 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001594 ASSERT_NO_FATAL_FAILURE(colorLayer =
1595 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1596 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001597
Vishnu Nair88a11f22018-11-28 18:30:57 -08001598 Transaction()
1599 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1600 .setLayer(colorLayer, mLayerZBase + 1)
1601 .apply();
1602
Chia-I Wue4ef6102017-11-01 15:16:35 -07001603 {
1604 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001605 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001606 }
1607
1608 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1609 const Color expected = {15, 51, 85, 255};
1610 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1611 // channel) should be less than one
1612 const uint8_t tolerance = 1;
1613 Transaction().setColor(colorLayer, color).apply();
1614 {
1615 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001616 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001617 }
1618}
1619
Valerie Haudd0b7572019-01-29 14:59:27 -08001620// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1621// BLUE: prior background color
1622// GREEN: final background color
1623// BLACK: no color or fill
1624void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1625 bool bufferFill, float alpha,
1626 Color finalColor) {
1627 sp<SurfaceControl> layer;
1628 int32_t width = 500;
1629 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001630
Valerie Haudd0b7572019-01-29 14:59:27 -08001631 Color fillColor = Color::RED;
1632 Color priorBgColor = Color::BLUE;
1633 Color expectedColor = Color::BLACK;
1634 switch (layerType) {
1635 case ISurfaceComposerClient::eFXSurfaceColor:
1636 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1637 Transaction()
1638 .setCrop_legacy(layer, Rect(0, 0, width, height))
1639 .setColor(layer, half3(1.0f, 0, 0))
1640 .apply();
1641 expectedColor = fillColor;
1642 break;
1643 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1644 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1645 if (bufferFill) {
1646 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1647 expectedColor = fillColor;
1648 }
1649 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1650 break;
1651 case ISurfaceComposerClient::eFXSurfaceBufferState:
1652 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1653 if (bufferFill) {
1654 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1655 expectedColor = fillColor;
1656 }
1657 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1658 break;
1659 default:
1660 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1661 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001662 }
1663
Valerie Haudd0b7572019-01-29 14:59:27 -08001664 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1665 Transaction()
1666 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1667 .apply();
1668 if (!bufferFill) {
1669 expectedColor = priorBgColor;
1670 }
1671 }
1672
1673 {
1674 SCOPED_TRACE("default before setting background color layer");
1675 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1676 }
Valerie Haua72e2812019-01-23 13:40:39 -08001677 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001678 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001679 .apply();
1680
1681 {
Valerie Haua72e2812019-01-23 13:40:39 -08001682 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001683 shot->expectColor(Rect(0, 0, width, height), finalColor);
1684 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001685 }
1686}
1687
Valerie Haudd0b7572019-01-29 14:59:27 -08001688TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1689 bool priorColor = false;
1690 bool bufferFill = false;
1691 float alpha = 1.0f;
1692 Color finalColor = Color::RED;
1693 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1694 priorColor, bufferFill, alpha, finalColor));
1695}
Valerie Haua72e2812019-01-23 13:40:39 -08001696
Valerie Haudd0b7572019-01-29 14:59:27 -08001697TEST_P(LayerRenderTypeTransactionTest,
1698 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1699 bool priorColor = false;
1700 bool bufferFill = true;
1701 float alpha = 1.0f;
1702 Color finalColor = Color::RED;
1703 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1704 priorColor, bufferFill, alpha, finalColor));
1705}
Valerie Haua72e2812019-01-23 13:40:39 -08001706
Valerie Haudd0b7572019-01-29 14:59:27 -08001707TEST_P(LayerRenderTypeTransactionTest,
1708 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1709 bool priorColor = false;
1710 bool bufferFill = false;
1711 float alpha = 1.0f;
1712 Color finalColor = Color::GREEN;
1713 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1714 priorColor, bufferFill, alpha, finalColor));
1715}
Valerie Haua72e2812019-01-23 13:40:39 -08001716
Valerie Haudd0b7572019-01-29 14:59:27 -08001717TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1718 bool priorColor = true;
1719 bool bufferFill = true;
1720 float alpha = 1.0f;
1721 Color finalColor = Color::RED;
1722 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1723 priorColor, bufferFill, alpha, finalColor));
1724}
1725
1726TEST_P(LayerRenderTypeTransactionTest,
1727 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1728 bool priorColor = true;
1729 bool bufferFill = false;
1730 float alpha = 1.0f;
1731 Color finalColor = Color::GREEN;
1732 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1733 priorColor, bufferFill, alpha, finalColor));
1734}
1735TEST_P(LayerRenderTypeTransactionTest,
1736 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1737 bool priorColor = false;
1738 bool bufferFill = false;
1739 float alpha = 0;
1740 Color finalColor = Color::BLACK;
1741 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1742 priorColor, bufferFill, alpha, finalColor));
1743}
1744
1745TEST_P(LayerRenderTypeTransactionTest,
1746 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1747 bool priorColor = true;
1748 bool bufferFill = false;
1749 float alpha = 0;
1750 Color finalColor = Color::BLACK;
1751 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1752 priorColor, bufferFill, alpha, finalColor));
1753}
1754
1755TEST_P(LayerRenderTypeTransactionTest,
1756 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1757 bool priorColor = false;
1758 bool bufferFill = true;
1759 float alpha = 1.0f;
1760 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001761 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001762 priorColor, bufferFill, alpha, finalColor));
1763}
1764
1765TEST_P(LayerRenderTypeTransactionTest,
1766 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1767 bool priorColor = false;
1768 bool bufferFill = false;
1769 float alpha = 1.0f;
1770 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001771 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001772 priorColor, bufferFill, alpha, finalColor));
1773}
1774
1775TEST_P(LayerRenderTypeTransactionTest,
1776 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1777 bool priorColor = true;
1778 bool bufferFill = false;
1779 float alpha = 1.0f;
1780 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001781 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001782 priorColor, bufferFill, alpha, finalColor));
1783}
1784
1785TEST_P(LayerRenderTypeTransactionTest,
1786 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1787 bool priorColor = false;
1788 bool bufferFill = false;
1789 float alpha = 0;
1790 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001791 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001792 priorColor, bufferFill, alpha, finalColor));
1793}
1794
1795TEST_P(LayerRenderTypeTransactionTest,
1796 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1797 bool priorColor = true;
1798 bool bufferFill = false;
1799 float alpha = 0;
1800 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001801 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001802 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001803}
1804
Alec Mouri80863a62019-01-17 15:19:35 -08001805TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001806 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001807 ASSERT_NO_FATAL_FAILURE(colorLayer =
1808 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1809 ISurfaceComposerClient::eFXSurfaceColor));
1810 Transaction()
1811 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1812 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1813 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001814
Alec Mouri80863a62019-01-17 15:19:35 -08001815 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001816}
1817
Alec Mouri80863a62019-01-17 15:19:35 -08001818TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001819 sp<SurfaceControl> bufferLayer;
1820 sp<SurfaceControl> colorLayer;
1821 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001822 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001823 ASSERT_NO_FATAL_FAILURE(colorLayer =
1824 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1825 ISurfaceComposerClient::eFXSurfaceColor));
1826 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001827
1828 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1829 const float alpha = 0.25f;
1830 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1831 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1832 // channel) should be less than one
1833 const uint8_t tolerance = 1;
1834 Transaction()
1835 .setColor(colorLayer, color)
1836 .setAlpha(colorLayer, alpha)
1837 .setLayer(colorLayer, mLayerZBase + 1)
1838 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001839 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1840 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001841}
1842
Alec Mouri80863a62019-01-17 15:19:35 -08001843TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001844 sp<SurfaceControl> bufferLayer;
1845 sp<SurfaceControl> parentLayer;
1846 sp<SurfaceControl> colorLayer;
1847 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1848 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001849 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001850 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1851 0 /* buffer height */,
1852 ISurfaceComposerClient::eFXSurfaceColor));
1853 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001854 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1855 const float alpha = 0.25f;
1856 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1857 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1858 // channel) should be less than one
1859 const uint8_t tolerance = 1;
1860 Transaction()
1861 .reparent(colorLayer, parentLayer->getHandle())
1862 .setColor(colorLayer, color)
1863 .setAlpha(parentLayer, alpha)
1864 .setLayer(parentLayer, mLayerZBase + 1)
1865 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001866 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1867 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001868}
1869
Alec Mouri80863a62019-01-17 15:19:35 -08001870TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001871 sp<SurfaceControl> bufferLayer;
1872 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001873 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001874
1875 // color is ignored
1876 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001877 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001878}
1879
Alec Mouri80863a62019-01-17 15:19:35 -08001880TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001881 sp<SurfaceControl> layer;
1882 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001883 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001884
1885 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1886 {
1887 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001888 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001889 }
1890
1891 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1892 {
1893 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001894 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001895 }
1896}
1897
Alec Mouri80863a62019-01-17 15:19:35 -08001898TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001899 sp<SurfaceControl> layer;
1900 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001901 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1902 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001903
1904 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1905 {
1906 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001907 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1908 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001909 }
1910
1911 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1912 {
1913 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001914 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1915 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001916 }
1917
1918 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1919 {
1920 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001921 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1922 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001923 }
1924
1925 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1926 {
1927 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001928 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1929 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001930 }
1931
1932 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1933 {
1934 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001935 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1936 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001937 }
1938}
1939
Alec Mouri80863a62019-01-17 15:19:35 -08001940TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001941 sp<SurfaceControl> layer;
1942 ASSERT_NO_FATAL_FAILURE(
1943 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1944 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1945 Color::BLUE, Color::WHITE));
1946
1947 Transaction()
1948 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1949 .setFrame(layer, Rect(0, 0, 32, 32))
1950 .apply();
1951 {
1952 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001953 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1954 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001955 }
1956
1957 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1958 {
1959 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001960 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1961 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001962 }
1963
1964 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1965 {
1966 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001967 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1968 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001969 }
1970
1971 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1972 {
1973 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001974 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1975 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001976 }
1977
1978 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1979 {
1980 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001981 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1982 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001983 }
1984}
1985
Alec Mouri80863a62019-01-17 15:19:35 -08001986TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001987 sp<SurfaceControl> layer;
1988 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001989 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1990 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001991
1992 const float rot = M_SQRT1_2; // 45 degrees
1993 const float trans = M_SQRT2 * 16.0f;
1994 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1995
Alec Mouri80863a62019-01-17 15:19:35 -08001996 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001997 // check a 8x8 region inside each color
1998 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1999 const int32_t halfL = 4;
2000 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
2001 };
2002 const int32_t unit = int32_t(trans / 2);
2003 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
2004 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
2005 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
2006 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
2007}
2008
Alec Mouri80863a62019-01-17 15:19:35 -08002009TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002010 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07002011 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2012 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002013
2014 // setMatrix is applied after any pending resize, unlike setPosition
2015 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
2016 {
2017 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002018 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002019 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07002020 shot->expectColor(rect, Color::RED);
2021 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002022 }
2023
Marissa Wall861616d2018-10-22 12:52:23 -07002024 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002025 {
2026 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07002027 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08002028 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002029 }
2030}
2031
Alec Mouri80863a62019-01-17 15:19:35 -08002032TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002033 sp<SurfaceControl> layer;
2034 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002035 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002036
2037 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
2038 Transaction()
2039 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
2040 .setSize(layer, 64, 64)
2041 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2042 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002043 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002044}
2045
Alec Mouri80863a62019-01-17 15:19:35 -08002046TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07002047 sp<SurfaceControl> layer;
2048 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002049 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2050 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07002051
2052 // XXX SCALE_CROP is not respected; calling setSize and
2053 // setOverrideScalingMode in separate transactions does not work
2054 // (b/69315456)
2055 Transaction()
2056 .setSize(layer, 64, 16)
2057 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2058 .apply();
2059 {
2060 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002061 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2062 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002063 }
2064}
2065
Dan Stoza000dd012018-08-01 13:31:52 -07002066TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2067 sp<SurfaceControl> layer;
2068 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2069
2070 sp<IBinder> handle = layer->getHandle();
2071 ASSERT_TRUE(handle != nullptr);
2072
2073 FrameStats frameStats;
2074 mClient->getLayerFrameStats(handle, &frameStats);
2075
2076 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2077}
2078
Alec Mouri80863a62019-01-17 15:19:35 -08002079TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002080 sp<SurfaceControl> layer;
2081 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002082 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002083 const Rect crop(8, 8, 24, 24);
2084
Marissa Wallf58c14b2018-07-24 10:50:43 -07002085 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002086 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002087 shot->expectColor(crop, Color::RED);
2088 shot->expectBorder(crop, Color::BLACK);
2089}
2090
Alec Mouri80863a62019-01-17 15:19:35 -08002091TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002092 sp<SurfaceControl> layer;
2093 ASSERT_NO_FATAL_FAILURE(
2094 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2095 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2096 const Rect crop(8, 8, 24, 24);
2097
2098 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002099 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002100 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2101 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002102}
2103
Alec Mouri80863a62019-01-17 15:19:35 -08002104TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002105 sp<SurfaceControl> layer;
2106 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002107 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002108
2109 {
2110 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002111 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002112 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002113 }
2114
2115 {
2116 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002117 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002118 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002119 }
2120}
2121
Alec Mouri80863a62019-01-17 15:19:35 -08002122TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002123 sp<SurfaceControl> layer;
2124 ASSERT_NO_FATAL_FAILURE(
2125 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2126 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2127
2128 {
2129 SCOPED_TRACE("empty rect");
2130 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002131 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002132 }
2133
2134 {
2135 SCOPED_TRACE("negative rect");
2136 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002137 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002138 }
2139}
2140
Alec Mouri80863a62019-01-17 15:19:35 -08002141TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002142 sp<SurfaceControl> layer;
2143 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002144 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002145
Marissa Wallf58c14b2018-07-24 10:50:43 -07002146 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002147 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002148 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2149 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2150}
2151
Alec Mouri80863a62019-01-17 15:19:35 -08002152TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002153 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002154 ASSERT_NO_FATAL_FAILURE(
2155 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002156 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002157 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002158 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2159 BufferUsage::COMPOSER_OVERLAY,
2160 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002161 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2162 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2163
2164 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002165
2166 Transaction().setBuffer(layer, buffer).apply();
2167
2168 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002169 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002170 {
2171 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002172 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002173 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2174 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002175 }
2176
2177 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002178 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002179 {
2180 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002181 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002182 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2183 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002184 }
2185
2186 // Fully out of buffer space bounds
2187 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2188 {
2189 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002190 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002191 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2192 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2193 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002194 }
2195}
2196
Alec Mouri80863a62019-01-17 15:19:35 -08002197TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198 sp<SurfaceControl> layer;
2199 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002200 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002201
2202 const Point position(32, 32);
2203 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002204 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002205 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002206 shot->expectColor(crop + position, Color::RED);
2207 shot->expectBorder(crop + position, Color::BLACK);
2208}
2209
Alec Mouri80863a62019-01-17 15:19:35 -08002210TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002211 sp<SurfaceControl> layer;
2212 ASSERT_NO_FATAL_FAILURE(
2213 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2214 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2215
Marissa Wall861616d2018-10-22 12:52:23 -07002216 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002217 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002218 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002219 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002220 shot->expectColor(frame, Color::RED);
2221 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002222}
2223
Alec Mouri80863a62019-01-17 15:19:35 -08002224TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002225 sp<SurfaceControl> layer;
2226 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002227 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002228
Marissa Wall861616d2018-10-22 12:52:23 -07002229 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002230 Transaction()
2231 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002232 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002233 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002234 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002235 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2236 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2237}
2238
Alec Mouri80863a62019-01-17 15:19:35 -08002239TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002240 sp<SurfaceControl> layer;
2241 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002242 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002243
Marissa Wallf58c14b2018-07-24 10:50:43 -07002244 // setCrop_legacy is applied immediately by default, with or without resize pending
2245 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002246 {
2247 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002248 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002249 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2250 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2251 }
2252
Marissa Wall61c58622018-07-18 10:12:20 -07002253 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002254 {
2255 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002256 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002257 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2258 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2259 }
2260}
2261
Alec Mouri80863a62019-01-17 15:19:35 -08002262TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002263 sp<SurfaceControl> layer;
2264 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002265 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002266
Marissa Wallf58c14b2018-07-24 10:50:43 -07002267 // request setCrop_legacy to be applied with the next resize
2268 Transaction()
2269 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2270 .setGeometryAppliesWithResize(layer)
2271 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002272 {
2273 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002274 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002275 }
2276
Marissa Wallf58c14b2018-07-24 10:50:43 -07002277 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002278 {
2279 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002280 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002281 }
2282
2283 Transaction().setSize(layer, 16, 16).apply();
2284 {
2285 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002286 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002287 }
2288
2289 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002290 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002291 {
2292 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002293 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002294 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2295 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2296 }
2297}
2298
Alec Mouri80863a62019-01-17 15:19:35 -08002299TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002300 sp<SurfaceControl> layer;
2301 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002302 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002303
Marissa Wallf58c14b2018-07-24 10:50:43 -07002304 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002305 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002306 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002307 .setSize(layer, 16, 16)
2308 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2309 .setGeometryAppliesWithResize(layer)
2310 .apply();
2311 {
2312 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002313 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002314 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2315 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2316 }
2317
2318 // XXX crop is never latched without other geometry change (b/69315677)
2319 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002320 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002321 Transaction().setPosition(layer, 0, 0).apply();
2322 {
2323 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002324 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002325 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2326 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2327 }
2328}
2329
Alec Mouri80863a62019-01-17 15:19:35 -08002330TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002331 sp<SurfaceControl> layer;
2332 ASSERT_NO_FATAL_FAILURE(
2333 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2334 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2335 const Rect frame(8, 8, 24, 24);
2336
2337 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002338 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002339 shot->expectColor(frame, Color::RED);
2340 shot->expectBorder(frame, Color::BLACK);
2341}
2342
Alec Mouri80863a62019-01-17 15:19:35 -08002343TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002344 sp<SurfaceControl> layer;
2345 ASSERT_NO_FATAL_FAILURE(
2346 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2347 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2348
Marissa Wall61c58622018-07-18 10:12:20 -07002349 {
Marissa Wall861616d2018-10-22 12:52:23 -07002350 SCOPED_TRACE("empty rect");
2351 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002352 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002353 }
2354
Marissa Wall61c58622018-07-18 10:12:20 -07002355 {
Marissa Wall861616d2018-10-22 12:52:23 -07002356 SCOPED_TRACE("negative rect");
2357 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002358 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002359 }
2360}
2361
Alec Mouri80863a62019-01-17 15:19:35 -08002362TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002363 sp<SurfaceControl> layer;
2364 ASSERT_NO_FATAL_FAILURE(
2365 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2366 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2367
2368 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002369 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002370 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2371 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002372}
2373
Alec Mouri80863a62019-01-17 15:19:35 -08002374TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002375 sp<SurfaceControl> parent, child;
2376 ASSERT_NO_FATAL_FAILURE(
2377 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2378 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2379 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2380
2381 ASSERT_NO_FATAL_FAILURE(
2382 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2383 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2384
2385 Transaction().reparent(child, parent->getHandle()).apply();
2386
2387 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002388 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002389 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2390 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2391}
2392
Alec Mouri80863a62019-01-17 15:19:35 -08002393TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002394 sp<SurfaceControl> parent, child;
2395 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2396 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2397
2398 ASSERT_NO_FATAL_FAILURE(
2399 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2400 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2401
2402 Transaction().reparent(child, parent->getHandle()).apply();
2403
2404 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002405 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002406 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2407 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2408}
2409
Alec Mouri80863a62019-01-17 15:19:35 -08002410TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002411 sp<SurfaceControl> layer;
2412 ASSERT_NO_FATAL_FAILURE(
2413 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2414 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2415 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2416
2417 std::this_thread::sleep_for(500ms);
2418
2419 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2420
Alec Mouri80863a62019-01-17 15:19:35 -08002421 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002422 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2423 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2424}
2425
Alec Mouri80863a62019-01-17 15:19:35 -08002426TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002427 sp<SurfaceControl> parent, child;
2428 ASSERT_NO_FATAL_FAILURE(
2429 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2430 ASSERT_NO_FATAL_FAILURE(
2431 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2432 Transaction().reparent(child, parent->getHandle()).apply();
2433
2434 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2435 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2436
2437 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2438 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2439
Alec Mouri80863a62019-01-17 15:19:35 -08002440 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002441 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2442 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2443 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2444}
2445
Alec Mouri80863a62019-01-17 15:19:35 -08002446TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002447 sp<SurfaceControl> layer;
2448 ASSERT_NO_FATAL_FAILURE(
2449 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2450
2451 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2452
Alec Mouri80863a62019-01-17 15:19:35 -08002453 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002454 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2455 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002456}
2457
Alec Mouri80863a62019-01-17 15:19:35 -08002458TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002459 sp<SurfaceControl> layer;
2460 ASSERT_NO_FATAL_FAILURE(
2461 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2462
2463 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2464
2465 {
2466 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002467 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002468 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2469 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002470 }
2471
2472 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2473
2474 {
2475 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002476 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002477 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2478 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002479 }
2480
2481 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2482
2483 {
2484 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002485 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002486 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2487 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002488 }
2489}
2490
Alec Mouri80863a62019-01-17 15:19:35 -08002491TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002492 sp<SurfaceControl> layer1;
2493 ASSERT_NO_FATAL_FAILURE(
2494 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2495
2496 sp<SurfaceControl> layer2;
2497 ASSERT_NO_FATAL_FAILURE(
2498 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2499
2500 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2501
Marissa Wall861616d2018-10-22 12:52:23 -07002502 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002503 {
2504 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002505 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002506 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2507 }
2508
2509 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2510
Marissa Wall861616d2018-10-22 12:52:23 -07002511 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002512 {
2513 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002514 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002515 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2516 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2517 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2518 }
2519
2520 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2521 {
2522 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002523 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002524 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2525 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2526 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2527 }
2528
2529 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2530
2531 {
2532 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002533 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002534 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2535 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2536 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2537 }
2538}
2539
Valerie Haua6b15a12019-02-05 14:16:30 -08002540TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002541 sp<SurfaceControl> layer;
2542 ASSERT_NO_FATAL_FAILURE(
2543 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2544
2545 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2546
2547 std::array<sp<GraphicBuffer>, 10> buffers;
2548
2549 size_t idx = 0;
2550 for (auto& buffer : buffers) {
2551 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2552 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2553 BufferUsage::COMPOSER_OVERLAY,
2554 "test");
2555 Color color = colors[idx % colors.size()];
2556 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2557 idx++;
2558 }
2559
2560 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2561 // cache is working.
2562 idx = 0;
2563 for (auto& buffer : buffers) {
2564 for (int i = 0; i < 2; i++) {
2565 Transaction().setBuffer(layer, buffer).apply();
2566
2567 Color color = colors[idx % colors.size()];
2568 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002569 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2570 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002571 }
2572 idx++;
2573 }
2574}
2575
Valerie Haua6b15a12019-02-05 14:16:30 -08002576TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002577 sp<SurfaceControl> layer;
2578 ASSERT_NO_FATAL_FAILURE(
2579 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2580
2581 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2582
2583 std::array<sp<GraphicBuffer>, 70> buffers;
2584
2585 size_t idx = 0;
2586 for (auto& buffer : buffers) {
2587 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2588 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2589 BufferUsage::COMPOSER_OVERLAY,
2590 "test");
2591 Color color = colors[idx % colors.size()];
2592 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2593 idx++;
2594 }
2595
2596 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2597 // cache is working.
2598 idx = 0;
2599 for (auto& buffer : buffers) {
2600 for (int i = 0; i < 2; i++) {
2601 Transaction().setBuffer(layer, buffer).apply();
2602
2603 Color color = colors[idx % colors.size()];
2604 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002605 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2606 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002607 }
2608 idx++;
2609 }
2610}
2611
Valerie Haua6b15a12019-02-05 14:16:30 -08002612TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002613 sp<SurfaceControl> layer;
2614 ASSERT_NO_FATAL_FAILURE(
2615 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2616
2617 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2618
2619 std::array<sp<GraphicBuffer>, 65> buffers;
2620
2621 size_t idx = 0;
2622 for (auto& buffer : buffers) {
2623 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2624 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2625 BufferUsage::COMPOSER_OVERLAY,
2626 "test");
2627 Color color = colors[idx % colors.size()];
2628 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2629 idx++;
2630 }
2631
2632 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2633 // cache is working.
2634 idx = 0;
2635 for (auto& buffer : buffers) {
2636 for (int i = 0; i < 2; i++) {
2637 Transaction().setBuffer(layer, buffer).apply();
2638
2639 Color color = colors[idx % colors.size()];
2640 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002641 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2642 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002643 }
2644 if (idx == 0) {
2645 buffers[0].clear();
2646 }
2647 idx++;
2648 }
2649}
2650
Alec Mouri80863a62019-01-17 15:19:35 -08002651TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002652 sp<SurfaceControl> layer;
2653 ASSERT_NO_FATAL_FAILURE(
2654 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2655
2656 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2657 Color::BLUE, Color::WHITE));
2658
Marissa Wall861616d2018-10-22 12:52:23 -07002659 Transaction()
2660 .setFrame(layer, Rect(0, 0, 32, 32))
2661 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2662 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002663
Alec Mouri80863a62019-01-17 15:19:35 -08002664 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2665 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002666}
2667
Alec Mouri80863a62019-01-17 15:19:35 -08002668TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002669 sp<SurfaceControl> layer;
2670 ASSERT_NO_FATAL_FAILURE(
2671 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2672
2673 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2674 Color::BLUE, Color::WHITE));
2675
Marissa Wall861616d2018-10-22 12:52:23 -07002676 Transaction()
2677 .setFrame(layer, Rect(0, 0, 32, 32))
2678 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2679 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002680
Alec Mouri80863a62019-01-17 15:19:35 -08002681 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2682 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002683}
2684
Alec Mouri80863a62019-01-17 15:19:35 -08002685TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002686 sp<SurfaceControl> layer;
2687 ASSERT_NO_FATAL_FAILURE(
2688 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2689
2690 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2691 Color::BLUE, Color::WHITE));
2692
Marissa Wall861616d2018-10-22 12:52:23 -07002693 Transaction()
2694 .setFrame(layer, Rect(0, 0, 32, 32))
2695 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2696 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002697
Alec Mouri80863a62019-01-17 15:19:35 -08002698 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2699 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002700}
2701
2702TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2703 sp<SurfaceControl> layer;
2704 ASSERT_NO_FATAL_FAILURE(
2705 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2706
2707 Transaction().setTransformToDisplayInverse(layer, false).apply();
2708
2709 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2710
2711 Transaction().setTransformToDisplayInverse(layer, true).apply();
2712}
2713
Alec Mouri80863a62019-01-17 15:19:35 -08002714TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002715 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002716 Transaction transaction;
2717 ASSERT_NO_FATAL_FAILURE(
2718 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2719
2720 sp<GraphicBuffer> buffer =
2721 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2722 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2723 BufferUsage::COMPOSER_OVERLAY,
2724 "test");
2725 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2726
2727 sp<Fence> fence;
2728 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2729 GTEST_SUCCEED() << "test not supported";
2730 return;
2731 }
2732
2733 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2734
2735 status_t status = fence->wait(1000);
2736 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2737 std::this_thread::sleep_for(200ms);
2738
Alec Mouri80863a62019-01-17 15:19:35 -08002739 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002740 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2741 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002742}
2743
Alec Mouri80863a62019-01-17 15:19:35 -08002744TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002745 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002746 ASSERT_NO_FATAL_FAILURE(
2747 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2748
2749 sp<GraphicBuffer> buffer =
2750 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2751 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2752 BufferUsage::COMPOSER_OVERLAY,
2753 "test");
2754 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2755
Marissa Wallfda30bb2018-10-12 11:34:28 -07002756 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002757
2758 Transaction()
2759 .setBuffer(layer, buffer)
2760 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002761 .apply();
2762
Alec Mouri80863a62019-01-17 15:19:35 -08002763 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002764 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2765 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002766}
2767
Alec Mouri80863a62019-01-17 15:19:35 -08002768TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002769 sp<SurfaceControl> layer;
2770 ASSERT_NO_FATAL_FAILURE(
2771 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2772
2773 sp<GraphicBuffer> buffer =
2774 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2775 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2776 BufferUsage::COMPOSER_OVERLAY,
2777 "test");
2778 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2779
2780 Transaction()
2781 .setBuffer(layer, buffer)
2782 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002783 .apply();
2784
Alec Mouri80863a62019-01-17 15:19:35 -08002785 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002786 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2787 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002788}
2789
Alec Mouri80863a62019-01-17 15:19:35 -08002790TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002791 sp<SurfaceControl> layer;
2792 ASSERT_NO_FATAL_FAILURE(
2793 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2794
2795 sp<GraphicBuffer> buffer =
2796 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2797 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2798 BufferUsage::COMPOSER_OVERLAY,
2799 "test");
2800 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2801
2802 HdrMetadata hdrMetadata;
2803 hdrMetadata.validTypes = 0;
2804 Transaction()
2805 .setBuffer(layer, buffer)
2806 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002807 .apply();
2808
Alec Mouri80863a62019-01-17 15:19:35 -08002809 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002810 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2811 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002812}
2813
Alec Mouri80863a62019-01-17 15:19:35 -08002814TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002815 sp<SurfaceControl> layer;
2816 ASSERT_NO_FATAL_FAILURE(
2817 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2818
2819 sp<GraphicBuffer> buffer =
2820 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2821 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2822 BufferUsage::COMPOSER_OVERLAY,
2823 "test");
2824 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2825
2826 Region region;
2827 region.set(32, 32);
2828 Transaction()
2829 .setBuffer(layer, buffer)
2830 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002831 .apply();
2832
Alec Mouri80863a62019-01-17 15:19:35 -08002833 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002834 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2835 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002836}
2837
Alec Mouri80863a62019-01-17 15:19:35 -08002838TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002839 sp<SurfaceControl> layer;
2840 ASSERT_NO_FATAL_FAILURE(
2841 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2842
2843 sp<GraphicBuffer> buffer =
2844 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2845 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2846 BufferUsage::COMPOSER_OVERLAY,
2847 "test");
2848 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2849
2850 Transaction()
2851 .setBuffer(layer, buffer)
2852 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002853 .apply();
2854
Alec Mouri80863a62019-01-17 15:19:35 -08002855 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002856 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2857 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002858}
2859
2860TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2861 sp<SurfaceControl> layer;
2862 ASSERT_NO_FATAL_FAILURE(
2863 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2864
2865 // verify this doesn't cause a crash
2866 Transaction().setSidebandStream(layer, nullptr).apply();
2867}
2868
Robert Carr54cf5b12019-01-25 14:02:28 -08002869TEST_F(LayerTransactionTest, ReparentToSelf) {
2870 sp<SurfaceControl> layer;
2871 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2872 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2873 Transaction().reparent(layer, layer->getHandle()).apply();
2874
2875 {
2876 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2877 // to still be functioning.
2878 SCOPED_TRACE("after reparent to self");
2879 const Rect rect(0, 0, 32, 32);
2880 auto shot = screenshot();
2881 shot->expectColor(rect, Color::RED);
2882 shot->expectBorder(rect, Color::BLACK);
2883 }
2884}
2885
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002886class ColorTransformHelper {
2887public:
2888 static void DegammaColorSingle(half& s) {
2889 if (s <= 0.03928f)
2890 s = s / 12.92f;
2891 else
2892 s = pow((s + 0.055f) / 1.055f, 2.4f);
2893 }
2894
2895 static void DegammaColor(half3& color) {
2896 DegammaColorSingle(color.r);
2897 DegammaColorSingle(color.g);
2898 DegammaColorSingle(color.b);
2899 }
2900
2901 static void GammaColorSingle(half& s) {
2902 if (s <= 0.0031308f) {
2903 s = s * 12.92f;
2904 } else {
2905 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2906 }
2907 }
2908
2909 static void GammaColor(half3& color) {
2910 GammaColorSingle(color.r);
2911 GammaColorSingle(color.g);
2912 GammaColorSingle(color.b);
2913 }
2914
2915 static void applyMatrix(half3& color, const mat3& mat) {
2916 half3 ret = half3(0);
2917
2918 for (int i = 0; i < 3; i++) {
2919 for (int j = 0; j < 3; j++) {
2920 ret[i] = ret[i] + color[j] * mat[j][i];
2921 }
2922 }
2923 color = ret;
2924 }
2925};
2926
Alec Mouri80863a62019-01-17 15:19:35 -08002927TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002928 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002929 ASSERT_NO_FATAL_FAILURE(colorLayer =
2930 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2931 ISurfaceComposerClient::eFXSurfaceColor));
2932 Transaction()
2933 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2934 .setLayer(colorLayer, mLayerZBase + 1)
2935 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002936 {
2937 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002938 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002939 }
2940
2941 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002942 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002943 mat3 matrix;
2944 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2945 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2946 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002947
2948 // degamma before applying the matrix
2949 if (mColorManagementUsed) {
2950 ColorTransformHelper::DegammaColor(expected);
2951 }
2952
2953 ColorTransformHelper::applyMatrix(expected, matrix);
2954
2955 if (mColorManagementUsed) {
2956 ColorTransformHelper::GammaColor(expected);
2957 }
2958
2959 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2960 uint8_t(expected.b * 255), 255};
2961
2962 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2963 // channel) should be less than one
2964 const uint8_t tolerance = 1;
2965
Peiyong Lind3788632018-09-18 16:01:31 -07002966 Transaction().setColor(colorLayer, color)
2967 .setColorTransform(colorLayer, matrix, vec3()).apply();
2968 {
2969 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002970 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002971 }
2972}
2973
Alec Mouri80863a62019-01-17 15:19:35 -08002974TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002975 sp<SurfaceControl> parentLayer;
2976 sp<SurfaceControl> colorLayer;
2977 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2978 0 /* buffer height */,
2979 ISurfaceComposerClient::eFXSurfaceContainer));
2980 ASSERT_NO_FATAL_FAILURE(
2981 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2982 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2983
2984 Transaction()
2985 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2986 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2987 .setLayer(parentLayer, mLayerZBase + 1)
2988 .apply();
2989 {
2990 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002991 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002992 }
2993
2994 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2995 half3 expected = color;
2996 mat3 matrix;
2997 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2998 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2999 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
3000
3001 // degamma before applying the matrix
3002 if (mColorManagementUsed) {
3003 ColorTransformHelper::DegammaColor(expected);
3004 }
3005
3006 ColorTransformHelper::applyMatrix(expected, matrix);
3007
3008 if (mColorManagementUsed) {
3009 ColorTransformHelper::GammaColor(expected);
3010 }
3011
3012 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3013 uint8_t(expected.b * 255), 255};
3014
3015 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3016 // channel) should be less than one
3017 const uint8_t tolerance = 1;
3018
3019 Transaction()
3020 .setColor(colorLayer, color)
3021 .setColorTransform(parentLayer, matrix, vec3())
3022 .apply();
3023 {
3024 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003025 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003026 }
3027}
3028
Alec Mouri80863a62019-01-17 15:19:35 -08003029TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08003030 sp<SurfaceControl> parentLayer;
3031 sp<SurfaceControl> colorLayer;
3032 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3033 0 /* buffer height */,
3034 ISurfaceComposerClient::eFXSurfaceContainer));
3035 ASSERT_NO_FATAL_FAILURE(
3036 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3037 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3038
3039 Transaction()
3040 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3041 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3042 .setLayer(parentLayer, mLayerZBase + 1)
3043 .apply();
3044 {
3045 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003046 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003047 }
3048
3049 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3050 half3 expected = color;
3051 mat3 matrixChild;
3052 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
3053 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
3054 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
3055 mat3 matrixParent;
3056 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
3057 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
3058 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3059
3060 // degamma before applying the matrix
3061 if (mColorManagementUsed) {
3062 ColorTransformHelper::DegammaColor(expected);
3063 }
3064
3065 ColorTransformHelper::applyMatrix(expected, matrixChild);
3066 ColorTransformHelper::applyMatrix(expected, matrixParent);
3067
3068 if (mColorManagementUsed) {
3069 ColorTransformHelper::GammaColor(expected);
3070 }
3071
3072 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3073 uint8_t(expected.b * 255), 255};
3074
3075 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3076 // channel) should be less than one
3077 const uint8_t tolerance = 1;
3078
3079 Transaction()
3080 .setColor(colorLayer, color)
3081 .setColorTransform(parentLayer, matrixParent, vec3())
3082 .setColorTransform(colorLayer, matrixChild, vec3())
3083 .apply();
3084 {
3085 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003086 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003087 }
3088}
3089
Marissa Wall80d94ad2019-01-18 16:04:36 -08003090struct CallbackData {
3091 CallbackData() = default;
3092 CallbackData(nsecs_t time, const sp<Fence>& fence,
3093 const std::vector<SurfaceControlStats>& stats)
3094 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3095
3096 nsecs_t latchTime;
3097 sp<Fence> presentFence;
3098 std::vector<SurfaceControlStats> surfaceControlStats;
3099};
3100
Marissa Wallfda30bb2018-10-12 11:34:28 -07003101class ExpectedResult {
3102public:
3103 enum Transaction {
3104 NOT_PRESENTED = 0,
3105 PRESENTED,
3106 };
3107
3108 enum Buffer {
3109 NOT_ACQUIRED = 0,
3110 ACQUIRED,
3111 };
3112
3113 enum PreviousBuffer {
3114 NOT_RELEASED = 0,
3115 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003116 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003117 };
3118
3119 void reset() {
3120 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3121 mExpectedSurfaceResults.clear();
3122 }
3123
3124 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003125 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003126 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3127 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003128 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003129 std::forward_as_tuple(bufferResult, previousBufferResult));
3130 }
3131
3132 void addSurfaces(ExpectedResult::Transaction transactionResult,
3133 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003134 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003135 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3136 for (const auto& layer : layers) {
3137 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3138 }
3139 }
3140
Marissa Wall17b4e452018-12-26 16:32:34 -08003141 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3142 mExpectedPresentTime = expectedPresentTime;
3143 }
3144
Marissa Wall80d94ad2019-01-18 16:04:36 -08003145 void verifyCallbackData(const CallbackData& callbackData) const {
3146 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003147 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3148 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003149 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003150 if (mExpectedPresentTime >= 0) {
3151 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3152 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3153 // if the panel is running at 30 hz, at the worst case, our expected time just
3154 // misses vsync and we have to wait another 33.3ms
3155 ASSERT_LE(presentFence->getSignalTime(),
3156 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3157 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003158 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003159 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003160 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3161 }
3162
Marissa Wall80d94ad2019-01-18 16:04:36 -08003163 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003164 << "wrong number of surfaces";
3165
Marissa Wall80d94ad2019-01-18 16:04:36 -08003166 for (const auto& stats : surfaceControlStats) {
3167 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3168
Marissa Wallfda30bb2018-10-12 11:34:28 -07003169 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3170 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3171 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003172 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003173 }
3174 }
3175
3176private:
3177 class ExpectedSurfaceResult {
3178 public:
3179 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3180 ExpectedResult::PreviousBuffer previousBufferResult)
3181 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3182
Marissa Wall80d94ad2019-01-18 16:04:36 -08003183 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3184 nsecs_t latchTime) const {
3185 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003186
3187 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3188 << "bad acquire time";
3189 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003190
3191 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3192 ASSERT_NE(previousReleaseFence, nullptr)
3193 << "failed to set release prev buffer fence";
3194 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3195 ASSERT_EQ(previousReleaseFence, nullptr)
3196 << "should not have set released prev buffer fence";
3197 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003198 }
3199
3200 private:
3201 ExpectedResult::Buffer mBufferResult;
3202 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3203 };
3204
Marissa Wall80d94ad2019-01-18 16:04:36 -08003205 struct SCHash {
3206 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3207 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003208 }
3209 };
3210 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003211 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003212 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003213};
3214
3215class CallbackHelper {
3216public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003217 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3218 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003219 if (!callbackContext) {
3220 ALOGE("failed to get callback context");
3221 }
3222 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3223 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003224 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003225 helper->mConditionVariable.notify_all();
3226 }
3227
Marissa Wall80d94ad2019-01-18 16:04:36 -08003228 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003229 std::unique_lock lock(mMutex);
3230
Marissa Wall80d94ad2019-01-18 16:04:36 -08003231 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003232 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3233 std::cv_status::timeout)
3234 << "did not receive callback";
3235 }
3236
Marissa Wall80d94ad2019-01-18 16:04:36 -08003237 *outData = std::move(mCallbackDataQueue.front());
3238 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003239 }
3240
3241 void verifyFinalState() {
3242 // Wait to see if there are extra callbacks
3243 std::this_thread::sleep_for(500ms);
3244
3245 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003246 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3247 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003248 }
3249
3250 void* getContext() { return static_cast<void*>(this); }
3251
3252 std::mutex mMutex;
3253 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003254 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003255};
3256
3257class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003258public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003260 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003261 }
3262
Marissa Wall713b63f2018-10-17 15:42:43 -07003263 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003264 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3265 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003266 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003267 sp<GraphicBuffer> buffer;
3268 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003269 if (setBuffer) {
3270 int err = getBuffer(&buffer, &fence);
3271 if (err != NO_ERROR) {
3272 return err;
3273 }
3274
3275 transaction.setBuffer(layer, buffer);
3276 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003277 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003278
Valerie Hauaa194562019-02-05 16:21:38 -08003279 if (setBackgroundColor) {
3280 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3281 ui::Dataspace::UNKNOWN);
3282 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003283 }
3284
3285 transaction.addTransactionCompletedCallback(callbackHelper->function,
3286 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003287 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003288 }
3289
Marissa Wall861616d2018-10-22 12:52:23 -07003290 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3291 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003292 CallbackData callbackData;
3293 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3294 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003295
3296 if (finalState) {
3297 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3298 }
3299 }
3300
Marissa Wall861616d2018-10-22 12:52:23 -07003301 static void waitForCallbacks(CallbackHelper& helper,
3302 const std::vector<ExpectedResult>& expectedResults,
3303 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003304 for (const auto& expectedResult : expectedResults) {
3305 waitForCallback(helper, expectedResult);
3306 }
3307 if (finalState) {
3308 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3309 }
3310 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003311};
3312
Valerie Hauaa194562019-02-05 16:21:38 -08003313TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003314 sp<SurfaceControl> layer;
3315 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3316
3317 Transaction transaction;
3318 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003319 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003320 if (err) {
3321 GTEST_SUCCEED() << "test not supported";
3322 return;
3323 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003324
3325 transaction.apply();
3326
3327 ExpectedResult expected;
3328 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3329 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3330}
3331
Valerie Hauaa194562019-02-05 16:21:38 -08003332TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003333 sp<SurfaceControl> layer;
3334 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3335
3336 Transaction transaction;
3337 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003338 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003339 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(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003345
3346 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003347 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3348 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003349 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3350}
3351
Valerie Hauaa194562019-02-05 16:21:38 -08003352TEST_F(LayerCallbackTest, BufferNoColor) {
3353 sp<SurfaceControl> layer;
3354 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3355
3356 Transaction transaction;
3357 CallbackHelper callback;
3358 int err = fillTransaction(transaction, &callback, layer, true, false);
3359 if (err) {
3360 GTEST_SUCCEED() << "test not supported";
3361 return;
3362 }
3363
3364 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3365
3366 ExpectedResult expected;
3367 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3368 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3369}
3370
3371TEST_F(LayerCallbackTest, NoBufferColor) {
3372 sp<SurfaceControl> layer;
3373 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3374
3375 Transaction transaction;
3376 CallbackHelper callback;
3377 int err = fillTransaction(transaction, &callback, layer, false, true);
3378 if (err) {
3379 GTEST_SUCCEED() << "test not supported";
3380 return;
3381 }
3382
3383 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3384
3385 ExpectedResult expected;
3386 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3387 ExpectedResult::Buffer::NOT_ACQUIRED);
3388 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3389}
3390
Marissa Wallfda30bb2018-10-12 11:34:28 -07003391TEST_F(LayerCallbackTest, NoStateChange) {
3392 Transaction transaction;
3393 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003394 int err = fillTransaction(transaction, &callback);
3395 if (err) {
3396 GTEST_SUCCEED() << "test not supported";
3397 return;
3398 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003399
3400 transaction.apply();
3401
3402 ExpectedResult expected;
3403 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3404}
3405
3406TEST_F(LayerCallbackTest, OffScreen) {
3407 sp<SurfaceControl> layer;
3408 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3409
3410 Transaction transaction;
3411 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003412 int err = fillTransaction(transaction, &callback, layer);
3413 if (err) {
3414 GTEST_SUCCEED() << "test not supported";
3415 return;
3416 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003417
Marissa Wall861616d2018-10-22 12:52:23 -07003418 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003419
3420 ExpectedResult expected;
3421 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3422 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3423}
3424
Valerie Hauaa194562019-02-05 16:21:38 -08003425TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003426 sp<SurfaceControl> layer1, layer2;
3427 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3428 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3429
3430 Transaction transaction1, transaction2;
3431 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003432 int err = fillTransaction(transaction1, &callback1, layer1);
3433 if (err) {
3434 GTEST_SUCCEED() << "test not supported";
3435 return;
3436 }
3437 err = fillTransaction(transaction2, &callback2, layer2);
3438 if (err) {
3439 GTEST_SUCCEED() << "test not supported";
3440 return;
3441 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003442
Marissa Wall861616d2018-10-22 12:52:23 -07003443 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3444 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003445
3446 ExpectedResult expected;
3447 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3448 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3449 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3450}
3451
Valerie Hauaa194562019-02-05 16:21:38 -08003452TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3453 sp<SurfaceControl> layer1, layer2;
3454 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3455 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3456
3457 Transaction transaction1, transaction2;
3458 CallbackHelper callback1, callback2;
3459 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3460 if (err) {
3461 GTEST_SUCCEED() << "test not supported";
3462 return;
3463 }
3464 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3465 if (err) {
3466 GTEST_SUCCEED() << "test not supported";
3467 return;
3468 }
3469
3470 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3471 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3472
3473 ExpectedResult expected;
3474 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3475 ExpectedResult::Buffer::NOT_ACQUIRED);
3476 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3477 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3478}
3479
3480TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3481 sp<SurfaceControl> layer1, layer2;
3482 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3483 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3484
3485 Transaction transaction1, transaction2;
3486 CallbackHelper callback1, callback2;
3487 int err = fillTransaction(transaction1, &callback1, layer1);
3488 if (err) {
3489 GTEST_SUCCEED() << "test not supported";
3490 return;
3491 }
3492 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3493 if (err) {
3494 GTEST_SUCCEED() << "test not supported";
3495 return;
3496 }
3497
3498 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3499 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3500
3501 ExpectedResult expected;
3502 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3503 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3504 ExpectedResult::Buffer::NOT_ACQUIRED);
3505 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3506 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3507}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003508TEST_F(LayerCallbackTest, Merge_SameCallback) {
3509 sp<SurfaceControl> layer1, layer2;
3510 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3511 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3512
3513 Transaction transaction1, transaction2;
3514 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003515 int err = fillTransaction(transaction1, &callback, layer1);
3516 if (err) {
3517 GTEST_SUCCEED() << "test not supported";
3518 return;
3519 }
3520 err = fillTransaction(transaction2, &callback, layer2);
3521 if (err) {
3522 GTEST_SUCCEED() << "test not supported";
3523 return;
3524 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003525
3526 transaction2.merge(std::move(transaction1)).apply();
3527
3528 ExpectedResult expected;
3529 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3530 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3531 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3532}
3533
3534TEST_F(LayerCallbackTest, Merge_SameLayer) {
3535 sp<SurfaceControl> layer;
3536 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3537
3538 Transaction transaction1, transaction2;
3539 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003540 int err = fillTransaction(transaction1, &callback1, layer);
3541 if (err) {
3542 GTEST_SUCCEED() << "test not supported";
3543 return;
3544 }
3545 err = fillTransaction(transaction2, &callback2, layer);
3546 if (err) {
3547 GTEST_SUCCEED() << "test not supported";
3548 return;
3549 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003550
3551 transaction2.merge(std::move(transaction1)).apply();
3552
3553 ExpectedResult expected;
3554 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3555 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3556 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3557}
3558
Marissa Wallfda30bb2018-10-12 11:34:28 -07003559TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3560 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3561 client2(new SurfaceComposerClient);
3562
3563 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3564 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3565
3566 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003567 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003568 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003569 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003570 ISurfaceComposerClient::eFXSurfaceBufferState));
3571
3572 Transaction transaction1, transaction2;
3573 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003574 int err = fillTransaction(transaction1, &callback1, layer1);
3575 if (err) {
3576 GTEST_SUCCEED() << "test not supported";
3577 return;
3578 }
3579 err = fillTransaction(transaction2, &callback2, layer2);
3580 if (err) {
3581 GTEST_SUCCEED() << "test not supported";
3582 return;
3583 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003584
Marissa Wall861616d2018-10-22 12:52:23 -07003585 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3586 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003587
3588 ExpectedResult expected;
3589 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3590 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3591 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3592}
3593
3594TEST_F(LayerCallbackTest, MultipleTransactions) {
3595 sp<SurfaceControl> layer;
3596 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3597
3598 Transaction transaction;
3599 CallbackHelper callback;
3600 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003601 int err = fillTransaction(transaction, &callback, layer);
3602 if (err) {
3603 GTEST_SUCCEED() << "test not supported";
3604 return;
3605 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003606
3607 transaction.apply();
3608
3609 ExpectedResult expected;
3610 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003611 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003612 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3613 : ExpectedResult::PreviousBuffer::RELEASED);
3614 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3615 }
3616 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3617}
3618
3619TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3620 sp<SurfaceControl> layer;
3621 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3622
3623 Transaction transaction;
3624 CallbackHelper callback;
3625 for (size_t i = 0; i < 10; i++) {
3626 ExpectedResult expected;
3627
3628 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003629 int err = fillTransaction(transaction, &callback, layer);
3630 if (err) {
3631 GTEST_SUCCEED() << "test not supported";
3632 return;
3633 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003634 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3635 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003636 int err = fillTransaction(transaction, &callback);
3637 if (err) {
3638 GTEST_SUCCEED() << "test not supported";
3639 return;
3640 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003641 }
3642
3643 transaction.apply();
3644
3645 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3646 }
3647 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3648}
3649
3650TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3651 sp<SurfaceControl> layer;
3652 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3653
3654 Transaction transaction;
3655 CallbackHelper callback;
3656 for (size_t i = 0; i < 10; i++) {
3657 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003658 int err = fillTransaction(transaction, &callback, layer);
3659 if (err) {
3660 GTEST_SUCCEED() << "test not supported";
3661 return;
3662 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003663 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003664 int err = fillTransaction(transaction, &callback);
3665 if (err) {
3666 GTEST_SUCCEED() << "test not supported";
3667 return;
3668 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003669 }
3670
Marissa Wall861616d2018-10-22 12:52:23 -07003671 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003672
3673 ExpectedResult expected;
3674 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3675 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003676 layer,
3677 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3678 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003679 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3680 }
3681 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3682}
3683
3684TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3685 sp<SurfaceControl> layer1, layer2;
3686 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3687 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3688
3689 Transaction transaction1, transaction2;
3690 CallbackHelper callback1, callback2;
3691 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003692 int err = fillTransaction(transaction1, &callback1, layer1);
3693 if (err) {
3694 GTEST_SUCCEED() << "test not supported";
3695 return;
3696 }
3697 err = fillTransaction(transaction2, &callback2, layer2);
3698 if (err) {
3699 GTEST_SUCCEED() << "test not supported";
3700 return;
3701 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003702
Marissa Wall861616d2018-10-22 12:52:23 -07003703 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3704 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003705
3706 ExpectedResult expected;
3707 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003708 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003709 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3710 : ExpectedResult::PreviousBuffer::RELEASED);
3711 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3712 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3713 }
3714 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3715 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3716}
3717
3718TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3719 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3720 client2(new SurfaceComposerClient);
3721 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3722 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3723
3724 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003725 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003726 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003727 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003728 ISurfaceComposerClient::eFXSurfaceBufferState));
3729
3730 Transaction transaction1, transaction2;
3731 CallbackHelper callback1, callback2;
3732 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003733 int err = fillTransaction(transaction1, &callback1, layer1);
3734 if (err) {
3735 GTEST_SUCCEED() << "test not supported";
3736 return;
3737 }
3738 err = fillTransaction(transaction2, &callback2, layer2);
3739 if (err) {
3740 GTEST_SUCCEED() << "test not supported";
3741 return;
3742 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003743
Marissa Wall861616d2018-10-22 12:52:23 -07003744 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3745 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003746
3747 ExpectedResult expected;
3748 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003749 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003750 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3751 : ExpectedResult::PreviousBuffer::RELEASED);
3752 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3753 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3754 }
3755 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3756 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3757}
3758
3759TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3760 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3761 client2(new SurfaceComposerClient);
3762 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3763 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3764
3765 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003766 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003767 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003768 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003769 ISurfaceComposerClient::eFXSurfaceBufferState));
3770
3771 Transaction transaction1, transaction2;
3772 CallbackHelper callback1, callback2;
3773
3774 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003775 int err = fillTransaction(transaction1, &callback1, layer1);
3776 if (err) {
3777 GTEST_SUCCEED() << "test not supported";
3778 return;
3779 }
3780 err = fillTransaction(transaction2, &callback2, layer2);
3781 if (err) {
3782 GTEST_SUCCEED() << "test not supported";
3783 return;
3784 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003785
Marissa Wall861616d2018-10-22 12:52:23 -07003786 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3787 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003788
3789 ExpectedResult expected;
3790 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3791 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3792 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3793 expected.reset();
3794
3795 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003796 err = fillTransaction(transaction1, &callback1);
3797 if (err) {
3798 GTEST_SUCCEED() << "test not supported";
3799 return;
3800 }
3801 err = fillTransaction(transaction2, &callback2);
3802 if (err) {
3803 GTEST_SUCCEED() << "test not supported";
3804 return;
3805 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003806
3807 transaction2.merge(std::move(transaction1)).apply();
3808
3809 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3810 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3811}
3812
3813TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3814 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3815 client2(new SurfaceComposerClient);
3816
3817 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3818 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3819
3820 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003821 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003822 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003823 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003824 ISurfaceComposerClient::eFXSurfaceBufferState));
3825
3826 Transaction transaction1, transaction2;
3827 CallbackHelper callback1, callback2;
3828
3829 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003830 int err = fillTransaction(transaction1, &callback1, layer1);
3831 if (err) {
3832 GTEST_SUCCEED() << "test not supported";
3833 return;
3834 }
3835 err = fillTransaction(transaction2, &callback2, layer2);
3836 if (err) {
3837 GTEST_SUCCEED() << "test not supported";
3838 return;
3839 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003840
Marissa Wall861616d2018-10-22 12:52:23 -07003841 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3842 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003843
3844 ExpectedResult expected;
3845 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3846 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3847 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3848 expected.reset();
3849
3850 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003851 err = fillTransaction(transaction1, &callback1);
3852 if (err) {
3853 GTEST_SUCCEED() << "test not supported";
3854 return;
3855 }
3856 err = fillTransaction(transaction2, &callback2);
3857 if (err) {
3858 GTEST_SUCCEED() << "test not supported";
3859 return;
3860 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003861
Marissa Wall861616d2018-10-22 12:52:23 -07003862 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003863
Marissa Wall713b63f2018-10-17 15:42:43 -07003864 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3865 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003866 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3867 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3868}
3869
3870TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3871 sp<SurfaceControl> layer;
3872 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3873
3874 Transaction transaction;
3875 CallbackHelper callback;
3876 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003877 for (auto& expected : expectedResults) {
3878 expected.reset();
3879 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003880 ExpectedResult::Buffer::ACQUIRED,
3881 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003882
Marissa Wall713b63f2018-10-17 15:42:43 -07003883 int err = fillTransaction(transaction, &callback, layer);
3884 if (err) {
3885 GTEST_SUCCEED() << "test not supported";
3886 return;
3887 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003888
3889 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003890 }
3891 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3892}
3893
3894TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3895 sp<SurfaceControl> layer;
3896 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3897
Marissa Wall713b63f2018-10-17 15:42:43 -07003898 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003899 Transaction transaction;
3900 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003901 int err = fillTransaction(transaction, &callback, layer);
3902 if (err) {
3903 GTEST_SUCCEED() << "test not supported";
3904 return;
3905 }
3906
3907 transaction.apply();
3908
3909 ExpectedResult expected;
3910 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3911 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3912
3913 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003914 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003915 for (auto& expected : expectedResults) {
3916 expected.reset();
3917
Marissa Wall713b63f2018-10-17 15:42:43 -07003918 err = fillTransaction(transaction, &callback);
3919 if (err) {
3920 GTEST_SUCCEED() << "test not supported";
3921 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003922 }
3923
3924 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003925 }
3926 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3927}
3928
3929TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3930 sp<SurfaceControl> layer;
3931 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3932
3933 // Normal call to set up test
3934 Transaction transaction;
3935 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003936 int err = fillTransaction(transaction, &callback, layer);
3937 if (err) {
3938 GTEST_SUCCEED() << "test not supported";
3939 return;
3940 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003941
Marissa Wall861616d2018-10-22 12:52:23 -07003942 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003943
3944 ExpectedResult expectedResult;
3945 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3946 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3947
3948 // Test
3949 std::vector<ExpectedResult> expectedResults(50);
3950 for (auto& expected : expectedResults) {
3951 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003952 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3953 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003954
Marissa Wall713b63f2018-10-17 15:42:43 -07003955 err = fillTransaction(transaction, &callback);
3956 if (err) {
3957 GTEST_SUCCEED() << "test not supported";
3958 return;
3959 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003960
Marissa Wall861616d2018-10-22 12:52:23 -07003961 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003962 }
3963 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3964}
3965
Marissa Wall17b4e452018-12-26 16:32:34 -08003966TEST_F(LayerCallbackTest, DesiredPresentTime) {
3967 sp<SurfaceControl> layer;
3968 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3969
3970 Transaction transaction;
3971 CallbackHelper callback;
3972 int err = fillTransaction(transaction, &callback, layer);
3973 if (err) {
3974 GTEST_SUCCEED() << "test not supported";
3975 return;
3976 }
3977
3978 // Try to present 100ms in the future
3979 nsecs_t time = systemTime() + (100 * 1e6);
3980
3981 transaction.setDesiredPresentTime(time);
3982 transaction.apply();
3983
3984 ExpectedResult expected;
3985 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3986 expected.addExpectedPresentTime(time);
3987 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3988}
3989
3990TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3991 sp<SurfaceControl> layer;
3992 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3993
3994 Transaction transaction;
3995 CallbackHelper callback1;
3996 int err = fillTransaction(transaction, &callback1, layer);
3997 if (err) {
3998 GTEST_SUCCEED() << "test not supported";
3999 return;
4000 }
4001
4002 // Try to present 100ms in the future
4003 nsecs_t time = systemTime() + (100 * 1e6);
4004
4005 transaction.setDesiredPresentTime(time);
4006 transaction.apply();
4007
4008 ExpectedResult expected1;
4009 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4010 expected1.addExpectedPresentTime(time);
4011
4012 CallbackHelper callback2;
4013 err = fillTransaction(transaction, &callback2, layer);
4014 if (err) {
4015 GTEST_SUCCEED() << "test not supported";
4016 return;
4017 }
4018
4019 // Try to present 33ms after the first frame
4020 time += (33.3 * 1e6);
4021
4022 transaction.setDesiredPresentTime(time);
4023 transaction.apply();
4024
4025 ExpectedResult expected2;
4026 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4027 ExpectedResult::Buffer::ACQUIRED,
4028 ExpectedResult::PreviousBuffer::RELEASED);
4029 expected2.addExpectedPresentTime(time);
4030
4031 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4032 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4033}
4034
4035TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
4036 sp<SurfaceControl> layer;
4037 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4038
4039 Transaction transaction;
4040 CallbackHelper callback1;
4041 int err = fillTransaction(transaction, &callback1, layer);
4042 if (err) {
4043 GTEST_SUCCEED() << "test not supported";
4044 return;
4045 }
4046
4047 // Try to present 100ms in the future
4048 nsecs_t time = systemTime() + (100 * 1e6);
4049
4050 transaction.setDesiredPresentTime(time);
4051 transaction.apply();
4052
4053 ExpectedResult expected1;
4054 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4055 expected1.addExpectedPresentTime(time);
4056
4057 CallbackHelper callback2;
4058 err = fillTransaction(transaction, &callback2, layer);
4059 if (err) {
4060 GTEST_SUCCEED() << "test not supported";
4061 return;
4062 }
4063
4064 // Try to present 33ms before the previous frame
4065 time -= (33.3 * 1e6);
4066
4067 transaction.setDesiredPresentTime(time);
4068 transaction.apply();
4069
4070 ExpectedResult expected2;
4071 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4072 ExpectedResult::Buffer::ACQUIRED,
4073 ExpectedResult::PreviousBuffer::RELEASED);
4074
4075 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4076 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4077}
4078
4079TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4080 sp<SurfaceControl> layer;
4081 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4082
4083 Transaction transaction;
4084 CallbackHelper callback;
4085 int err = fillTransaction(transaction, &callback, layer);
4086 if (err) {
4087 GTEST_SUCCEED() << "test not supported";
4088 return;
4089 }
4090
4091 // Try to present 100ms in the past
4092 nsecs_t time = systemTime() - (100 * 1e6);
4093
4094 transaction.setDesiredPresentTime(time);
4095 transaction.apply();
4096
4097 ExpectedResult expected;
4098 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4099 expected.addExpectedPresentTime(systemTime());
4100 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4101}
4102
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004103class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004104protected:
4105 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004106 LayerTransactionTest::SetUp();
4107 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004108
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004109 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4110 ASSERT_FALSE(display == nullptr);
4111
Mathias Agopianc666cae2012-07-25 18:56:13 -07004112 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004113 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004114
4115 ssize_t displayWidth = info.w;
4116 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004117
4118 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004119 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4120 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004121 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004122 ASSERT_TRUE(mBGSurfaceControl->isValid());
4123 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4124
4125 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004126 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4127
Peiyong Lin566a3b42018-01-09 18:22:43 -08004128 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004129 ASSERT_TRUE(mFGSurfaceControl->isValid());
4130
4131 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4132
4133 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004134 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004135 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004136 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4137
4138 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4139
Robert Carr4cdc58f2017-08-23 14:22:20 -07004140 asTransaction([&](Transaction& t) {
4141 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004142
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004143 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004144
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004145 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4146 .setPosition(mFGSurfaceControl, 64, 64)
4147 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004148
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004149 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4150 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4151 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004152 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004153 }
4154
4155 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004156 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004157 mBGSurfaceControl = 0;
4158 mFGSurfaceControl = 0;
4159 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004160 }
4161
4162 void waitForPostedBuffers() {
4163 // Since the sync surface is in synchronous mode (i.e. double buffered)
4164 // posting three buffers to it should ensure that at least two
4165 // SurfaceFlinger::handlePageFlip calls have been made, which should
4166 // guaranteed that a buffer posted to another Surface has been retired.
4167 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4168 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4169 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4170 }
4171
Robert Carr4cdc58f2017-08-23 14:22:20 -07004172
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004173 sp<SurfaceControl> mBGSurfaceControl;
4174 sp<SurfaceControl> mFGSurfaceControl;
4175
4176 // This surface is used to ensure that the buffers posted to
4177 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4178 sp<SurfaceControl> mSyncSurfaceControl;
4179};
4180
Robert Carr7f619b22017-11-06 12:56:35 -08004181TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004182
chaviw0e3479f2018-09-10 16:49:30 -07004183 std::unique_ptr<ScreenCapture> sc;
4184
4185 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004186 fillSurfaceRGBA8(relative, 10, 10, 10);
4187 waitForPostedBuffers();
4188
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004189 Transaction{}
4190 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004191 .setPosition(relative, 64, 64)
4192 .apply();
4193
4194 {
4195 // The relative should be on top of the FG control.
4196 ScreenCapture::captureScreen(&sc);
4197 sc->checkPixel(64, 64, 10, 10, 10);
4198 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004199 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004200
4201 {
4202 // Nothing should change at this point.
4203 ScreenCapture::captureScreen(&sc);
4204 sc->checkPixel(64, 64, 10, 10, 10);
4205 }
4206
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004207 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004208
4209 {
4210 // Ensure that the relative was actually hidden, rather than
4211 // being left in the detached but visible state.
4212 ScreenCapture::captureScreen(&sc);
4213 sc->expectFGColor(64, 64);
4214 }
4215}
4216
Robert Carr8d5227b2017-03-16 15:41:03 -07004217class GeometryLatchingTest : public LayerUpdateTest {
4218protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004219 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004220 SCOPED_TRACE(trace);
4221 ScreenCapture::captureScreen(&sc);
4222 // We find the leading edge of the FG surface.
4223 sc->expectFGColor(127, 127);
4224 sc->expectBGColor(128, 128);
4225 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004226
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004227 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004228
4229 void unlockFGBuffer() {
4230 sp<Surface> s = mFGSurfaceControl->getSurface();
4231 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4232 waitForPostedBuffers();
4233 }
4234
Robert Carr8d5227b2017-03-16 15:41:03 -07004235 void completeFGResize() {
4236 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4237 waitForPostedBuffers();
4238 }
4239 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004240 asTransaction([&](Transaction& t) {
4241 t.setSize(mFGSurfaceControl, 64, 64);
4242 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004243 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004244 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004245
4246 EXPECT_INITIAL_STATE("After restoring initial state");
4247 }
chaviw0e3479f2018-09-10 16:49:30 -07004248 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004249};
4250
Robert Carr8d5227b2017-03-16 15:41:03 -07004251class CropLatchingTest : public GeometryLatchingTest {
4252protected:
4253 void EXPECT_CROPPED_STATE(const char* trace) {
4254 SCOPED_TRACE(trace);
4255 ScreenCapture::captureScreen(&sc);
4256 // The edge should be moved back one pixel by our crop.
4257 sc->expectFGColor(126, 126);
4258 sc->expectBGColor(127, 127);
4259 sc->expectBGColor(128, 128);
4260 }
chaviw59f5c562017-06-28 16:39:06 -07004261
4262 void EXPECT_RESIZE_STATE(const char* trace) {
4263 SCOPED_TRACE(trace);
4264 ScreenCapture::captureScreen(&sc);
4265 // The FG is now resized too 128,128 at 64,64
4266 sc->expectFGColor(64, 64);
4267 sc->expectFGColor(191, 191);
4268 sc->expectBGColor(192, 192);
4269 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004270};
4271
Pablo Ceballos05289c22016-04-14 15:49:55 -07004272TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004273 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004274 {
4275 SCOPED_TRACE("before anything");
4276 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004277 sc->expectBGColor(32, 32);
4278 sc->expectFGColor(96, 96);
4279 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004280 }
4281
4282 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004283 asTransaction([&](Transaction& t) {
4284 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004285 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4286 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004287 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004288
Robert Carr4cdc58f2017-08-23 14:22:20 -07004289 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004290 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004291 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4292 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004293 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004294
4295 {
4296 SCOPED_TRACE("before any trigger");
4297 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004298 sc->expectBGColor(32, 32);
4299 sc->expectFGColor(96, 96);
4300 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004301 }
4302
4303 // should trigger the first deferred transaction, but not the second one
4304 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4305 {
4306 SCOPED_TRACE("after first trigger");
4307 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004308 sc->expectBGColor(32, 32);
4309 sc->checkPixel(96, 96, 162, 63, 96);
4310 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004311 }
4312
4313 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004314 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004315
4316 // trigger the second deferred transaction
4317 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4318 {
4319 SCOPED_TRACE("after second trigger");
4320 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004321 sc->expectBGColor(32, 32);
4322 sc->expectBGColor(96, 96);
4323 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004324 }
4325}
4326
Robert Carre392b552017-09-19 12:16:05 -07004327TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004328 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004329
4330 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004331 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4332 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4333 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4334 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004335 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004336 SurfaceComposerClient::Transaction{}
4337 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4338 .show(childNoBuffer)
4339 .show(childBuffer)
4340 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004341 {
4342 ScreenCapture::captureScreen(&sc);
4343 sc->expectChildColor(73, 73);
4344 sc->expectFGColor(74, 74);
4345 }
Vishnu Nair60356342018-11-13 13:00:45 -08004346 SurfaceComposerClient::Transaction{}
4347 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4348 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004349 {
4350 ScreenCapture::captureScreen(&sc);
4351 sc->expectChildColor(73, 73);
4352 sc->expectChildColor(74, 74);
4353 }
4354}
4355
Robert Carr2c5f6d22017-09-26 12:30:35 -07004356TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004357 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004358 {
4359 SCOPED_TRACE("before move");
4360 ScreenCapture::captureScreen(&sc);
4361 sc->expectBGColor(0, 12);
4362 sc->expectFGColor(75, 75);
4363 sc->expectBGColor(145, 145);
4364 }
4365
4366 Transaction t1, t2;
4367 t1.setPosition(mFGSurfaceControl, 128, 128);
4368 t2.setPosition(mFGSurfaceControl, 0, 0);
4369 // We expect that the position update from t2 now
4370 // overwrites the position update from t1.
4371 t1.merge(std::move(t2));
4372 t1.apply();
4373
4374 {
4375 ScreenCapture::captureScreen(&sc);
4376 sc->expectFGColor(1, 1);
4377 }
4378}
4379
Robert Carr1f0a16a2016-10-24 16:27:39 -07004380class ChildLayerTest : public LayerUpdateTest {
4381protected:
4382 void SetUp() override {
4383 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004384 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004385 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004386 fillSurfaceRGBA8(mChild, 200, 200, 200);
4387
4388 {
4389 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004390 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004391 mCapture->expectChildColor(64, 64);
4392 }
4393 }
4394 void TearDown() override {
4395 LayerUpdateTest::TearDown();
4396 mChild = 0;
4397 }
4398
4399 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004400 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004401};
4402
4403TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004404 asTransaction([&](Transaction& t) {
4405 t.show(mChild);
4406 t.setPosition(mChild, 10, 10);
4407 t.setPosition(mFGSurfaceControl, 64, 64);
4408 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004409
4410 {
chaviw0e3479f2018-09-10 16:49:30 -07004411 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004412 // Top left of foreground must now be visible
4413 mCapture->expectFGColor(64, 64);
4414 // But 10 pixels in we should see the child surface
4415 mCapture->expectChildColor(74, 74);
4416 // And 10 more pixels we should be back to the foreground surface
4417 mCapture->expectFGColor(84, 84);
4418 }
4419
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004420 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004421
4422 {
chaviw0e3479f2018-09-10 16:49:30 -07004423 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004424 // Top left of foreground should now be at 0, 0
4425 mCapture->expectFGColor(0, 0);
4426 // But 10 pixels in we should see the child surface
4427 mCapture->expectChildColor(10, 10);
4428 // And 10 more pixels we should be back to the foreground surface
4429 mCapture->expectFGColor(20, 20);
4430 }
4431}
4432
Robert Carr41b08b52017-06-01 16:11:34 -07004433TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004434 asTransaction([&](Transaction& t) {
4435 t.show(mChild);
4436 t.setPosition(mChild, 0, 0);
4437 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004438 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004439 });
Robert Carr41b08b52017-06-01 16:11:34 -07004440
4441 {
chaviw0e3479f2018-09-10 16:49:30 -07004442 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004443 mCapture->expectChildColor(0, 0);
4444 mCapture->expectChildColor(4, 4);
4445 mCapture->expectBGColor(5, 5);
4446 }
4447}
4448
Robert Carr1f0a16a2016-10-24 16:27:39 -07004449TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004450 asTransaction([&](Transaction& t) {
4451 t.show(mChild);
4452 t.setPosition(mFGSurfaceControl, 0, 0);
4453 t.setPosition(mChild, 63, 63);
4454 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004455
4456 {
chaviw0e3479f2018-09-10 16:49:30 -07004457 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004458 mCapture->expectFGColor(0, 0);
4459 // Last pixel in foreground should now be the child.
4460 mCapture->expectChildColor(63, 63);
4461 // But the child should be constrained and the next pixel
4462 // must be the background
4463 mCapture->expectBGColor(64, 64);
4464 }
4465}
4466
4467TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004468 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004469
4470 // Find the boundary between the parent and child
4471 {
chaviw0e3479f2018-09-10 16:49:30 -07004472 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004473 mCapture->expectChildColor(9, 9);
4474 mCapture->expectFGColor(10, 10);
4475 }
4476
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004477 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004478
4479 // The boundary should be twice as far from the origin now.
4480 // The pixels from the last test should all be child now
4481 {
chaviw0e3479f2018-09-10 16:49:30 -07004482 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004483 mCapture->expectChildColor(9, 9);
4484 mCapture->expectChildColor(10, 10);
4485 mCapture->expectChildColor(19, 19);
4486 mCapture->expectFGColor(20, 20);
4487 }
4488}
Robert Carr9524cb32017-02-13 11:32:32 -08004489
Vishnu Nairc652ff82019-03-15 12:48:54 -07004490// A child with a scale transform should be cropped by its parent bounds.
4491TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4492 asTransaction([&](Transaction& t) {
4493 t.setPosition(mFGSurfaceControl, 0, 0);
4494 t.setPosition(mChild, 0, 0);
4495 });
4496
4497 // Find the boundary between the parent and child.
4498 {
4499 mCapture = screenshot();
4500 mCapture->expectChildColor(0, 0);
4501 mCapture->expectChildColor(9, 9);
4502 mCapture->expectFGColor(10, 10);
4503 }
4504
4505 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4506
4507 // The child should fill its parent bounds and be cropped by it.
4508 {
4509 mCapture = screenshot();
4510 mCapture->expectChildColor(0, 0);
4511 mCapture->expectChildColor(63, 63);
4512 mCapture->expectBGColor(64, 64);
4513 }
4514}
4515
Robert Carr6452f122017-03-21 10:41:29 -07004516TEST_F(ChildLayerTest, ChildLayerAlpha) {
4517 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4518 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4519 fillSurfaceRGBA8(mChild, 0, 254, 0);
4520 waitForPostedBuffers();
4521
Robert Carr4cdc58f2017-08-23 14:22:20 -07004522 asTransaction([&](Transaction& t) {
4523 t.show(mChild);
4524 t.setPosition(mChild, 0, 0);
4525 t.setPosition(mFGSurfaceControl, 0, 0);
4526 });
Robert Carr6452f122017-03-21 10:41:29 -07004527
4528 {
chaviw0e3479f2018-09-10 16:49:30 -07004529 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004530 // Unblended child color
4531 mCapture->checkPixel(0, 0, 0, 254, 0);
4532 }
4533
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004534 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004535
4536 {
chaviw0e3479f2018-09-10 16:49:30 -07004537 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004538 // Child and BG blended.
4539 mCapture->checkPixel(0, 0, 127, 127, 0);
4540 }
4541
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004542 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004543
4544 {
chaviw0e3479f2018-09-10 16:49:30 -07004545 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004546 // Child and BG blended.
4547 mCapture->checkPixel(0, 0, 95, 64, 95);
4548 }
4549}
4550
Robert Carr9524cb32017-02-13 11:32:32 -08004551TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004552 asTransaction([&](Transaction& t) {
4553 t.show(mChild);
4554 t.setPosition(mChild, 10, 10);
4555 t.setPosition(mFGSurfaceControl, 64, 64);
4556 });
Robert Carr9524cb32017-02-13 11:32:32 -08004557
4558 {
chaviw0e3479f2018-09-10 16:49:30 -07004559 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004560 // Top left of foreground must now be visible
4561 mCapture->expectFGColor(64, 64);
4562 // But 10 pixels in we should see the child surface
4563 mCapture->expectChildColor(74, 74);
4564 // And 10 more pixels we should be back to the foreground surface
4565 mCapture->expectFGColor(84, 84);
4566 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004567
4568 asTransaction([&](Transaction& t) {
4569 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4570 });
4571
Robert Carr9524cb32017-02-13 11:32:32 -08004572 {
chaviw0e3479f2018-09-10 16:49:30 -07004573 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004574 mCapture->expectFGColor(64, 64);
4575 // In reparenting we should have exposed the entire foreground surface.
4576 mCapture->expectFGColor(74, 74);
4577 // And the child layer should now begin at 10, 10 (since the BG
4578 // layer is at (0, 0)).
4579 mCapture->expectBGColor(9, 9);
4580 mCapture->expectChildColor(10, 10);
4581 }
4582}
4583
Robert Carr2e102c92018-10-23 12:11:15 -07004584TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4585 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004586 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004587 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4588
4589 {
4590 SCOPED_TRACE("Grandchild visible");
4591 ScreenCapture::captureScreen(&mCapture);
4592 mCapture->checkPixel(64, 64, 111, 111, 111);
4593 }
4594
Robert Carr87246532019-02-04 15:20:26 -08004595 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004596
4597 {
4598 SCOPED_TRACE("After destroying child");
4599 ScreenCapture::captureScreen(&mCapture);
4600 mCapture->expectFGColor(64, 64);
4601 }
4602
4603 asTransaction([&](Transaction& t) {
4604 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4605 });
4606
4607 {
4608 SCOPED_TRACE("After reparenting grandchild");
4609 ScreenCapture::captureScreen(&mCapture);
4610 mCapture->checkPixel(64, 64, 111, 111, 111);
4611 }
4612}
4613
chaviw161410b02017-07-27 10:46:08 -07004614TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004615 asTransaction([&](Transaction& t) {
4616 t.show(mChild);
4617 t.setPosition(mChild, 10, 10);
4618 t.setPosition(mFGSurfaceControl, 64, 64);
4619 });
Robert Carr9524cb32017-02-13 11:32:32 -08004620
4621 {
chaviw0e3479f2018-09-10 16:49:30 -07004622 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004623 // Top left of foreground must now be visible
4624 mCapture->expectFGColor(64, 64);
4625 // But 10 pixels in we should see the child surface
4626 mCapture->expectChildColor(74, 74);
4627 // And 10 more pixels we should be back to the foreground surface
4628 mCapture->expectFGColor(84, 84);
4629 }
4630
chaviw0e3479f2018-09-10 16:49:30 -07004631
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004632 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004633
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004634 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004635
chaviw161410b02017-07-27 10:46:08 -07004636 // Since the child has the same client as the parent, it will not get
4637 // detached and will be hidden.
4638 {
chaviw0e3479f2018-09-10 16:49:30 -07004639 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004640 mCapture->expectFGColor(64, 64);
4641 mCapture->expectFGColor(74, 74);
4642 mCapture->expectFGColor(84, 84);
4643 }
4644}
4645
4646TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4647 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004648 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004649 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4650 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004651
chaviw161410b02017-07-27 10:46:08 -07004652 ASSERT_TRUE(mChildNewClient->isValid());
4653
4654 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4655
Robert Carr4cdc58f2017-08-23 14:22:20 -07004656 asTransaction([&](Transaction& t) {
4657 t.hide(mChild);
4658 t.show(mChildNewClient);
4659 t.setPosition(mChildNewClient, 10, 10);
4660 t.setPosition(mFGSurfaceControl, 64, 64);
4661 });
chaviw161410b02017-07-27 10:46:08 -07004662
4663 {
chaviw0e3479f2018-09-10 16:49:30 -07004664 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004665 // Top left of foreground must now be visible
4666 mCapture->expectFGColor(64, 64);
4667 // But 10 pixels in we should see the child surface
4668 mCapture->expectChildColor(74, 74);
4669 // And 10 more pixels we should be back to the foreground surface
4670 mCapture->expectFGColor(84, 84);
4671 }
4672
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004673 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004674
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004675 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004676
Robert Carr9524cb32017-02-13 11:32:32 -08004677 // Nothing should have changed.
4678 {
chaviw0e3479f2018-09-10 16:49:30 -07004679 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004680 mCapture->expectFGColor(64, 64);
4681 mCapture->expectChildColor(74, 74);
4682 mCapture->expectFGColor(84, 84);
4683 }
4684}
4685
chaviw5aedec92018-10-22 10:40:38 -07004686TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4687 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4688 sp<SurfaceControl> childNewClient =
4689 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4690 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4691
4692 ASSERT_TRUE(childNewClient != nullptr);
4693 ASSERT_TRUE(childNewClient->isValid());
4694
4695 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4696
4697 Transaction()
4698 .hide(mChild)
4699 .show(childNewClient)
4700 .setPosition(childNewClient, 10, 10)
4701 .setPosition(mFGSurfaceControl, 64, 64)
4702 .apply();
4703
4704 {
4705 mCapture = screenshot();
4706 // Top left of foreground must now be visible
4707 mCapture->expectFGColor(64, 64);
4708 // But 10 pixels in we should see the child surface
4709 mCapture->expectChildColor(74, 74);
4710 // And 10 more pixels we should be back to the foreground surface
4711 mCapture->expectFGColor(84, 84);
4712 }
4713
4714 Transaction().detachChildren(mFGSurfaceControl).apply();
4715 Transaction().hide(childNewClient).apply();
4716
4717 // Nothing should have changed.
4718 {
4719 mCapture = screenshot();
4720 mCapture->expectFGColor(64, 64);
4721 mCapture->expectChildColor(74, 74);
4722 mCapture->expectFGColor(84, 84);
4723 }
4724
4725 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4726 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4727 32);
4728 Transaction()
4729 .setLayer(newParentSurface, INT32_MAX - 1)
4730 .show(newParentSurface)
4731 .setPosition(newParentSurface, 20, 20)
4732 .reparent(childNewClient, newParentSurface->getHandle())
4733 .apply();
4734 {
4735 mCapture = screenshot();
4736 // Child is now hidden.
4737 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4738 }
4739}
chaviw43cb3cb2019-05-31 15:23:41 -07004740TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
4741 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4742 sp<SurfaceControl> childNewClient =
4743 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4744 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4745
4746 ASSERT_TRUE(childNewClient != nullptr);
4747 ASSERT_TRUE(childNewClient->isValid());
4748
4749 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4750
4751 Transaction()
4752 .hide(mChild)
4753 .show(childNewClient)
4754 .setPosition(childNewClient, 10, 10)
4755 .setPosition(mFGSurfaceControl, 64, 64)
4756 .apply();
4757
4758 {
4759 mCapture = screenshot();
4760 Rect rect = Rect(74, 74, 84, 84);
4761 mCapture->expectBorder(rect, Color{195, 63, 63, 255});
4762 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4763 }
4764
4765 Transaction()
4766 .deferTransactionUntil_legacy(childNewClient, mFGSurfaceControl->getHandle(),
4767 mFGSurfaceControl->getSurface()->getNextFrameNumber())
4768 .apply();
4769 Transaction().detachChildren(mFGSurfaceControl).apply();
4770 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(mFGSurfaceControl, Color::RED, 32, 32));
4771
4772 // BufferLayer can still dequeue buffers even though there's a detached layer with a
4773 // deferred transaction.
4774 {
4775 SCOPED_TRACE("new buffer");
4776 mCapture = screenshot();
4777 Rect rect = Rect(74, 74, 84, 84);
4778 mCapture->expectBorder(rect, Color::RED);
4779 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4780 }
4781}
chaviw5aedec92018-10-22 10:40:38 -07004782
Robert Carr9b429f42017-04-17 14:56:57 -07004783TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004784 asTransaction([&](Transaction& t) {
4785 t.show(mChild);
4786 t.setPosition(mChild, 0, 0);
4787 t.setPosition(mFGSurfaceControl, 0, 0);
4788 });
Robert Carr9b429f42017-04-17 14:56:57 -07004789
4790 {
chaviw0e3479f2018-09-10 16:49:30 -07004791 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004792 // We've positioned the child in the top left.
4793 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004794 // But it's only 10x15.
4795 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004796 }
4797
Robert Carr4cdc58f2017-08-23 14:22:20 -07004798 asTransaction([&](Transaction& t) {
4799 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4800 // We cause scaling by 2.
4801 t.setSize(mFGSurfaceControl, 128, 128);
4802 });
Robert Carr9b429f42017-04-17 14:56:57 -07004803
4804 {
chaviw0e3479f2018-09-10 16:49:30 -07004805 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004806 // We've positioned the child in the top left.
4807 mCapture->expectChildColor(0, 0);
4808 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004809 mCapture->expectChildColor(19, 29);
4810 // And now it should be scaled all the way to 20x30
4811 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004812 }
4813}
4814
Robert Carr1725eee2017-04-26 18:32:15 -07004815// Regression test for b/37673612
4816TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004817 asTransaction([&](Transaction& t) {
4818 t.show(mChild);
4819 t.setPosition(mChild, 0, 0);
4820 t.setPosition(mFGSurfaceControl, 0, 0);
4821 });
Robert Carr1725eee2017-04-26 18:32:15 -07004822
4823 {
chaviw0e3479f2018-09-10 16:49:30 -07004824 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004825 // We've positioned the child in the top left.
4826 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004827 mCapture->expectChildColor(9, 14);
4828 // But it's only 10x15.
4829 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004830 }
Robert Carr1725eee2017-04-26 18:32:15 -07004831 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4832 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004833 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004834 sp<Surface> s = mFGSurfaceControl->getSurface();
4835 auto anw = static_cast<ANativeWindow*>(s.get());
4836 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4837 native_window_set_buffers_dimensions(anw, 64, 128);
4838 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4839 waitForPostedBuffers();
4840
4841 {
4842 // The child should still be in the same place and not have any strange scaling as in
4843 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004844 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004845 mCapture->expectChildColor(0, 0);
4846 mCapture->expectFGColor(10, 10);
4847 }
4848}
4849
Vishnu Nairc652ff82019-03-15 12:48:54 -07004850// A child with a buffer transform from its parents should be cropped by its parent bounds.
4851TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4852 asTransaction([&](Transaction& t) {
4853 t.show(mChild);
4854 t.setPosition(mChild, 0, 0);
4855 t.setPosition(mFGSurfaceControl, 0, 0);
4856 t.setSize(mChild, 100, 100);
4857 });
4858 fillSurfaceRGBA8(mChild, 200, 200, 200);
4859
4860 {
4861 mCapture = screenshot();
4862
4863 mCapture->expectChildColor(0, 0);
4864 mCapture->expectChildColor(63, 63);
4865 mCapture->expectBGColor(64, 64);
4866 }
4867
4868 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4869 sp<Surface> s = mFGSurfaceControl->getSurface();
4870 auto anw = static_cast<ANativeWindow*>(s.get());
4871 // Apply a 90 transform on the buffer.
4872 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4873 native_window_set_buffers_dimensions(anw, 64, 128);
4874 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4875 waitForPostedBuffers();
4876
4877 // The child should be cropped by the new parent bounds.
4878 {
4879 mCapture = screenshot();
4880 mCapture->expectChildColor(0, 0);
4881 mCapture->expectChildColor(99, 63);
4882 mCapture->expectFGColor(100, 63);
4883 mCapture->expectBGColor(128, 64);
4884 }
4885}
4886
4887// A child with a scale transform from its parents should be cropped by its parent bounds.
4888TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4889 asTransaction([&](Transaction& t) {
4890 t.show(mChild);
4891 t.setPosition(mChild, 0, 0);
4892 t.setPosition(mFGSurfaceControl, 0, 0);
4893 t.setSize(mChild, 200, 200);
4894 });
4895 fillSurfaceRGBA8(mChild, 200, 200, 200);
4896
4897 {
4898 mCapture = screenshot();
4899
4900 mCapture->expectChildColor(0, 0);
4901 mCapture->expectChildColor(63, 63);
4902 mCapture->expectBGColor(64, 64);
4903 }
4904
4905 asTransaction([&](Transaction& t) {
4906 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4907 // Set a scaling by 2.
4908 t.setSize(mFGSurfaceControl, 128, 128);
4909 });
4910
4911 // Child should inherit its parents scale but should be cropped by its parent bounds.
4912 {
4913 mCapture = screenshot();
4914 mCapture->expectChildColor(0, 0);
4915 mCapture->expectChildColor(127, 127);
4916 mCapture->expectBGColor(128, 128);
4917 }
4918}
4919
4920// Regression test for b/127368943
4921// Child should ignore the buffer transform but apply parent scale transform.
4922TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
4923 asTransaction([&](Transaction& t) {
4924 t.show(mChild);
4925 t.setPosition(mChild, 0, 0);
4926 t.setPosition(mFGSurfaceControl, 0, 0);
4927 });
4928
4929 {
4930 mCapture = screenshot();
4931 mCapture->expectChildColor(0, 0);
4932 mCapture->expectChildColor(9, 14);
4933 mCapture->expectFGColor(10, 15);
4934 }
4935
4936 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
4937 asTransaction([&](Transaction& t) {
4938 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4939 t.setSize(mFGSurfaceControl, 128, 64);
4940 });
4941 sp<Surface> s = mFGSurfaceControl->getSurface();
4942 auto anw = static_cast<ANativeWindow*>(s.get());
4943 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
4944 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
4945 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4946 native_window_set_buffers_dimensions(anw, 32, 64);
4947 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4948 waitForPostedBuffers();
4949
4950 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
4951 {
4952 mCapture = screenshot();
4953 mCapture->expectChildColor(0, 0);
4954 mCapture->expectChildColor(19, 29);
4955 mCapture->expectFGColor(20, 30);
4956 }
4957}
4958
Dan Stoza412903f2017-04-27 13:42:17 -07004959TEST_F(ChildLayerTest, Bug36858924) {
4960 // Destroy the child layer
4961 mChild.clear();
4962
4963 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004964 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4965 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004966
4967 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004968 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004969 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4970 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004971 t.show(mChild);
4972 });
Dan Stoza412903f2017-04-27 13:42:17 -07004973
4974 // Render the foreground surface a few times
4975 //
4976 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4977 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4978 // never acquire/release the first buffer
4979 ALOGI("Filling 1");
4980 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4981 ALOGI("Filling 2");
4982 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4983 ALOGI("Filling 3");
4984 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4985 ALOGI("Filling 4");
4986 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4987}
4988
chaviwf1961f72017-09-18 16:41:07 -07004989TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004990 asTransaction([&](Transaction& t) {
4991 t.show(mChild);
4992 t.setPosition(mChild, 10, 10);
4993 t.setPosition(mFGSurfaceControl, 64, 64);
4994 });
chaviw06178942017-07-27 10:25:59 -07004995
4996 {
chaviw0e3479f2018-09-10 16:49:30 -07004997 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004998 // Top left of foreground must now be visible
4999 mCapture->expectFGColor(64, 64);
5000 // But 10 pixels in we should see the child surface
5001 mCapture->expectChildColor(74, 74);
5002 // And 10 more pixels we should be back to the foreground surface
5003 mCapture->expectFGColor(84, 84);
5004 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07005005
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005006 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07005007
chaviw06178942017-07-27 10:25:59 -07005008 {
chaviw0e3479f2018-09-10 16:49:30 -07005009 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005010 mCapture->expectFGColor(64, 64);
5011 // In reparenting we should have exposed the entire foreground surface.
5012 mCapture->expectFGColor(74, 74);
5013 // And the child layer should now begin at 10, 10 (since the BG
5014 // layer is at (0, 0)).
5015 mCapture->expectBGColor(9, 9);
5016 mCapture->expectChildColor(10, 10);
5017 }
5018}
5019
chaviwf1961f72017-09-18 16:41:07 -07005020TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005021 asTransaction([&](Transaction& t) {
5022 t.show(mChild);
5023 t.setPosition(mChild, 10, 10);
5024 t.setPosition(mFGSurfaceControl, 64, 64);
5025 });
chaviwf1961f72017-09-18 16:41:07 -07005026
5027 {
chaviw0e3479f2018-09-10 16:49:30 -07005028 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005029 // Top left of foreground must now be visible
5030 mCapture->expectFGColor(64, 64);
5031 // But 10 pixels in we should see the child surface
5032 mCapture->expectChildColor(74, 74);
5033 // And 10 more pixels we should be back to the foreground surface
5034 mCapture->expectFGColor(84, 84);
5035 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005036 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07005037 {
chaviw0e3479f2018-09-10 16:49:30 -07005038 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005039 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07005040 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005041 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07005042 mCapture->expectFGColor(84, 84);
5043 }
5044}
5045
5046TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07005047 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08005048 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07005049 ASSERT_TRUE(newSurface->isValid());
5050
5051 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005052 asTransaction([&](Transaction& t) {
5053 t.hide(mChild);
5054 t.show(newSurface);
5055 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005056 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005057 t.setPosition(mFGSurfaceControl, 64, 64);
5058 });
chaviwf1961f72017-09-18 16:41:07 -07005059
5060 {
chaviw0e3479f2018-09-10 16:49:30 -07005061 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005062 // Top left of foreground must now be visible
5063 mCapture->expectFGColor(64, 64);
5064 // At 10, 10 we should see the new surface
5065 mCapture->checkPixel(10, 10, 63, 195, 63);
5066 }
5067
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005068 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07005069
5070 {
chaviw0e3479f2018-09-10 16:49:30 -07005071 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005072 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
5073 // mFGSurface, putting it at 74, 74.
5074 mCapture->expectFGColor(64, 64);
5075 mCapture->checkPixel(74, 74, 63, 195, 63);
5076 mCapture->expectFGColor(84, 84);
5077 }
5078}
5079
chaviwc9674332017-08-28 12:32:18 -07005080TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005081 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
5082 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07005083 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5084
5085 {
chaviw0e3479f2018-09-10 16:49:30 -07005086 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07005087 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
5088 // which begins at 64, 64
5089 mCapture->checkPixel(64, 64, 50, 50, 50);
5090 }
5091}
5092
Robert Carr503c7042017-09-27 15:06:08 -07005093TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005094 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07005095 fillSurfaceRGBA8(relative, 255, 255, 255);
5096
5097 Transaction t;
5098 t.setLayer(relative, INT32_MAX)
5099 .setRelativeLayer(mChild, relative->getHandle(), 1)
5100 .setPosition(mFGSurfaceControl, 0, 0)
5101 .apply(true);
5102
5103 // We expect that the child should have been elevated above our
5104 // INT_MAX layer even though it's not a child of it.
5105 {
chaviw0e3479f2018-09-10 16:49:30 -07005106 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005107 mCapture->expectChildColor(0, 0);
5108 mCapture->expectChildColor(9, 9);
5109 mCapture->checkPixel(10, 10, 255, 255, 255);
5110 }
5111}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005112
Vishnu Nair60356342018-11-13 13:00:45 -08005113class BoundlessLayerTest : public LayerUpdateTest {
5114protected:
5115 std::unique_ptr<ScreenCapture> mCapture;
5116};
5117
5118// Verify setting a size on a buffer layer has no effect.
5119TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5120 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005121 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5122 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005123 ASSERT_TRUE(bufferLayer->isValid());
5124 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5125 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5126 {
5127 mCapture = screenshot();
5128 // Top left of background must now be visible
5129 mCapture->expectBGColor(0, 0);
5130 // Foreground Surface bounds must be color layer
5131 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5132 // Buffer layer should not extend past buffer bounds
5133 mCapture->expectFGColor(95, 95);
5134 }
5135}
5136
5137// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5138// which will crop the color layer.
5139TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5140 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005141 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5142 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005143 ASSERT_TRUE(colorLayer->isValid());
5144 asTransaction([&](Transaction& t) {
5145 t.setColor(colorLayer, half3{0, 0, 0});
5146 t.show(colorLayer);
5147 });
5148 {
5149 mCapture = screenshot();
5150 // Top left of background must now be visible
5151 mCapture->expectBGColor(0, 0);
5152 // Foreground Surface bounds must be color layer
5153 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5154 // Color layer should not extend past foreground bounds
5155 mCapture->expectBGColor(129, 129);
5156 }
5157}
5158
5159// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5160// a crop which will be used to crop the color layer.
5161TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005162 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5163 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005164 ASSERT_TRUE(cropLayer->isValid());
5165 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005166 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5167 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005168 ASSERT_TRUE(colorLayer->isValid());
5169 asTransaction([&](Transaction& t) {
5170 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5171 t.setColor(colorLayer, half3{0, 0, 0});
5172 t.show(cropLayer);
5173 t.show(colorLayer);
5174 });
5175 {
5176 mCapture = screenshot();
5177 // Top left of background must now be visible
5178 mCapture->expectBGColor(0, 0);
5179 // Top left of foreground must now be visible
5180 mCapture->expectFGColor(64, 64);
5181 // 5 pixels from the foreground we should see the child surface
5182 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5183 // 10 pixels from the foreground we should be back to the foreground surface
5184 mCapture->expectFGColor(74, 74);
5185 }
5186}
5187
5188// Verify for boundless layer with no children, their transforms have no effect.
5189TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5190 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005191 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5192 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005193 ASSERT_TRUE(colorLayer->isValid());
5194 asTransaction([&](Transaction& t) {
5195 t.setPosition(colorLayer, 320, 320);
5196 t.setMatrix(colorLayer, 2, 0, 0, 2);
5197 t.setColor(colorLayer, half3{0, 0, 0});
5198 t.show(colorLayer);
5199 });
5200 {
5201 mCapture = screenshot();
5202 // Top left of background must now be visible
5203 mCapture->expectBGColor(0, 0);
5204 // Foreground Surface bounds must be color layer
5205 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5206 // Color layer should not extend past foreground bounds
5207 mCapture->expectBGColor(129, 129);
5208 }
5209}
5210
5211// Verify for boundless layer with children, their transforms have an effect.
5212TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5213 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005214 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5215 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005216 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5217 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005218 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5219 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005220 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5221 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005222 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5223 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005224 ASSERT_TRUE(colorLayer->isValid());
5225 asTransaction([&](Transaction& t) {
5226 t.setPosition(boundlessLayerRightShift, 32, 0);
5227 t.show(boundlessLayerRightShift);
5228 t.setPosition(boundlessLayerDownShift, 0, 32);
5229 t.show(boundlessLayerDownShift);
5230 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5231 t.setColor(colorLayer, half3{0, 0, 0});
5232 t.show(colorLayer);
5233 });
5234 {
5235 mCapture = screenshot();
5236 // Top left of background must now be visible
5237 mCapture->expectBGColor(0, 0);
5238 // Top left of foreground must now be visible
5239 mCapture->expectFGColor(64, 64);
5240 // Foreground Surface bounds must be color layer
5241 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5242 // Color layer should not extend past foreground bounds
5243 mCapture->expectBGColor(129, 129);
5244 }
5245}
5246
5247// Verify child layers do not get clipped if they temporarily move into the negative
5248// coordinate space as the result of an intermediate transformation.
5249TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5250 sp<SurfaceControl> boundlessLayer =
5251 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5252 0 /* flags */, mFGSurfaceControl.get());
5253 ASSERT_TRUE(boundlessLayer != nullptr);
5254 ASSERT_TRUE(boundlessLayer->isValid());
5255 sp<SurfaceControl> colorLayer =
5256 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5257 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5258 ASSERT_TRUE(colorLayer != nullptr);
5259 ASSERT_TRUE(colorLayer->isValid());
5260 asTransaction([&](Transaction& t) {
5261 // shift child layer off bounds. If this layer was not boundless, we will
5262 // expect the child layer to be cropped.
5263 t.setPosition(boundlessLayer, 32, 32);
5264 t.show(boundlessLayer);
5265 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5266 // undo shift by parent
5267 t.setPosition(colorLayer, -32, -32);
5268 t.setColor(colorLayer, half3{0, 0, 0});
5269 t.show(colorLayer);
5270 });
5271 {
5272 mCapture = screenshot();
5273 // Top left of background must now be visible
5274 mCapture->expectBGColor(0, 0);
5275 // Foreground Surface bounds must be color layer
5276 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5277 // Color layer should not extend past foreground bounds
5278 mCapture->expectBGColor(129, 129);
5279 }
5280}
5281
5282// Verify for boundless root layers with children, their transforms have an effect.
5283TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005284 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5285 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005286 ASSERT_TRUE(rootBoundlessLayer->isValid());
5287 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005288 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5289 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5290
Vishnu Nair60356342018-11-13 13:00:45 -08005291 ASSERT_TRUE(colorLayer->isValid());
5292 asTransaction([&](Transaction& t) {
5293 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5294 t.setPosition(rootBoundlessLayer, 32, 32);
5295 t.show(rootBoundlessLayer);
5296 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5297 t.setColor(colorLayer, half3{0, 0, 0});
5298 t.show(colorLayer);
5299 t.hide(mFGSurfaceControl);
5300 });
5301 {
5302 mCapture = screenshot();
5303 // Top left of background must now be visible
5304 mCapture->expectBGColor(0, 0);
5305 // Top left of foreground must now be visible
5306 mCapture->expectBGColor(31, 31);
5307 // Foreground Surface bounds must be color layer
5308 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5309 // Color layer should not extend past foreground bounds
5310 mCapture->expectBGColor(97, 97);
5311 }
5312}
Robert Carr503c7042017-09-27 15:06:08 -07005313
chaviwa76b2712017-09-20 12:02:26 -07005314class ScreenCaptureTest : public LayerUpdateTest {
5315protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005316 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005317};
5318
5319TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5320 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005321 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005322 mCapture->expectBGColor(0, 0);
5323 // Doesn't capture FG layer which is at 64, 64
5324 mCapture->expectBGColor(64, 64);
5325}
5326
5327TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5328 auto fgHandle = mFGSurfaceControl->getHandle();
5329
Vishnu Nair88a11f22018-11-28 18:30:57 -08005330 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5331 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005332 fillSurfaceRGBA8(child, 200, 200, 200);
5333
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005334 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005335
5336 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005337 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005338 mCapture->expectFGColor(10, 10);
5339 mCapture->expectChildColor(0, 0);
5340}
5341
Robert Carr578038f2018-03-09 12:25:24 -08005342TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5343 auto fgHandle = mFGSurfaceControl->getHandle();
5344
Vishnu Nair88a11f22018-11-28 18:30:57 -08005345 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5346 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005347 fillSurfaceRGBA8(child, 200, 200, 200);
5348
5349 SurfaceComposerClient::Transaction().show(child).apply(true);
5350
5351 // Captures mFGSurfaceControl's child
5352 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5353 mCapture->checkPixel(10, 10, 0, 0, 0);
5354 mCapture->expectChildColor(0, 0);
5355}
5356
Robert Carr866455f2019-04-02 16:28:26 -07005357TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5358 auto fgHandle = mFGSurfaceControl->getHandle();
5359
5360 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5361 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5362 fillSurfaceRGBA8(child, 200, 200, 200);
5363 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5364 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5365 fillSurfaceRGBA8(child2, 200, 0, 200);
5366
5367 SurfaceComposerClient::Transaction()
5368 .show(child)
5369 .show(child2)
5370 .setLayer(child, 1)
5371 .setLayer(child2, 2)
5372 .apply(true);
5373
5374 // Child2 would be visible but its excluded, so we should see child1 color instead.
5375 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5376 mCapture->checkPixel(10, 10, 0, 0, 0);
5377 mCapture->checkPixel(0, 0, 200, 200, 200);
5378}
5379
5380// Like the last test but verifies that children are also exclude.
5381TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5382 auto fgHandle = mFGSurfaceControl->getHandle();
5383
5384 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5385 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5386 fillSurfaceRGBA8(child, 200, 200, 200);
5387 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5388 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5389 fillSurfaceRGBA8(child2, 200, 0, 200);
5390 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5391 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5392 fillSurfaceRGBA8(child2, 200, 0, 200);
5393
5394 SurfaceComposerClient::Transaction()
5395 .show(child)
5396 .show(child2)
5397 .show(child3)
5398 .setLayer(child, 1)
5399 .setLayer(child2, 2)
5400 .apply(true);
5401
5402 // Child2 would be visible but its excluded, so we should see child1 color instead.
5403 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5404 mCapture->checkPixel(10, 10, 0, 0, 0);
5405 mCapture->checkPixel(0, 0, 200, 200, 200);
5406}
5407
chaviw50da5042018-04-09 13:49:37 -07005408TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005409 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5410 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005411
5412 fillSurfaceRGBA8(child, 200, 200, 200);
5413
5414 SurfaceComposerClient::Transaction().show(child).apply(true);
5415
5416 auto childHandle = child->getHandle();
5417
5418 // Captures child
5419 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5420 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5421 // Area outside of child's bounds is transparent.
5422 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5423}
5424
chaviw4b129c22018-04-09 16:19:43 -07005425TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5426 auto fgHandle = mFGSurfaceControl->getHandle();
5427
Vishnu Nair88a11f22018-11-28 18:30:57 -08005428 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5429 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5430 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005431 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005432 fillSurfaceRGBA8(child, 200, 200, 200);
5433 fillSurfaceRGBA8(relative, 100, 100, 100);
5434
5435 SurfaceComposerClient::Transaction()
5436 .show(child)
5437 // Set relative layer above fg layer so should be shown above when computing all layers.
5438 .setRelativeLayer(relative, fgHandle, 1)
5439 .show(relative)
5440 .apply(true);
5441
5442 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5443 ScreenCapture::captureLayers(&mCapture, fgHandle);
5444 mCapture->expectFGColor(10, 10);
5445 mCapture->expectChildColor(0, 0);
5446}
5447
5448TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5449 auto fgHandle = mFGSurfaceControl->getHandle();
5450
Vishnu Nair88a11f22018-11-28 18:30:57 -08005451 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5452 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5453 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5454 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005455 fillSurfaceRGBA8(child, 200, 200, 200);
5456 fillSurfaceRGBA8(relative, 100, 100, 100);
5457
5458 SurfaceComposerClient::Transaction()
5459 .show(child)
5460 // Set relative layer below fg layer but relative to child layer so it should be shown
5461 // above child layer.
5462 .setLayer(relative, -1)
5463 .setRelativeLayer(relative, child->getHandle(), 1)
5464 .show(relative)
5465 .apply(true);
5466
5467 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5468 // relative value should be taken into account, placing it above child layer.
5469 ScreenCapture::captureLayers(&mCapture, fgHandle);
5470 mCapture->expectFGColor(10, 10);
5471 // Relative layer is showing on top of child layer
5472 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5473}
Robert Carr578038f2018-03-09 12:25:24 -08005474
5475// In the following tests we verify successful skipping of a parent layer,
5476// so we use the same verification logic and only change how we mutate
5477// the parent layer to verify that various properties are ignored.
5478class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5479public:
5480 void SetUp() override {
5481 LayerUpdateTest::SetUp();
5482
Vishnu Nair88a11f22018-11-28 18:30:57 -08005483 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5484 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005485 fillSurfaceRGBA8(mChild, 200, 200, 200);
5486
5487 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5488 }
5489
Vishnu Nair333a9572019-02-15 16:05:56 -08005490 void verify(std::function<void()> verifyStartingState) {
5491 // Verify starting state before a screenshot is taken.
5492 verifyStartingState();
5493
5494 // Verify child layer does not inherit any of the properties of its
5495 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005496 auto fgHandle = mFGSurfaceControl->getHandle();
5497 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5498 mCapture->checkPixel(10, 10, 0, 0, 0);
5499 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005500
5501 // Verify all assumptions are still true after the screenshot is taken.
5502 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005503 }
5504
5505 std::unique_ptr<ScreenCapture> mCapture;
5506 sp<SurfaceControl> mChild;
5507};
5508
Vishnu Nair333a9572019-02-15 16:05:56 -08005509// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005510TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5511
5512 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5513
5514 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005515
5516 // Before and after reparenting, verify child is properly hidden
5517 // when rendering full-screen.
5518 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005519}
5520
5521TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005522 SurfaceComposerClient::Transaction()
5523 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5524 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005525
5526 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005527
5528 // Before and after reparenting, verify child is cropped by parent.
5529 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005530}
5531
Vishnu Nair333a9572019-02-15 16:05:56 -08005532// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005533TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005534 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005535
5536 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005537
Vishnu Nair333a9572019-02-15 16:05:56 -08005538 // Before and after reparenting, verify child is properly scaled.
5539 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005540}
5541
5542
chaviwa76b2712017-09-20 12:02:26 -07005543TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5544 auto fgHandle = mFGSurfaceControl->getHandle();
5545
Vishnu Nair88a11f22018-11-28 18:30:57 -08005546 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5547 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005548 fillSurfaceRGBA8(child, 200, 200, 200);
5549
Vishnu Nair88a11f22018-11-28 18:30:57 -08005550 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5551 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005552
5553 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5554 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005555 .show(child)
5556 .setPosition(grandchild, 5, 5)
5557 .show(grandchild)
5558 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005559
5560 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005561 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005562 mCapture->expectFGColor(10, 10);
5563 mCapture->expectChildColor(0, 0);
5564 mCapture->checkPixel(5, 5, 50, 50, 50);
5565}
5566
5567TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005568 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5569 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005570 fillSurfaceRGBA8(child, 200, 200, 200);
5571 auto childHandle = child->getHandle();
5572
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005573 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005574
5575 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005576 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005577 mCapture->expectChildColor(0, 0);
5578 mCapture->expectChildColor(9, 9);
5579}
5580
5581TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005582 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5583 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005584 fillSurfaceRGBA8(child, 200, 200, 200);
5585 auto childHandle = child->getHandle();
5586
Vishnu Nair88a11f22018-11-28 18:30:57 -08005587 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5588 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005589 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5590
5591 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005592 .show(child)
5593 .setPosition(grandchild, 5, 5)
5594 .show(grandchild)
5595 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005596
5597 auto grandchildHandle = grandchild->getHandle();
5598
5599 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005600 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005601 mCapture->checkPixel(0, 0, 50, 50, 50);
5602 mCapture->checkPixel(4, 4, 50, 50, 50);
5603}
5604
chaviw7206d492017-11-10 16:16:12 -08005605TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005606 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005607 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5608 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005609
Marissa Wall61c58622018-07-18 10:12:20 -07005610 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5611 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005612
5613 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005614 .setLayer(redLayer, INT32_MAX - 1)
5615 .show(redLayer)
5616 .show(blueLayer)
5617 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005618
5619 auto redLayerHandle = redLayer->getHandle();
5620
5621 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005622 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5623 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5624 // red area below the blue area
5625 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5626 // red area to the right of the blue area
5627 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005628
Marissa Wall861616d2018-10-22 12:52:23 -07005629 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005630 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005631 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5632 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005633 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005634 mCapture->checkPixel(30, 30, 0, 0, 0);
5635}
5636
5637TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005638 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005639 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5640 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005641
Marissa Wall61c58622018-07-18 10:12:20 -07005642 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5643 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005644
5645 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005646 .setLayer(redLayer, INT32_MAX - 1)
5647 .show(redLayer)
5648 .show(blueLayer)
5649 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005650
5651 auto redLayerHandle = redLayer->getHandle();
5652
5653 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005654 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5655 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5656 // red area below the blue area
5657 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5658 // red area to the right of the blue area
5659 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005660
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005661 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005662 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005663 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5664 // red area below the blue area
5665 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5666 // red area to the right of the blue area
5667 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005668 mCapture->checkPixel(30, 30, 0, 0, 0);
5669}
5670
5671TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005672 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005673
Marissa Wall61c58622018-07-18 10:12:20 -07005674 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005675
5676 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005677 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005678 SurfaceComposerClient::Transaction().apply(true);
5679
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005680 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005681
5682 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005683 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5684 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005685}
5686
chaviw8e3fe5d2018-02-22 10:55:42 -08005687
5688class DereferenceSurfaceControlTest : public LayerTransactionTest {
5689protected:
5690 void SetUp() override {
5691 LayerTransactionTest::SetUp();
5692 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005693 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005694 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005695 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005696 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5697 {
5698 SCOPED_TRACE("before anything");
5699 auto shot = screenshot();
5700 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5701 }
5702 }
5703 void TearDown() override {
5704 LayerTransactionTest::TearDown();
5705 bgLayer = 0;
5706 fgLayer = 0;
5707 }
5708
5709 sp<SurfaceControl> bgLayer;
5710 sp<SurfaceControl> fgLayer;
5711};
5712
5713TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5714 fgLayer = nullptr;
5715 {
5716 SCOPED_TRACE("after setting null");
5717 auto shot = screenshot();
5718 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5719 }
5720}
5721
5722TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5723 auto transaction = Transaction().show(fgLayer);
5724 fgLayer = nullptr;
5725 {
5726 SCOPED_TRACE("after setting null");
5727 auto shot = screenshot();
5728 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5729 }
5730}
5731
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005732class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5733protected:
5734 virtual void SetUp() {
5735 LayerTransactionTest::SetUp();
5736 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5737
5738 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5739 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5740
5741 sp<IGraphicBufferConsumer> consumer;
5742 BufferQueue::createBufferQueue(&mProducer, &consumer);
5743 consumer->setConsumerName(String8("Virtual disp consumer"));
5744 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5745 }
5746
5747 virtual void TearDown() {
5748 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5749 LayerTransactionTest::TearDown();
5750 mColorLayer = 0;
5751 }
5752
5753 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5754 mVirtualDisplay =
5755 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5756 asTransaction([&](Transaction& t) {
5757 t.setDisplaySurface(mVirtualDisplay, mProducer);
5758 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5759 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5760 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5761 });
5762 }
5763
5764 void createColorLayer(uint32_t layerStack) {
5765 mColorLayer =
5766 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5767 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5768 ASSERT_TRUE(mColorLayer != nullptr);
5769 ASSERT_TRUE(mColorLayer->isValid());
5770 asTransaction([&](Transaction& t) {
5771 t.setLayerStack(mColorLayer, layerStack);
5772 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5773 t.setLayer(mColorLayer, INT32_MAX - 2);
5774 t.setColor(mColorLayer,
5775 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5776 mExpectedColor.b / 255.0f});
5777 t.show(mColorLayer);
5778 });
5779 }
5780
5781 DisplayInfo mMainDisplayInfo;
5782 sp<IBinder> mMainDisplay;
5783 sp<IBinder> mVirtualDisplay;
5784 sp<IGraphicBufferProducer> mProducer;
5785 sp<SurfaceControl> mColorLayer;
5786 Color mExpectedColor = {63, 63, 195, 255};
5787};
5788
5789TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5790 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5791 createColorLayer(1 /* layerStack */);
5792
5793 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5794
5795 // Verify color layer does not render on main display.
5796 std::unique_ptr<ScreenCapture> sc;
5797 ScreenCapture::captureScreen(&sc, mMainDisplay);
5798 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5799 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5800
5801 // Verify color layer renders correctly on virtual display.
5802 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5803 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5804 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5805}
5806
5807TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5808 // Create a display and set its layer stack to the main display's layer stack so
5809 // the contents of the main display are mirrored on to the virtual display.
5810
5811 // Assumption here is that the new mirrored display has the same viewport as the
5812 // primary display that it is mirroring.
5813 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5814 createColorLayer(0 /* layerStack */);
5815
5816 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5817
5818 // Verify color layer renders correctly on main display and it is mirrored on the
5819 // virtual display.
5820 std::unique_ptr<ScreenCapture> sc;
5821 ScreenCapture::captureScreen(&sc, mMainDisplay);
5822 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5823 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5824
5825 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5826 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5827 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5828}
5829
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005830class DisplayActiveConfigTest : public ::testing::Test {
5831protected:
5832 void SetUp() override {
5833 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5834 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5835 EXPECT_GT(mDisplayconfigs.size(), 0);
5836
5837 // set display power to on to make sure config can be changed
5838 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5839 }
5840
5841 sp<IBinder> mDisplayToken;
5842 Vector<DisplayInfo> mDisplayconfigs;
5843};
5844
5845TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5846 std::vector<int32_t> allowedConfigs;
5847
5848 // Add all configs to the allowed configs
5849 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5850 allowedConfigs.push_back(i);
5851 }
5852
5853 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5854 EXPECT_EQ(res, NO_ERROR);
5855
5856 std::vector<int32_t> outConfigs;
5857 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5858 EXPECT_EQ(res, NO_ERROR);
5859 EXPECT_EQ(allowedConfigs, outConfigs);
5860}
5861
5862TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5863 // we need at least 2 configs available for this test
5864 if (mDisplayconfigs.size() <= 1) return;
5865
5866 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5867
5868 // We want to set the allowed config to everything but the active config
5869 std::vector<int32_t> allowedConfigs;
5870 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5871 if (i != activeConfig) {
5872 allowedConfigs.push_back(i);
5873 }
5874 }
5875
5876 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5877 EXPECT_EQ(res, NO_ERROR);
5878
5879 // Allow some time for the config change
5880 std::this_thread::sleep_for(200ms);
5881
5882 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5883 EXPECT_NE(activeConfig, newActiveConfig);
5884
5885 // Make sure the new config is part of allowed config
5886 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5887 allowedConfigs.end());
5888}
5889
Vishnu Nairda9c85a2019-06-03 17:26:48 -07005890class RelativeZTest : public LayerTransactionTest {
5891protected:
5892 virtual void SetUp() {
5893 LayerTransactionTest::SetUp();
5894 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5895
5896 const auto display = SurfaceComposerClient::getInternalDisplayToken();
5897 ASSERT_FALSE(display == nullptr);
5898
5899 // Back layer
5900 mBackgroundLayer = createColorLayer("Background layer", Color::RED);
5901
5902 // Front layer
5903 mForegroundLayer = createColorLayer("Foreground layer", Color::GREEN);
5904
5905 asTransaction([&](Transaction& t) {
5906 t.setDisplayLayerStack(display, 0);
5907 t.setLayer(mBackgroundLayer, INT32_MAX - 2).show(mBackgroundLayer);
5908 t.setLayer(mForegroundLayer, INT32_MAX - 1).show(mForegroundLayer);
5909 });
5910 }
5911
5912 virtual void TearDown() {
5913 LayerTransactionTest::TearDown();
5914 mBackgroundLayer = 0;
5915 mForegroundLayer = 0;
5916 }
5917
5918 sp<SurfaceControl> mBackgroundLayer;
5919 sp<SurfaceControl> mForegroundLayer;
5920};
5921
5922// When a layer is reparented offscreen, remove relative z order if the relative parent
5923// is still onscreen so that the layer is not drawn.
5924TEST_F(RelativeZTest, LayerRemoved) {
5925 std::unique_ptr<ScreenCapture> sc;
5926
5927 // Background layer (RED)
5928 // Child layer (WHITE) (relative to foregroud layer)
5929 // Foregroud layer (GREEN)
5930 sp<SurfaceControl> childLayer =
5931 createColorLayer("Child layer", Color::BLUE, mBackgroundLayer.get());
5932
5933 Transaction{}
5934 .setRelativeLayer(childLayer, mForegroundLayer->getHandle(), 1)
5935 .show(childLayer)
5936 .apply();
5937
5938 {
5939 // The childLayer should be in front of the FG control.
5940 ScreenCapture::captureScreen(&sc);
5941 sc->checkPixel(1, 1, Color::BLUE.r, Color::BLUE.g, Color::BLUE.b);
5942 }
5943
5944 // Background layer (RED)
5945 // Foregroud layer (GREEN)
5946 Transaction{}.reparent(childLayer, nullptr).apply();
5947
5948 // Background layer (RED)
5949 // Child layer (WHITE)
5950 // Foregroud layer (GREEN)
5951 Transaction{}.reparent(childLayer, mBackgroundLayer->getHandle()).apply();
5952
5953 {
5954 // The relative z info for child layer should be reset, leaving FG control on top.
5955 ScreenCapture::captureScreen(&sc);
5956 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
5957 }
5958}
5959
5960// When a layer is reparented offscreen, preseve relative z order if the relative parent
5961// is also offscreen. Regression test b/132613412
5962TEST_F(RelativeZTest, LayerRemovedOffscreenRelativeParent) {
5963 std::unique_ptr<ScreenCapture> sc;
5964
5965 // Background layer (RED)
5966 // Foregroud layer (GREEN)
5967 // child level 1 (WHITE)
5968 // child level 2a (BLUE)
5969 // child level 3 (GREEN) (relative to child level 2b)
5970 // child level 2b (BLACK)
5971 sp<SurfaceControl> childLevel1 =
5972 createColorLayer("child level 1", Color::WHITE, mForegroundLayer.get());
5973 sp<SurfaceControl> childLevel2a =
5974 createColorLayer("child level 2a", Color::BLUE, childLevel1.get());
5975 sp<SurfaceControl> childLevel2b =
5976 createColorLayer("child level 2b", Color::BLACK, childLevel1.get());
5977 sp<SurfaceControl> childLevel3 =
5978 createColorLayer("child level 3", Color::GREEN, childLevel2a.get());
5979
5980 Transaction{}
5981 .setRelativeLayer(childLevel3, childLevel2b->getHandle(), 1)
5982 .show(childLevel2a)
5983 .show(childLevel2b)
5984 .show(childLevel3)
5985 .apply();
5986
5987 {
5988 // The childLevel3 should be in front of childLevel2b.
5989 ScreenCapture::captureScreen(&sc);
5990 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
5991 }
5992
5993 // Background layer (RED)
5994 // Foregroud layer (GREEN)
5995 Transaction{}.reparent(childLevel1, nullptr).apply();
5996
5997 // Background layer (RED)
5998 // Foregroud layer (GREEN)
5999 // child level 1 (WHITE)
6000 // child level 2 back (BLUE)
6001 // child level 3 (GREEN) (relative to child level 2b)
6002 // child level 2 front (BLACK)
6003 Transaction{}.reparent(childLevel1, mForegroundLayer->getHandle()).apply();
6004
6005 {
6006 // Nothing should change at this point since relative z info was preserved.
6007 ScreenCapture::captureScreen(&sc);
6008 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6009 }
6010}
6011
Chavi Weingarten40482ff2017-11-30 01:51:40 +00006012} // namespace android