blob: 6ed3066ccf6cdda3107caf62677eee9db4586156 [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>
35#include <private/gui/ComposerService.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080036#include <private/android_filesystem_config.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080037
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070038#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070039#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070040#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070041#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070042
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070043#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070044#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080045#include <sys/types.h>
46#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070047
Marissa Wall713b63f2018-10-17 15:42:43 -070048#include "BufferGenerator.h"
49
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070050namespace android {
51
Chia-I Wu718daf82017-10-20 11:57:17 -070052namespace {
53
54struct Color {
55 uint8_t r;
56 uint8_t g;
57 uint8_t b;
58 uint8_t a;
59
60 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070061 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070062 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070063 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070064 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070065 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070066};
67
68const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070069const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070070const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070071const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070072const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070073const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070074
Marissa Wall61c58622018-07-18 10:12:20 -070075using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070076using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070077
Chia-I Wu718daf82017-10-20 11:57:17 -070078std::ostream& operator<<(std::ostream& os, const Color& color) {
79 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
80 return os;
81}
82
83// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070084void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
85 const Color& color) {
86 Rect r(0, 0, buffer.width, buffer.height);
87 if (!r.intersect(rect, &r)) {
88 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070089 }
90
Marissa Wall61c58622018-07-18 10:12:20 -070091 int32_t width = r.right - r.left;
92 int32_t height = r.bottom - r.top;
93
94 for (int32_t row = 0; row < height; row++) {
95 uint8_t* dst =
96 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
97 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070098 dst[0] = color.r;
99 dst[1] = color.g;
100 dst[2] = color.b;
101 dst[3] = color.a;
102 dst += 4;
103 }
104 }
105}
106
Marissa Wall61c58622018-07-18 10:12:20 -0700107// Fill a region with the specified color.
108void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
109 Rect r(0, 0, buffer->width, buffer->height);
110 if (!r.intersect(rect, &r)) {
111 return;
112 }
113
114 int32_t width = r.right - r.left;
115 int32_t height = r.bottom - r.top;
116
117 uint8_t* pixels;
118 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
119 reinterpret_cast<void**>(&pixels));
120
121 for (int32_t row = 0; row < height; row++) {
122 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
123 for (int32_t column = 0; column < width; column++) {
124 dst[0] = color.r;
125 dst[1] = color.g;
126 dst[2] = color.b;
127 dst[3] = color.a;
128 dst += 4;
129 }
130 }
131 buffer->unlock();
132}
133
Chia-I Wu718daf82017-10-20 11:57:17 -0700134// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000135void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700136 const Color& color, uint8_t tolerance) {
137 int32_t x = rect.left;
138 int32_t y = rect.top;
139 int32_t width = rect.right - rect.left;
140 int32_t height = rect.bottom - rect.top;
141
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000142 int32_t bufferWidth = int32_t(outBuffer->getWidth());
143 int32_t bufferHeight = int32_t(outBuffer->getHeight());
144 if (x + width > bufferWidth) {
145 x = std::min(x, bufferWidth);
146 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700147 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000148 if (y + height > bufferHeight) {
149 y = std::min(y, bufferHeight);
150 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700151 }
152
153 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
154 uint8_t tmp = a >= b ? a - b : b - a;
155 return tmp <= tolerance;
156 };
157 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000158 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700159 for (int32_t i = 0; i < width; i++) {
160 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
161 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
162 << "pixel @ (" << x + i << ", " << y + j << "): "
163 << "expected (" << color << "), "
164 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
165 src += 4;
166 }
167 }
168}
169
170} // anonymous namespace
171
Robert Carr4cdc58f2017-08-23 14:22:20 -0700172using Transaction = SurfaceComposerClient::Transaction;
173
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700174// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700175static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
176 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800177 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700178 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800179 ASSERT_TRUE(s != nullptr);
180 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800181 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700182 for (int y = 0; y < outBuffer.height; y++) {
183 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700184 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700185 pixel[0] = r;
186 pixel[1] = g;
187 pixel[2] = b;
188 pixel[3] = 255;
189 }
190 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700191 if (unlock) {
192 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
193 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700194}
195
196// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
197// individual pixel values for testing purposes.
198class ScreenCapture : public RefBase {
199public:
chaviw0e3479f2018-09-10 16:49:30 -0700200 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800201 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
202 }
203
204 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800205 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700206 SurfaceComposerClient::Transaction().apply(true);
207
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000208 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800209 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700210 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000211 }
212
213 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
214 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
215 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
216 SurfaceComposerClient::Transaction().apply(true);
217
218 sp<GraphicBuffer> outBuffer;
219 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
220 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700221 }
222
Robert Carr578038f2018-03-09 12:25:24 -0800223 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
224 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
225 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
226 SurfaceComposerClient::Transaction().apply(true);
227
228 sp<GraphicBuffer> outBuffer;
229 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
230 *sc = std::make_unique<ScreenCapture>(outBuffer);
231 }
232
Chia-I Wu718daf82017-10-20 11:57:17 -0700233 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000234 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
235 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700236 }
237
238 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000239 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700240 const bool leftBorder = rect.left > 0;
241 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000242 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
243 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700244
245 if (topBorder) {
246 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
247 if (leftBorder) {
248 top.left -= 1;
249 }
250 if (rightBorder) {
251 top.right += 1;
252 }
253 expectColor(top, color, tolerance);
254 }
255 if (leftBorder) {
256 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
257 expectColor(left, color, tolerance);
258 }
259 if (rightBorder) {
260 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
261 expectColor(right, color, tolerance);
262 }
263 if (bottomBorder) {
264 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
265 if (leftBorder) {
266 bottom.left -= 1;
267 }
268 if (rightBorder) {
269 bottom.right += 1;
270 }
271 expectColor(bottom, color, tolerance);
272 }
273 }
274
Chia-I Wu93853fe2017-11-02 08:30:27 -0700275 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
276 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
277 uint8_t tolerance = 0) {
278 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
279
280 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
281 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
282 // avoid checking borders due to unspecified filtering behavior
283 const int32_t offsetX = filtered ? 2 : 0;
284 const int32_t offsetY = filtered ? 2 : 0;
285 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
286 tolerance);
287 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
288 tolerance);
289 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
290 tolerance);
291 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
292 bottomRight, tolerance);
293 }
294
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700295 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000296 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
297 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700298 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
299 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700300 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
301 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700302 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700303 }
304 }
305
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700306 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700307
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700308 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700309
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700310 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700311
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800312 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000313 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700314 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700315
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000316 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700317
318private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000319 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800320 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700321};
322
Chia-I Wu718daf82017-10-20 11:57:17 -0700323class LayerTransactionTest : public ::testing::Test {
324protected:
325 void SetUp() override {
326 mClient = new SurfaceComposerClient;
327 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
328
329 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700330
331 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700332 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700333 }
334
chaviw0e3479f2018-09-10 16:49:30 -0700335 virtual void TearDown() {
336 mBlackBgSurface = 0;
337 mClient->dispose();
338 mClient = 0;
339 }
340
Marissa Wallfda30bb2018-10-12 11:34:28 -0700341 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
342 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800343 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
344 auto layer =
345 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700346
Vishnu Nair60356342018-11-13 13:00:45 -0800347 Transaction t;
348 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800349
350 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700351 if (error != NO_ERROR) {
352 ADD_FAILURE() << "failed to initialize SurfaceControl";
353 layer.clear();
354 }
355
356 return layer;
357 }
358
Vishnu Nair88a11f22018-11-28 18:30:57 -0800359 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
360 const char* name, uint32_t width, uint32_t height,
361 PixelFormat format, uint32_t flags,
362 SurfaceControl* parent = nullptr) {
363 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
364 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
365 return layer;
366 }
367
Marissa Wallfda30bb2018-10-12 11:34:28 -0700368 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800369 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
370 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700371 }
372
Marissa Wall61c58622018-07-18 10:12:20 -0700373 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700374 // wait for previous transactions (such as setSize) to complete
375 Transaction().apply(true);
376
377 ANativeWindow_Buffer buffer = {};
378 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
379
380 return buffer;
381 }
382
Marissa Wall61c58622018-07-18 10:12:20 -0700383 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700384 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
385
386 // wait for the newly posted buffer to be latched
387 waitForLayerBuffers();
388 }
389
Marissa Wall61c58622018-07-18 10:12:20 -0700390 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
391 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700392 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700393 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
394 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
395 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700396 }
397
Marissa Wall61c58622018-07-18 10:12:20 -0700398 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
399 int32_t bufferWidth, int32_t bufferHeight) {
400 sp<GraphicBuffer> buffer =
401 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
402 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
403 BufferUsage::COMPOSER_OVERLAY,
404 "test");
405 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700406 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700407 }
408
409 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
410 int32_t bufferWidth, int32_t bufferHeight) {
411 switch (mLayerType) {
412 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
413 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
414 break;
415 case ISurfaceComposerClient::eFXSurfaceBufferState:
416 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
417 break;
418 default:
419 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
420 }
421 }
422
423 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
424 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700425 const Color& topRight, const Color& bottomLeft,
426 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700427 switch (mLayerType) {
428 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
429 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
430 bottomLeft, bottomRight);
431 break;
432 case ISurfaceComposerClient::eFXSurfaceBufferState:
433 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
434 bottomLeft, bottomRight);
435 break;
436 default:
437 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
438 }
439 }
440
441 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
442 int32_t bufferHeight, const Color& topLeft,
443 const Color& topRight, const Color& bottomLeft,
444 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700445 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700446 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
447 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700448
Marissa Wall61c58622018-07-18 10:12:20 -0700449 const int32_t halfW = bufferWidth / 2;
450 const int32_t halfH = bufferHeight / 2;
451 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
452 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
453 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
454 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
455 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700456
Marissa Wall61c58622018-07-18 10:12:20 -0700457 postBufferQueueLayerBuffer(layer);
458 }
459
460 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
461 int32_t bufferHeight, const Color& topLeft,
462 const Color& topRight, const Color& bottomLeft,
463 const Color& bottomRight) {
464 sp<GraphicBuffer> buffer =
465 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
466 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
467 BufferUsage::COMPOSER_OVERLAY,
468 "test");
469
470 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
471
472 const int32_t halfW = bufferWidth / 2;
473 const int32_t halfH = bufferHeight / 2;
474 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
475 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
476 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
477 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
478
479 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700480 }
481
chaviw0e3479f2018-09-10 16:49:30 -0700482 std::unique_ptr<ScreenCapture> screenshot() {
483 std::unique_ptr<ScreenCapture> screenshot;
484 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700485 return screenshot;
486 }
487
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800488 void asTransaction(const std::function<void(Transaction&)>& exec) {
489 Transaction t;
490 exec(t);
491 t.apply(true);
492 }
493
Marissa Wall713b63f2018-10-17 15:42:43 -0700494 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
495 static BufferGenerator bufferGenerator;
496 return bufferGenerator.get(outBuffer, outFence);
497 }
498
Chia-I Wu718daf82017-10-20 11:57:17 -0700499 sp<SurfaceComposerClient> mClient;
500
501 sp<IBinder> mDisplay;
502 uint32_t mDisplayWidth;
503 uint32_t mDisplayHeight;
504 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700505 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700506
507 // leave room for ~256 layers
508 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
509
chaviw0e3479f2018-09-10 16:49:30 -0700510 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700511 bool mColorManagementUsed;
512
Chia-I Wu718daf82017-10-20 11:57:17 -0700513private:
514 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800515 mDisplay = mClient->getInternalDisplayToken();
516 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700517
518 // get display width/height
519 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800520 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700521 mDisplayWidth = info.w;
522 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700523 mDisplayRect =
524 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700525
526 // After a new buffer is queued, SurfaceFlinger is notified and will
527 // latch the new buffer on next vsync. Let's heuristically wait for 3
528 // vsyncs.
529 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
530
531 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700532
Vishnu Nair88a11f22018-11-28 18:30:57 -0800533 mBlackBgSurface =
534 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
535 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700536
Chia-I Wu718daf82017-10-20 11:57:17 -0700537 // set layer stack (b/68888219)
538 Transaction t;
539 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800540 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700541 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
542 t.setColor(mBlackBgSurface, half3{0, 0, 0});
543 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700544 t.apply();
545 }
546
chaviw0e3479f2018-09-10 16:49:30 -0700547 void waitForLayerBuffers() {
548 // Request an empty transaction to get applied synchronously to ensure the buffer is
549 // latched.
550 Transaction().apply(true);
551 usleep(mBufferPostDelay);
552 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700553
554 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800555
556 friend class LayerRenderPathTestHarness;
557};
558enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
559
560class LayerRenderPathTestHarness {
561public:
562 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
563 : mDelegate(delegate), mRenderPath(renderPath) {}
564
565 std::unique_ptr<ScreenCapture> getScreenCapture() {
566 switch (mRenderPath) {
567 case RenderPath::SCREENSHOT:
568 return mDelegate->screenshot();
569 case RenderPath::VIRTUAL_DISPLAY:
570
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800571 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800572 DisplayInfo mainDisplayInfo;
573 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
574
575 sp<IBinder> vDisplay;
576 sp<IGraphicBufferProducer> producer;
577 sp<IGraphicBufferConsumer> consumer;
578 sp<BufferItemConsumer> itemConsumer;
579 BufferQueue::createBufferQueue(&producer, &consumer);
580
581 consumer->setConsumerName(String8("Virtual disp consumer"));
582 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
583
584 itemConsumer = new BufferItemConsumer(consumer,
585 // Sample usage bits from screenrecord
586 GRALLOC_USAGE_HW_VIDEO_ENCODER |
587 GRALLOC_USAGE_SW_READ_OFTEN);
588
589 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
590 false /*secure*/);
591
592 SurfaceComposerClient::Transaction t;
593 t.setDisplaySurface(vDisplay, producer);
594 t.setDisplayLayerStack(vDisplay, 0);
595 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
596 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
597 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
598 t.apply();
599 SurfaceComposerClient::Transaction().apply(true);
600 BufferItem item;
601 itemConsumer->acquireBuffer(&item, 0, true);
602 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
603 itemConsumer->releaseBuffer(item);
604 SurfaceComposerClient::destroyDisplay(vDisplay);
605 return sc;
606 }
607 }
608
609protected:
610 LayerTransactionTest* mDelegate;
611 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700612};
613
Alec Mouri80863a62019-01-17 15:19:35 -0800614class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700615public:
Alec Mouri80863a62019-01-17 15:19:35 -0800616 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700617
618 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800619 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700620 // if the flags already have a layer type specified, return an error
621 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
622 return nullptr;
623 }
chaviwf66724d2018-11-28 16:35:21 -0800624 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700625 }
626
627 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
628 int32_t bufferHeight) {
629 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
630 bufferWidth, bufferHeight));
631 }
632
633 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
634 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
635 const Color& bottomLeft, const Color& bottomRight) {
636 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
637 bufferWidth, bufferHeight,
638 topLeft, topRight,
639 bottomLeft, bottomRight));
640 }
641
642protected:
643 uint32_t mLayerType;
644};
645
Alec Mouri80863a62019-01-17 15:19:35 -0800646class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
647 public ::testing::WithParamInterface<uint32_t> {
648public:
649 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
650};
651
652class LayerTypeAndRenderTypeTransactionTest
653 : public LayerTypeTransactionHarness,
654 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
655public:
656 LayerTypeAndRenderTypeTransactionTest()
657 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
658 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
659
660 std::unique_ptr<ScreenCapture> getScreenCapture() {
661 return mRenderPathHarness.getScreenCapture();
662 }
663
664protected:
665 LayerRenderPathTestHarness mRenderPathHarness;
666};
667
668// Environment for starting up binder threads. This is required for testing
669// virtual displays, as BufferQueue parameters may be queried over binder.
670class BinderEnvironment : public ::testing::Environment {
671public:
672 void SetUp() override { ProcessState::self()->startThreadPool(); }
673};
674
675::testing::Environment* const binderEnv =
676 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
677
678class LayerRenderTypeTransactionTest : public LayerTransactionTest,
679 public ::testing::WithParamInterface<RenderPath> {
680public:
681 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
682
683 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
684 void setRelativeZBasicHelper(uint32_t layerType);
685 void setRelativeZGroupHelper(uint32_t layerType);
686 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800687 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
688 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800689
690protected:
691 LayerRenderPathTestHarness mHarness;
692};
693
694INSTANTIATE_TEST_CASE_P(
695 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
696 ::testing::Combine(
697 ::testing::Values(
698 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
699 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
700 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
701
702INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
703 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
704
Marissa Wall61c58622018-07-18 10:12:20 -0700705INSTANTIATE_TEST_CASE_P(
706 LayerTypeTransactionTests, LayerTypeTransactionTest,
707 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
708 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
709
Alec Mouri80863a62019-01-17 15:19:35 -0800710TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700711 sp<SurfaceControl> layer;
712 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700713 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700714
715 {
716 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700717 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800718 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700719 shot->expectColor(rect, Color::RED);
720 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700721 }
722
723 Transaction().setPosition(layer, 5, 10).apply();
724 {
725 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700726 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800727 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700728 shot->expectColor(rect, Color::RED);
729 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700730 }
731}
732
Alec Mouri80863a62019-01-17 15:19:35 -0800733TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700734 sp<SurfaceControl> layer;
735 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700736 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700737
738 // GLES requires only 4 bits of subpixel precision during rasterization
739 // XXX GLES composition does not match HWC composition due to precision
740 // loss (b/69315223)
741 const float epsilon = 1.0f / 16.0f;
742 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
743 {
744 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800745 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700746 }
747
748 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
749 {
750 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800751 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700752 }
753}
754
Alec Mouri80863a62019-01-17 15:19:35 -0800755TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700756 sp<SurfaceControl> layer;
757 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700758 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700759
760 Transaction().setPosition(layer, -32, -32).apply();
761 {
762 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800763 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700764 }
765
766 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
767 {
768 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800769 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700770 }
771}
772
Alec Mouri80863a62019-01-17 15:19:35 -0800773TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700774 sp<SurfaceControl> layer;
775 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700776 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700777
778 // partially out of bounds
779 Transaction().setPosition(layer, -30, -30).apply();
780 {
781 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800782 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700783 }
784
785 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
786 {
787 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800788 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
789 mDisplayHeight),
790 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700791 }
792}
793
Alec Mouri80863a62019-01-17 15:19:35 -0800794TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700795 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700796 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
797 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700798
799 // setPosition is applied immediately by default, with or without resize
800 // pending
801 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
802 {
803 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800804 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700805 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700806 shot->expectColor(rect, Color::RED);
807 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700808 }
809
Marissa Wall861616d2018-10-22 12:52:23 -0700810 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700811 {
812 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800813 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700814 }
815}
816
Alec Mouri80863a62019-01-17 15:19:35 -0800817TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700818 sp<SurfaceControl> layer;
819 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700820 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700821
822 // request setPosition to be applied with the next resize
823 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
824 {
825 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800826 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700827 }
828
829 Transaction().setPosition(layer, 15, 20).apply();
830 {
831 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800832 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700833 }
834
835 Transaction().setSize(layer, 64, 64).apply();
836 {
837 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800838 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700839 }
840
841 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700842 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700843 {
844 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800845 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700846 }
847}
848
Alec Mouri80863a62019-01-17 15:19:35 -0800849TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700850 sp<SurfaceControl> layer;
851 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700852 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700853
854 // setPosition is not immediate even with SCALE_TO_WINDOW override
855 Transaction()
856 .setPosition(layer, 5, 10)
857 .setSize(layer, 64, 64)
858 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
859 .setGeometryAppliesWithResize(layer)
860 .apply();
861 {
862 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800863 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700864 }
865
Marissa Wall61c58622018-07-18 10:12:20 -0700866 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700867 {
868 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800869 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700870 }
871}
872
Alec Mouri80863a62019-01-17 15:19:35 -0800873TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700874 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700875 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
876 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700877
878 Transaction().setSize(layer, 64, 64).apply();
879 {
880 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800881 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700882 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700883 shot->expectColor(rect, Color::RED);
884 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700885 }
886
Marissa Wall861616d2018-10-22 12:52:23 -0700887 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700888 {
889 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800890 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700891 const Rect rect(0, 0, 64, 64);
892 shot->expectColor(rect, Color::RED);
893 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700894 }
895}
896
Alec Mouri80863a62019-01-17 15:19:35 -0800897TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700898 // cannot test robustness against invalid sizes (zero or really huge)
899}
900
Alec Mouri80863a62019-01-17 15:19:35 -0800901TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700902 sp<SurfaceControl> layer;
903 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700904 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700905
906 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
907 Transaction()
908 .setSize(layer, 64, 64)
909 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
910 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800911 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700912}
913
Alec Mouri80863a62019-01-17 15:19:35 -0800914TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700915 sp<SurfaceControl> layerR;
916 sp<SurfaceControl> layerG;
917 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700918 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700919 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700920 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700921
922 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
923 {
924 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800925 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700926 }
927
928 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
929 {
930 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800931 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700932 }
933}
934
Alec Mouri80863a62019-01-17 15:19:35 -0800935TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700936 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800937 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700938 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800939 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700940 sp<SurfaceControl> layerR;
941 sp<SurfaceControl> layerG;
942 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700943 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700944 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700945 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700946
chaviw0e3479f2018-09-10 16:49:30 -0700947 Transaction()
948 .reparent(layerR, parent->getHandle())
949 .reparent(layerG, parent->getHandle())
950 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700951 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
952 {
953 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800954 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700955 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700956 }
957
958 Transaction().setLayer(layerR, -3).apply();
959 {
960 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800961 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700962 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700963 }
964}
965
Alec Mouri80863a62019-01-17 15:19:35 -0800966void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700967 sp<SurfaceControl> layerR;
968 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700969 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
970 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
971 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
972 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700973
Marissa Wall861616d2018-10-22 12:52:23 -0700974 switch (layerType) {
975 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
976 Transaction()
977 .setPosition(layerG, 16, 16)
978 .setRelativeLayer(layerG, layerR->getHandle(), 1)
979 .apply();
980 break;
981 case ISurfaceComposerClient::eFXSurfaceBufferState:
982 Transaction()
983 .setFrame(layerR, Rect(0, 0, 32, 32))
984 .setFrame(layerG, Rect(16, 16, 48, 48))
985 .setRelativeLayer(layerG, layerR->getHandle(), 1)
986 .apply();
987 break;
988 default:
989 ASSERT_FALSE(true) << "Unsupported layer type";
990 }
Chia-I Wu49313302017-10-31 10:14:40 -0700991 {
992 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800993 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700994 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
995 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
996 }
997
998 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
999 {
1000 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001001 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001002 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1003 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1004 }
1005}
1006
Alec Mouri80863a62019-01-17 15:19:35 -08001007TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001008 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1009}
1010
Alec Mouri80863a62019-01-17 15:19:35 -08001011TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001012 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1013}
1014
Marissa Wall61c58622018-07-18 10:12:20 -07001015TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001016 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001017 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001018 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001019 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001020 sp<SurfaceControl> layerR;
1021 sp<SurfaceControl> layerG;
1022 sp<SurfaceControl> layerB;
1023 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001024 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001025 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001026 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001027 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001028 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029
chaviw0e3479f2018-09-10 16:49:30 -07001030 Transaction()
1031 .reparent(layerB, parent->getHandle())
1032 .apply();
1033
Chia-I Wuec2d9852017-11-21 09:21:01 -08001034 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1035 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1036
chaviw0e3479f2018-09-10 16:49:30 -07001037 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001038 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001039 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001040 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001041 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1042}
1043
Alec Mouri80863a62019-01-17 15:19:35 -08001044void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001045 sp<SurfaceControl> layerR;
1046 sp<SurfaceControl> layerG;
1047 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001048 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1049 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1050 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1051 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1052 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1053 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001054
1055 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001056 switch (layerType) {
1057 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1058 Transaction()
1059 .setPosition(layerG, 8, 8)
1060 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1061 .setPosition(layerB, 16, 16)
1062 .setLayer(layerB, mLayerZBase + 2)
1063 .apply();
1064 break;
1065 case ISurfaceComposerClient::eFXSurfaceBufferState:
1066 Transaction()
1067 .setFrame(layerR, Rect(0, 0, 32, 32))
1068 .setFrame(layerG, Rect(8, 8, 40, 40))
1069 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1070 .setFrame(layerB, Rect(16, 16, 48, 48))
1071 .setLayer(layerB, mLayerZBase + 2)
1072 .apply();
1073 break;
1074 default:
1075 ASSERT_FALSE(true) << "Unsupported layer type";
1076 }
1077
Chia-I Wu49313302017-10-31 10:14:40 -07001078 {
1079 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001080 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001081 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1082 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1083 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1084 }
1085
1086 // layerR = 4, layerG = layerR + 3, layerB = 2
1087 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1088 {
1089 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001090 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001091 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1092 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1093 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1094 }
1095
1096 // layerR = 4, layerG = layerR - 3, layerB = 2
1097 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1098 {
1099 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001100 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001101 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1102 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1103 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1104 }
1105
1106 // restore to absolute z
1107 // layerR = 4, layerG = 0, layerB = 2
1108 Transaction().setLayer(layerG, mLayerZBase).apply();
1109 {
1110 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001111 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001112 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1113 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1114 }
1115
1116 // layerR should not affect layerG anymore
1117 // layerR = 1, layerG = 0, layerB = 2
1118 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1119 {
1120 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001121 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001122 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1123 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1124 }
1125}
1126
Alec Mouri80863a62019-01-17 15:19:35 -08001127TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001128 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1129}
1130
Alec Mouri80863a62019-01-17 15:19:35 -08001131TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001132 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1133}
1134
Alec Mouri80863a62019-01-17 15:19:35 -08001135TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001136 sp<SurfaceControl> layerR;
1137 sp<SurfaceControl> layerG;
1138
1139 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001140 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001141 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001142 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001143
1144 Transaction()
1145 .setPosition(layerG, 16, 16)
1146 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1147 .apply();
1148
Robert Carr87246532019-02-04 15:20:26 -08001149 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001150 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001151 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001152}
1153
Alec Mouri80863a62019-01-17 15:19:35 -08001154TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001155 sp<SurfaceControl> layer;
1156 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001157 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001158
1159 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1160 {
1161 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001162 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001163 }
1164
1165 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1166 {
1167 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001168 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001169 }
1170}
1171
Alec Mouri80863a62019-01-17 15:19:35 -08001172TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001173 const Color translucentRed = {100, 0, 0, 100};
1174 sp<SurfaceControl> layerR;
1175 sp<SurfaceControl> layerG;
1176 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001177 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001178 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001179 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001180
1181 Transaction()
1182 .setLayer(layerR, mLayerZBase + 1)
1183 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1184 .apply();
1185 {
1186 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001187 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001188 }
1189
1190 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1191 {
1192 SCOPED_TRACE("layerR translucent");
1193 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001194 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001195 }
1196}
1197
Marissa Wall61c58622018-07-18 10:12:20 -07001198TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001199 sp<SurfaceControl> layer;
1200 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001201 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001202
1203 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001204 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001205 Transaction()
1206 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1207 .apply(true);
1208 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001209 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001210
1211 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1212 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001213 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001214}
1215
Robert Carrfa8855f2019-02-19 10:05:00 -08001216/** RAII Wrapper around get/seteuid */
1217class UIDFaker {
1218 uid_t oldId;
1219public:
1220 UIDFaker(uid_t uid) {
1221 oldId = geteuid();
1222 seteuid(uid);
1223 }
1224 ~UIDFaker() {
1225 seteuid(oldId);
1226 }
1227};
1228
1229TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1230 sp<SurfaceControl> layer;
1231 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1232 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1233
1234 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1235 sp<GraphicBuffer> outBuffer;
1236 Transaction()
1237 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1238 .apply(true);
1239 ASSERT_EQ(PERMISSION_DENIED,
1240 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1241
1242 UIDFaker f(AID_SYSTEM);
1243
1244 // By default the system can capture screenshots with secure layers but they
1245 // will be blacked out
1246 ASSERT_EQ(NO_ERROR,
1247 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1248
1249 {
1250 SCOPED_TRACE("as system");
1251 auto shot = screenshot();
1252 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1253 }
1254
1255 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1256 // to receive them...we are expected to take care with the results.
1257 ASSERT_EQ(NO_ERROR,
1258 composer->captureScreen(mDisplay, &outBuffer,
1259 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888,
1260 Rect(), 0, 0, false,
1261 ISurfaceComposer::eRotateNone, true));
1262 ScreenCapture sc(outBuffer);
1263 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1264}
1265
Alec Mouri80863a62019-01-17 15:19:35 -08001266TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001267 const Rect top(0, 0, 32, 16);
1268 const Rect bottom(0, 16, 32, 32);
1269 sp<SurfaceControl> layer;
1270 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1271
1272 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001273 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1274 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1275 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001276 // setTransparentRegionHint always applies to the following buffer
1277 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001278 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001279 {
1280 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001281 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001282 shot->expectColor(top, Color::BLACK);
1283 shot->expectColor(bottom, Color::RED);
1284 }
1285
1286 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1287 {
1288 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001289 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001290 shot->expectColor(top, Color::BLACK);
1291 shot->expectColor(bottom, Color::RED);
1292 }
1293
Marissa Wall61c58622018-07-18 10:12:20 -07001294 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1295 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1296 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1297 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001298 {
1299 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001300 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001301 shot->expectColor(top, Color::RED);
1302 shot->expectColor(bottom, Color::BLACK);
1303 }
1304}
1305
Alec Mouri80863a62019-01-17 15:19:35 -08001306TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001307 const Rect top(0, 0, 32, 16);
1308 const Rect bottom(0, 16, 32, 32);
1309 sp<SurfaceControl> layer;
1310 ASSERT_NO_FATAL_FAILURE(
1311 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1312
1313 sp<GraphicBuffer> buffer =
1314 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1315 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1316 BufferUsage::COMPOSER_OVERLAY,
1317 "test");
1318
1319 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1320 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1321 Transaction()
1322 .setTransparentRegionHint(layer, Region(top))
1323 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001324 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001325 .apply();
1326 {
1327 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001328 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001329 shot->expectColor(top, Color::BLACK);
1330 shot->expectColor(bottom, Color::RED);
1331 }
1332
1333 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1334 {
1335 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001336 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001337 shot->expectColor(top, Color::BLACK);
1338 shot->expectColor(bottom, Color::BLACK);
1339 }
1340
1341 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1342 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1343 BufferUsage::COMPOSER_OVERLAY,
1344 "test");
1345
1346 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1347 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001348 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001349 {
1350 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001351 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001352 shot->expectColor(top, Color::RED);
1353 shot->expectColor(bottom, Color::BLACK);
1354 }
1355}
1356
Alec Mouri80863a62019-01-17 15:19:35 -08001357TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001358 sp<SurfaceControl> layerTransparent;
1359 sp<SurfaceControl> layerR;
1360 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1361 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1362
1363 // check that transparent region hint is bound by the layer size
1364 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001365 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001366 .setPosition(layerR, 16, 16)
1367 .setLayer(layerR, mLayerZBase + 1)
1368 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001369 ASSERT_NO_FATAL_FAILURE(
1370 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1371 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001372 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001373}
1374
Alec Mouri80863a62019-01-17 15:19:35 -08001375TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001376 sp<SurfaceControl> layerTransparent;
1377 sp<SurfaceControl> layerR;
1378 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1379 ASSERT_NO_FATAL_FAILURE(
1380 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1381
1382 // check that transparent region hint is bound by the layer size
1383 Transaction()
1384 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1385 .setFrame(layerR, Rect(16, 16, 48, 48))
1386 .setLayer(layerR, mLayerZBase + 1)
1387 .apply();
1388 ASSERT_NO_FATAL_FAILURE(
1389 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1390 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001391 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001392}
1393
Alec Mouri80863a62019-01-17 15:19:35 -08001394void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001395 sp<SurfaceControl> layer1;
1396 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001397 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1398 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1399 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1400 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001401
Marissa Wall861616d2018-10-22 12:52:23 -07001402 switch (layerType) {
1403 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1404 Transaction()
1405 .setAlpha(layer1, 0.25f)
1406 .setAlpha(layer2, 0.75f)
1407 .setPosition(layer2, 16, 0)
1408 .setLayer(layer2, mLayerZBase + 1)
1409 .apply();
1410 break;
1411 case ISurfaceComposerClient::eFXSurfaceBufferState:
1412 Transaction()
1413 .setAlpha(layer1, 0.25f)
1414 .setAlpha(layer2, 0.75f)
1415 .setFrame(layer1, Rect(0, 0, 32, 32))
1416 .setFrame(layer2, Rect(16, 0, 48, 32))
1417 .setLayer(layer2, mLayerZBase + 1)
1418 .apply();
1419 break;
1420 default:
1421 ASSERT_FALSE(true) << "Unsupported layer type";
1422 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001423 {
Alec Mouri80863a62019-01-17 15:19:35 -08001424 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001425 uint8_t r = 16; // 64 * 0.25f
1426 uint8_t g = 48; // 64 * 0.75f
1427 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1428 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1429
1430 r /= 4; // r * (1.0f - 0.75f)
1431 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1432 }
1433}
1434
Alec Mouri80863a62019-01-17 15:19:35 -08001435TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001436 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1437}
1438
Alec Mouri80863a62019-01-17 15:19:35 -08001439TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001440 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1441}
1442
Alec Mouri80863a62019-01-17 15:19:35 -08001443TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001444 const Color color = {64, 0, 0, 255};
1445 sp<SurfaceControl> layer;
1446 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001447 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001448
1449 Transaction().setAlpha(layer, 2.0f).apply();
1450 {
1451 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001452 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001453 }
1454
1455 Transaction().setAlpha(layer, -1.0f).apply();
1456 {
1457 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001458 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001459 }
1460}
1461
Alec Mouri80863a62019-01-17 15:19:35 -08001462TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001463 sp<SurfaceControl> layer;
1464 const uint8_t size = 64;
1465 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001466 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001467 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1468 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1469
1470 Transaction()
1471 .setCornerRadius(layer, cornerRadius)
1472 .apply();
1473 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001474 const uint8_t bottom = size - 1;
1475 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001476 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001477 // Transparent corners
1478 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001479 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1480 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1481 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1482 }
1483}
1484
Alec Mouri80863a62019-01-17 15:19:35 -08001485TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001486 sp<SurfaceControl> parent;
1487 sp<SurfaceControl> child;
1488 const uint8_t size = 64;
1489 const uint8_t testArea = 4;
1490 const float cornerRadius = 20.0f;
1491 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1492 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1493 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1494 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1495
1496 Transaction()
1497 .setCornerRadius(parent, cornerRadius)
1498 .reparent(child, parent->getHandle())
1499 .setPosition(child, 0, size / 2)
1500 .apply();
1501 {
1502 const uint8_t bottom = size - 1;
1503 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001504 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001505 // Top edge of child should not have rounded corners because it's translated in the parent
1506 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1507 Color::GREEN);
1508 // But bottom edges should have been clipped according to parent bounds
1509 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1510 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001511 }
1512}
1513
Alec Mouri80863a62019-01-17 15:19:35 -08001514TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001515 sp<SurfaceControl> bufferLayer;
1516 sp<SurfaceControl> colorLayer;
1517 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001518 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001519 ASSERT_NO_FATAL_FAILURE(colorLayer =
1520 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1521 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001522
Vishnu Nair88a11f22018-11-28 18:30:57 -08001523 Transaction()
1524 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1525 .setLayer(colorLayer, mLayerZBase + 1)
1526 .apply();
1527
Chia-I Wue4ef6102017-11-01 15:16:35 -07001528 {
1529 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001530 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001531 }
1532
1533 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1534 const Color expected = {15, 51, 85, 255};
1535 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1536 // channel) should be less than one
1537 const uint8_t tolerance = 1;
1538 Transaction().setColor(colorLayer, color).apply();
1539 {
1540 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001541 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001542 }
1543}
1544
Valerie Haudd0b7572019-01-29 14:59:27 -08001545// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1546// BLUE: prior background color
1547// GREEN: final background color
1548// BLACK: no color or fill
1549void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1550 bool bufferFill, float alpha,
1551 Color finalColor) {
1552 sp<SurfaceControl> layer;
1553 int32_t width = 500;
1554 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001555
Valerie Haudd0b7572019-01-29 14:59:27 -08001556 Color fillColor = Color::RED;
1557 Color priorBgColor = Color::BLUE;
1558 Color expectedColor = Color::BLACK;
1559 switch (layerType) {
1560 case ISurfaceComposerClient::eFXSurfaceColor:
1561 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1562 Transaction()
1563 .setCrop_legacy(layer, Rect(0, 0, width, height))
1564 .setColor(layer, half3(1.0f, 0, 0))
1565 .apply();
1566 expectedColor = fillColor;
1567 break;
1568 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1569 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1570 if (bufferFill) {
1571 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1572 expectedColor = fillColor;
1573 }
1574 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1575 break;
1576 case ISurfaceComposerClient::eFXSurfaceBufferState:
1577 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1578 if (bufferFill) {
1579 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1580 expectedColor = fillColor;
1581 }
1582 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1583 break;
1584 default:
1585 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1586 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001587 }
1588
Valerie Haudd0b7572019-01-29 14:59:27 -08001589 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1590 Transaction()
1591 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1592 .apply();
1593 if (!bufferFill) {
1594 expectedColor = priorBgColor;
1595 }
1596 }
1597
1598 {
1599 SCOPED_TRACE("default before setting background color layer");
1600 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1601 }
Valerie Haua72e2812019-01-23 13:40:39 -08001602 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001603 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001604 .apply();
1605
1606 {
Valerie Haua72e2812019-01-23 13:40:39 -08001607 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001608 shot->expectColor(Rect(0, 0, width, height), finalColor);
1609 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001610 }
1611}
1612
Valerie Haudd0b7572019-01-29 14:59:27 -08001613TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1614 bool priorColor = false;
1615 bool bufferFill = false;
1616 float alpha = 1.0f;
1617 Color finalColor = Color::RED;
1618 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1619 priorColor, bufferFill, alpha, finalColor));
1620}
Valerie Haua72e2812019-01-23 13:40:39 -08001621
Valerie Haudd0b7572019-01-29 14:59:27 -08001622TEST_P(LayerRenderTypeTransactionTest,
1623 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1624 bool priorColor = false;
1625 bool bufferFill = true;
1626 float alpha = 1.0f;
1627 Color finalColor = Color::RED;
1628 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1629 priorColor, bufferFill, alpha, finalColor));
1630}
Valerie Haua72e2812019-01-23 13:40:39 -08001631
Valerie Haudd0b7572019-01-29 14:59:27 -08001632TEST_P(LayerRenderTypeTransactionTest,
1633 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1634 bool priorColor = false;
1635 bool bufferFill = false;
1636 float alpha = 1.0f;
1637 Color finalColor = Color::GREEN;
1638 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1639 priorColor, bufferFill, alpha, finalColor));
1640}
Valerie Haua72e2812019-01-23 13:40:39 -08001641
Valerie Haudd0b7572019-01-29 14:59:27 -08001642TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1643 bool priorColor = true;
1644 bool bufferFill = true;
1645 float alpha = 1.0f;
1646 Color finalColor = Color::RED;
1647 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1648 priorColor, bufferFill, alpha, finalColor));
1649}
1650
1651TEST_P(LayerRenderTypeTransactionTest,
1652 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1653 bool priorColor = true;
1654 bool bufferFill = false;
1655 float alpha = 1.0f;
1656 Color finalColor = Color::GREEN;
1657 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1658 priorColor, bufferFill, alpha, finalColor));
1659}
1660TEST_P(LayerRenderTypeTransactionTest,
1661 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1662 bool priorColor = false;
1663 bool bufferFill = false;
1664 float alpha = 0;
1665 Color finalColor = Color::BLACK;
1666 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1667 priorColor, bufferFill, alpha, finalColor));
1668}
1669
1670TEST_P(LayerRenderTypeTransactionTest,
1671 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1672 bool priorColor = true;
1673 bool bufferFill = false;
1674 float alpha = 0;
1675 Color finalColor = Color::BLACK;
1676 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1677 priorColor, bufferFill, alpha, finalColor));
1678}
1679
1680TEST_P(LayerRenderTypeTransactionTest,
1681 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1682 bool priorColor = false;
1683 bool bufferFill = true;
1684 float alpha = 1.0f;
1685 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001686 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001687 priorColor, bufferFill, alpha, finalColor));
1688}
1689
1690TEST_P(LayerRenderTypeTransactionTest,
1691 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1692 bool priorColor = false;
1693 bool bufferFill = false;
1694 float alpha = 1.0f;
1695 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001696 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001697 priorColor, bufferFill, alpha, finalColor));
1698}
1699
1700TEST_P(LayerRenderTypeTransactionTest,
1701 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1702 bool priorColor = true;
1703 bool bufferFill = false;
1704 float alpha = 1.0f;
1705 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001706 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001707 priorColor, bufferFill, alpha, finalColor));
1708}
1709
1710TEST_P(LayerRenderTypeTransactionTest,
1711 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1712 bool priorColor = false;
1713 bool bufferFill = false;
1714 float alpha = 0;
1715 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001716 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001717 priorColor, bufferFill, alpha, finalColor));
1718}
1719
1720TEST_P(LayerRenderTypeTransactionTest,
1721 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1722 bool priorColor = true;
1723 bool bufferFill = false;
1724 float alpha = 0;
1725 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001726 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001727 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001728}
1729
Alec Mouri80863a62019-01-17 15:19:35 -08001730TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001731 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001732 ASSERT_NO_FATAL_FAILURE(colorLayer =
1733 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1734 ISurfaceComposerClient::eFXSurfaceColor));
1735 Transaction()
1736 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1737 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1738 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001739
Alec Mouri80863a62019-01-17 15:19:35 -08001740 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001741}
1742
Alec Mouri80863a62019-01-17 15:19:35 -08001743TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001744 sp<SurfaceControl> bufferLayer;
1745 sp<SurfaceControl> colorLayer;
1746 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001747 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001748 ASSERT_NO_FATAL_FAILURE(colorLayer =
1749 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1750 ISurfaceComposerClient::eFXSurfaceColor));
1751 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001752
1753 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1754 const float alpha = 0.25f;
1755 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1756 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1757 // channel) should be less than one
1758 const uint8_t tolerance = 1;
1759 Transaction()
1760 .setColor(colorLayer, color)
1761 .setAlpha(colorLayer, alpha)
1762 .setLayer(colorLayer, mLayerZBase + 1)
1763 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001764 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1765 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001766}
1767
Alec Mouri80863a62019-01-17 15:19:35 -08001768TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001769 sp<SurfaceControl> bufferLayer;
1770 sp<SurfaceControl> parentLayer;
1771 sp<SurfaceControl> colorLayer;
1772 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1773 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001774 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001775 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1776 0 /* buffer height */,
1777 ISurfaceComposerClient::eFXSurfaceColor));
1778 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001779 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1780 const float alpha = 0.25f;
1781 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1782 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1783 // channel) should be less than one
1784 const uint8_t tolerance = 1;
1785 Transaction()
1786 .reparent(colorLayer, parentLayer->getHandle())
1787 .setColor(colorLayer, color)
1788 .setAlpha(parentLayer, alpha)
1789 .setLayer(parentLayer, mLayerZBase + 1)
1790 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001791 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1792 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001793}
1794
Alec Mouri80863a62019-01-17 15:19:35 -08001795TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001796 sp<SurfaceControl> bufferLayer;
1797 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001798 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001799
1800 // color is ignored
1801 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001802 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001803}
1804
Alec Mouri80863a62019-01-17 15:19:35 -08001805TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001806 sp<SurfaceControl> layer;
1807 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001808 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001809
1810 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1811 {
1812 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001813 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001814 }
1815
1816 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1817 {
1818 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001819 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001820 }
1821}
1822
Alec Mouri80863a62019-01-17 15:19:35 -08001823TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001824 sp<SurfaceControl> layer;
1825 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001826 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1827 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001828
1829 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1830 {
1831 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001832 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1833 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001834 }
1835
1836 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1837 {
1838 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001839 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1840 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001841 }
1842
1843 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1844 {
1845 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001846 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1847 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001848 }
1849
1850 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1851 {
1852 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001853 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1854 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001855 }
1856
1857 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1858 {
1859 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001860 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1861 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001862 }
1863}
1864
Alec Mouri80863a62019-01-17 15:19:35 -08001865TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001866 sp<SurfaceControl> layer;
1867 ASSERT_NO_FATAL_FAILURE(
1868 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1869 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1870 Color::BLUE, Color::WHITE));
1871
1872 Transaction()
1873 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1874 .setFrame(layer, Rect(0, 0, 32, 32))
1875 .apply();
1876 {
1877 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001878 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1879 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001880 }
1881
1882 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1883 {
1884 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001885 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1886 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001887 }
1888
1889 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1890 {
1891 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001892 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1893 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001894 }
1895
1896 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1897 {
1898 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001899 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1900 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001901 }
1902
1903 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1904 {
1905 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001906 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1907 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001908 }
1909}
1910
Alec Mouri80863a62019-01-17 15:19:35 -08001911TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001912 sp<SurfaceControl> layer;
1913 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001914 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1915 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001916
1917 const float rot = M_SQRT1_2; // 45 degrees
1918 const float trans = M_SQRT2 * 16.0f;
1919 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1920
Alec Mouri80863a62019-01-17 15:19:35 -08001921 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001922 // check a 8x8 region inside each color
1923 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1924 const int32_t halfL = 4;
1925 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1926 };
1927 const int32_t unit = int32_t(trans / 2);
1928 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1929 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1930 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1931 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1932}
1933
Alec Mouri80863a62019-01-17 15:19:35 -08001934TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001935 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001936 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1937 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001938
1939 // setMatrix is applied after any pending resize, unlike setPosition
1940 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1941 {
1942 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001943 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001944 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001945 shot->expectColor(rect, Color::RED);
1946 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001947 }
1948
Marissa Wall861616d2018-10-22 12:52:23 -07001949 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001950 {
1951 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001952 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001953 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001954 }
1955}
1956
Alec Mouri80863a62019-01-17 15:19:35 -08001957TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001958 sp<SurfaceControl> layer;
1959 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001960 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001961
1962 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1963 Transaction()
1964 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1965 .setSize(layer, 64, 64)
1966 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1967 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001968 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001969}
1970
Alec Mouri80863a62019-01-17 15:19:35 -08001971TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001972 sp<SurfaceControl> layer;
1973 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001974 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1975 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001976
1977 // XXX SCALE_CROP is not respected; calling setSize and
1978 // setOverrideScalingMode in separate transactions does not work
1979 // (b/69315456)
1980 Transaction()
1981 .setSize(layer, 64, 16)
1982 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1983 .apply();
1984 {
1985 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001986 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1987 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001988 }
1989}
1990
Dan Stoza000dd012018-08-01 13:31:52 -07001991TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1992 sp<SurfaceControl> layer;
1993 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1994
1995 sp<IBinder> handle = layer->getHandle();
1996 ASSERT_TRUE(handle != nullptr);
1997
1998 FrameStats frameStats;
1999 mClient->getLayerFrameStats(handle, &frameStats);
2000
2001 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2002}
2003
Alec Mouri80863a62019-01-17 15:19:35 -08002004TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002005 sp<SurfaceControl> layer;
2006 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002007 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002008 const Rect crop(8, 8, 24, 24);
2009
Marissa Wallf58c14b2018-07-24 10:50:43 -07002010 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002011 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002012 shot->expectColor(crop, Color::RED);
2013 shot->expectBorder(crop, Color::BLACK);
2014}
2015
Alec Mouri80863a62019-01-17 15:19:35 -08002016TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002017 sp<SurfaceControl> layer;
2018 ASSERT_NO_FATAL_FAILURE(
2019 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2020 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2021 const Rect crop(8, 8, 24, 24);
2022
2023 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002024 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002025 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2026 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002027}
2028
Alec Mouri80863a62019-01-17 15:19:35 -08002029TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002030 sp<SurfaceControl> layer;
2031 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002032 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002033
2034 {
2035 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002036 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002037 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002038 }
2039
2040 {
2041 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002042 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002043 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002044 }
2045}
2046
Alec Mouri80863a62019-01-17 15:19:35 -08002047TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002048 sp<SurfaceControl> layer;
2049 ASSERT_NO_FATAL_FAILURE(
2050 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2051 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2052
2053 {
2054 SCOPED_TRACE("empty rect");
2055 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002056 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002057 }
2058
2059 {
2060 SCOPED_TRACE("negative rect");
2061 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002062 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002063 }
2064}
2065
Alec Mouri80863a62019-01-17 15:19:35 -08002066TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002067 sp<SurfaceControl> layer;
2068 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002069 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002070
Marissa Wallf58c14b2018-07-24 10:50:43 -07002071 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002072 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002073 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2074 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2075}
2076
Alec Mouri80863a62019-01-17 15:19:35 -08002077TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002078 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002079 ASSERT_NO_FATAL_FAILURE(
2080 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002081 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002082 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002083 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2084 BufferUsage::COMPOSER_OVERLAY,
2085 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002086 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2087 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2088
2089 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002090
2091 Transaction().setBuffer(layer, buffer).apply();
2092
2093 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002094 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002095 {
2096 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002097 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002098 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2099 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002100 }
2101
2102 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002103 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002104 {
2105 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002106 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002107 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2108 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002109 }
2110
2111 // Fully out of buffer space bounds
2112 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2113 {
2114 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002115 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002116 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2117 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2118 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002119 }
2120}
2121
Alec Mouri80863a62019-01-17 15:19:35 -08002122TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002123 sp<SurfaceControl> layer;
2124 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002125 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002126
2127 const Point position(32, 32);
2128 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002129 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002130 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002131 shot->expectColor(crop + position, Color::RED);
2132 shot->expectBorder(crop + position, Color::BLACK);
2133}
2134
Alec Mouri80863a62019-01-17 15:19:35 -08002135TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002136 sp<SurfaceControl> layer;
2137 ASSERT_NO_FATAL_FAILURE(
2138 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2139 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2140
Marissa Wall861616d2018-10-22 12:52:23 -07002141 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002142 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002143 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002144 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002145 shot->expectColor(frame, Color::RED);
2146 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002147}
2148
Alec Mouri80863a62019-01-17 15:19:35 -08002149TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002150 sp<SurfaceControl> layer;
2151 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002152 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002153
Marissa Wall861616d2018-10-22 12:52:23 -07002154 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002155 Transaction()
2156 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002157 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002158 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002159 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002160 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2161 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2162}
2163
Alec Mouri80863a62019-01-17 15:19:35 -08002164TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002165 sp<SurfaceControl> layer;
2166 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002167 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002168
Marissa Wallf58c14b2018-07-24 10:50:43 -07002169 // setCrop_legacy is applied immediately by default, with or without resize pending
2170 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002171 {
2172 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002173 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002174 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2175 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2176 }
2177
Marissa Wall61c58622018-07-18 10:12:20 -07002178 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002179 {
2180 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002181 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002182 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2183 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2184 }
2185}
2186
Alec Mouri80863a62019-01-17 15:19:35 -08002187TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002188 sp<SurfaceControl> layer;
2189 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002190 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002191
Marissa Wallf58c14b2018-07-24 10:50:43 -07002192 // request setCrop_legacy to be applied with the next resize
2193 Transaction()
2194 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2195 .setGeometryAppliesWithResize(layer)
2196 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002197 {
2198 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002199 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002200 }
2201
Marissa Wallf58c14b2018-07-24 10:50:43 -07002202 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002203 {
2204 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002205 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002206 }
2207
2208 Transaction().setSize(layer, 16, 16).apply();
2209 {
2210 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002211 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002212 }
2213
2214 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002215 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002216 {
2217 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002218 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002219 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2220 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2221 }
2222}
2223
Alec Mouri80863a62019-01-17 15:19:35 -08002224TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_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 Wallf58c14b2018-07-24 10:50:43 -07002229 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002230 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002231 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002232 .setSize(layer, 16, 16)
2233 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2234 .setGeometryAppliesWithResize(layer)
2235 .apply();
2236 {
2237 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002238 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002239 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2240 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2241 }
2242
2243 // XXX crop is never latched without other geometry change (b/69315677)
2244 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002245 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002246 Transaction().setPosition(layer, 0, 0).apply();
2247 {
2248 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002249 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002250 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2251 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2252 }
2253}
2254
Alec Mouri80863a62019-01-17 15:19:35 -08002255TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002256 sp<SurfaceControl> layer;
2257 ASSERT_NO_FATAL_FAILURE(
2258 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2259 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2260 const Rect frame(8, 8, 24, 24);
2261
2262 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002263 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002264 shot->expectColor(frame, Color::RED);
2265 shot->expectBorder(frame, Color::BLACK);
2266}
2267
Alec Mouri80863a62019-01-17 15:19:35 -08002268TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002269 sp<SurfaceControl> layer;
2270 ASSERT_NO_FATAL_FAILURE(
2271 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2272 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2273
Marissa Wall61c58622018-07-18 10:12:20 -07002274 {
Marissa Wall861616d2018-10-22 12:52:23 -07002275 SCOPED_TRACE("empty rect");
2276 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002277 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002278 }
2279
Marissa Wall61c58622018-07-18 10:12:20 -07002280 {
Marissa Wall861616d2018-10-22 12:52:23 -07002281 SCOPED_TRACE("negative rect");
2282 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002283 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002284 }
2285}
2286
Alec Mouri80863a62019-01-17 15:19:35 -08002287TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002288 sp<SurfaceControl> layer;
2289 ASSERT_NO_FATAL_FAILURE(
2290 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2291 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2292
2293 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002294 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002295 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2296 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002297}
2298
Alec Mouri80863a62019-01-17 15:19:35 -08002299TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002300 sp<SurfaceControl> parent, child;
2301 ASSERT_NO_FATAL_FAILURE(
2302 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2303 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2304 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2305
2306 ASSERT_NO_FATAL_FAILURE(
2307 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2308 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2309
2310 Transaction().reparent(child, parent->getHandle()).apply();
2311
2312 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002313 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002314 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2315 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2316}
2317
Alec Mouri80863a62019-01-17 15:19:35 -08002318TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002319 sp<SurfaceControl> parent, child;
2320 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2321 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2322
2323 ASSERT_NO_FATAL_FAILURE(
2324 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2325 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2326
2327 Transaction().reparent(child, parent->getHandle()).apply();
2328
2329 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002330 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002331 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2332 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2333}
2334
Alec Mouri80863a62019-01-17 15:19:35 -08002335TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002336 sp<SurfaceControl> layer;
2337 ASSERT_NO_FATAL_FAILURE(
2338 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2339 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2340 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2341
2342 std::this_thread::sleep_for(500ms);
2343
2344 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2345
Alec Mouri80863a62019-01-17 15:19:35 -08002346 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002347 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2348 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2349}
2350
Alec Mouri80863a62019-01-17 15:19:35 -08002351TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002352 sp<SurfaceControl> parent, child;
2353 ASSERT_NO_FATAL_FAILURE(
2354 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2355 ASSERT_NO_FATAL_FAILURE(
2356 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2357 Transaction().reparent(child, parent->getHandle()).apply();
2358
2359 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2360 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2361
2362 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2363 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2364
Alec Mouri80863a62019-01-17 15:19:35 -08002365 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002366 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2367 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2368 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2369}
2370
Alec Mouri80863a62019-01-17 15:19:35 -08002371TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002372 sp<SurfaceControl> layer;
2373 ASSERT_NO_FATAL_FAILURE(
2374 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2375
2376 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2377
Alec Mouri80863a62019-01-17 15:19:35 -08002378 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002379 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2380 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002381}
2382
Alec Mouri80863a62019-01-17 15:19:35 -08002383TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002384 sp<SurfaceControl> layer;
2385 ASSERT_NO_FATAL_FAILURE(
2386 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2387
2388 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2389
2390 {
2391 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002392 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002393 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2394 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002395 }
2396
2397 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2398
2399 {
2400 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002401 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002402 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2403 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002404 }
2405
2406 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2407
2408 {
2409 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002410 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002411 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2412 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002413 }
2414}
2415
Alec Mouri80863a62019-01-17 15:19:35 -08002416TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002417 sp<SurfaceControl> layer1;
2418 ASSERT_NO_FATAL_FAILURE(
2419 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2420
2421 sp<SurfaceControl> layer2;
2422 ASSERT_NO_FATAL_FAILURE(
2423 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2424
2425 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2426
Marissa Wall861616d2018-10-22 12:52:23 -07002427 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002428 {
2429 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002430 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002431 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2432 }
2433
2434 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2435
Marissa Wall861616d2018-10-22 12:52:23 -07002436 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002437 {
2438 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002439 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002440 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2441 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2442 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2443 }
2444
2445 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2446 {
2447 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002448 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002449 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2450 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2451 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2452 }
2453
2454 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2455
2456 {
2457 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002458 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002459 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2460 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2461 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2462 }
2463}
2464
Valerie Haua6b15a12019-02-05 14:16:30 -08002465TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002466 sp<SurfaceControl> layer;
2467 ASSERT_NO_FATAL_FAILURE(
2468 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2469
2470 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2471
2472 std::array<sp<GraphicBuffer>, 10> buffers;
2473
2474 size_t idx = 0;
2475 for (auto& buffer : buffers) {
2476 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2477 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2478 BufferUsage::COMPOSER_OVERLAY,
2479 "test");
2480 Color color = colors[idx % colors.size()];
2481 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2482 idx++;
2483 }
2484
2485 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2486 // cache is working.
2487 idx = 0;
2488 for (auto& buffer : buffers) {
2489 for (int i = 0; i < 2; i++) {
2490 Transaction().setBuffer(layer, buffer).apply();
2491
2492 Color color = colors[idx % colors.size()];
2493 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002494 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2495 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002496 }
2497 idx++;
2498 }
2499}
2500
Valerie Haua6b15a12019-02-05 14:16:30 -08002501TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002502 sp<SurfaceControl> layer;
2503 ASSERT_NO_FATAL_FAILURE(
2504 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2505
2506 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2507
2508 std::array<sp<GraphicBuffer>, 70> buffers;
2509
2510 size_t idx = 0;
2511 for (auto& buffer : buffers) {
2512 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2513 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2514 BufferUsage::COMPOSER_OVERLAY,
2515 "test");
2516 Color color = colors[idx % colors.size()];
2517 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2518 idx++;
2519 }
2520
2521 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2522 // cache is working.
2523 idx = 0;
2524 for (auto& buffer : buffers) {
2525 for (int i = 0; i < 2; i++) {
2526 Transaction().setBuffer(layer, buffer).apply();
2527
2528 Color color = colors[idx % colors.size()];
2529 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002530 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2531 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002532 }
2533 idx++;
2534 }
2535}
2536
Valerie Haua6b15a12019-02-05 14:16:30 -08002537TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002538 sp<SurfaceControl> layer;
2539 ASSERT_NO_FATAL_FAILURE(
2540 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2541
2542 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2543
2544 std::array<sp<GraphicBuffer>, 65> buffers;
2545
2546 size_t idx = 0;
2547 for (auto& buffer : buffers) {
2548 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2549 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2550 BufferUsage::COMPOSER_OVERLAY,
2551 "test");
2552 Color color = colors[idx % colors.size()];
2553 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2554 idx++;
2555 }
2556
2557 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2558 // cache is working.
2559 idx = 0;
2560 for (auto& buffer : buffers) {
2561 for (int i = 0; i < 2; i++) {
2562 Transaction().setBuffer(layer, buffer).apply();
2563
2564 Color color = colors[idx % colors.size()];
2565 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002566 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2567 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002568 }
2569 if (idx == 0) {
2570 buffers[0].clear();
2571 }
2572 idx++;
2573 }
2574}
2575
Alec Mouri80863a62019-01-17 15:19:35 -08002576TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002577 sp<SurfaceControl> layer;
2578 ASSERT_NO_FATAL_FAILURE(
2579 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2580
2581 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2582 Color::BLUE, Color::WHITE));
2583
Marissa Wall861616d2018-10-22 12:52:23 -07002584 Transaction()
2585 .setFrame(layer, Rect(0, 0, 32, 32))
2586 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2587 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002588
Alec Mouri80863a62019-01-17 15:19:35 -08002589 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2590 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002591}
2592
Alec Mouri80863a62019-01-17 15:19:35 -08002593TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002594 sp<SurfaceControl> layer;
2595 ASSERT_NO_FATAL_FAILURE(
2596 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2597
2598 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2599 Color::BLUE, Color::WHITE));
2600
Marissa Wall861616d2018-10-22 12:52:23 -07002601 Transaction()
2602 .setFrame(layer, Rect(0, 0, 32, 32))
2603 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2604 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002605
Alec Mouri80863a62019-01-17 15:19:35 -08002606 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2607 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002608}
2609
Alec Mouri80863a62019-01-17 15:19:35 -08002610TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002611 sp<SurfaceControl> layer;
2612 ASSERT_NO_FATAL_FAILURE(
2613 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2614
2615 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2616 Color::BLUE, Color::WHITE));
2617
Marissa Wall861616d2018-10-22 12:52:23 -07002618 Transaction()
2619 .setFrame(layer, Rect(0, 0, 32, 32))
2620 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2621 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002622
Alec Mouri80863a62019-01-17 15:19:35 -08002623 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2624 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002625}
2626
2627TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2628 sp<SurfaceControl> layer;
2629 ASSERT_NO_FATAL_FAILURE(
2630 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2631
2632 Transaction().setTransformToDisplayInverse(layer, false).apply();
2633
2634 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2635
2636 Transaction().setTransformToDisplayInverse(layer, true).apply();
2637}
2638
Alec Mouri80863a62019-01-17 15:19:35 -08002639TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002640 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002641 Transaction transaction;
2642 ASSERT_NO_FATAL_FAILURE(
2643 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2644
2645 sp<GraphicBuffer> buffer =
2646 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2647 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2648 BufferUsage::COMPOSER_OVERLAY,
2649 "test");
2650 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2651
2652 sp<Fence> fence;
2653 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2654 GTEST_SUCCEED() << "test not supported";
2655 return;
2656 }
2657
2658 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2659
2660 status_t status = fence->wait(1000);
2661 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2662 std::this_thread::sleep_for(200ms);
2663
Alec Mouri80863a62019-01-17 15:19:35 -08002664 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002665 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2666 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002667}
2668
Alec Mouri80863a62019-01-17 15:19:35 -08002669TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002670 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002671 ASSERT_NO_FATAL_FAILURE(
2672 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2673
2674 sp<GraphicBuffer> buffer =
2675 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2676 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2677 BufferUsage::COMPOSER_OVERLAY,
2678 "test");
2679 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2680
Marissa Wallfda30bb2018-10-12 11:34:28 -07002681 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002682
2683 Transaction()
2684 .setBuffer(layer, buffer)
2685 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002686 .apply();
2687
Alec Mouri80863a62019-01-17 15:19:35 -08002688 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002689 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2690 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002691}
2692
Alec Mouri80863a62019-01-17 15:19:35 -08002693TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002694 sp<SurfaceControl> layer;
2695 ASSERT_NO_FATAL_FAILURE(
2696 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2697
2698 sp<GraphicBuffer> buffer =
2699 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2700 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2701 BufferUsage::COMPOSER_OVERLAY,
2702 "test");
2703 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2704
2705 Transaction()
2706 .setBuffer(layer, buffer)
2707 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002708 .apply();
2709
Alec Mouri80863a62019-01-17 15:19:35 -08002710 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002711 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2712 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002713}
2714
Alec Mouri80863a62019-01-17 15:19:35 -08002715TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002716 sp<SurfaceControl> layer;
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 HdrMetadata hdrMetadata;
2728 hdrMetadata.validTypes = 0;
2729 Transaction()
2730 .setBuffer(layer, buffer)
2731 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002732 .apply();
2733
Alec Mouri80863a62019-01-17 15:19:35 -08002734 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002735 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2736 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002737}
2738
Alec Mouri80863a62019-01-17 15:19:35 -08002739TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002740 sp<SurfaceControl> layer;
2741 ASSERT_NO_FATAL_FAILURE(
2742 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2743
2744 sp<GraphicBuffer> buffer =
2745 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2746 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2747 BufferUsage::COMPOSER_OVERLAY,
2748 "test");
2749 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2750
2751 Region region;
2752 region.set(32, 32);
2753 Transaction()
2754 .setBuffer(layer, buffer)
2755 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002756 .apply();
2757
Alec Mouri80863a62019-01-17 15:19:35 -08002758 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002759 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2760 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002761}
2762
Alec Mouri80863a62019-01-17 15:19:35 -08002763TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002764 sp<SurfaceControl> layer;
2765 ASSERT_NO_FATAL_FAILURE(
2766 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2767
2768 sp<GraphicBuffer> buffer =
2769 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2770 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2771 BufferUsage::COMPOSER_OVERLAY,
2772 "test");
2773 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2774
2775 Transaction()
2776 .setBuffer(layer, buffer)
2777 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002778 .apply();
2779
Alec Mouri80863a62019-01-17 15:19:35 -08002780 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002781 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2782 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002783}
2784
2785TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2786 sp<SurfaceControl> layer;
2787 ASSERT_NO_FATAL_FAILURE(
2788 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2789
2790 // verify this doesn't cause a crash
2791 Transaction().setSidebandStream(layer, nullptr).apply();
2792}
2793
Robert Carr54cf5b12019-01-25 14:02:28 -08002794TEST_F(LayerTransactionTest, ReparentToSelf) {
2795 sp<SurfaceControl> layer;
2796 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2797 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2798 Transaction().reparent(layer, layer->getHandle()).apply();
2799
2800 {
2801 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2802 // to still be functioning.
2803 SCOPED_TRACE("after reparent to self");
2804 const Rect rect(0, 0, 32, 32);
2805 auto shot = screenshot();
2806 shot->expectColor(rect, Color::RED);
2807 shot->expectBorder(rect, Color::BLACK);
2808 }
2809}
2810
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002811class ColorTransformHelper {
2812public:
2813 static void DegammaColorSingle(half& s) {
2814 if (s <= 0.03928f)
2815 s = s / 12.92f;
2816 else
2817 s = pow((s + 0.055f) / 1.055f, 2.4f);
2818 }
2819
2820 static void DegammaColor(half3& color) {
2821 DegammaColorSingle(color.r);
2822 DegammaColorSingle(color.g);
2823 DegammaColorSingle(color.b);
2824 }
2825
2826 static void GammaColorSingle(half& s) {
2827 if (s <= 0.0031308f) {
2828 s = s * 12.92f;
2829 } else {
2830 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2831 }
2832 }
2833
2834 static void GammaColor(half3& color) {
2835 GammaColorSingle(color.r);
2836 GammaColorSingle(color.g);
2837 GammaColorSingle(color.b);
2838 }
2839
2840 static void applyMatrix(half3& color, const mat3& mat) {
2841 half3 ret = half3(0);
2842
2843 for (int i = 0; i < 3; i++) {
2844 for (int j = 0; j < 3; j++) {
2845 ret[i] = ret[i] + color[j] * mat[j][i];
2846 }
2847 }
2848 color = ret;
2849 }
2850};
2851
Alec Mouri80863a62019-01-17 15:19:35 -08002852TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002853 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002854 ASSERT_NO_FATAL_FAILURE(colorLayer =
2855 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2856 ISurfaceComposerClient::eFXSurfaceColor));
2857 Transaction()
2858 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2859 .setLayer(colorLayer, mLayerZBase + 1)
2860 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002861 {
2862 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002863 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002864 }
2865
2866 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002867 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002868 mat3 matrix;
2869 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2870 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2871 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002872
2873 // degamma before applying the matrix
2874 if (mColorManagementUsed) {
2875 ColorTransformHelper::DegammaColor(expected);
2876 }
2877
2878 ColorTransformHelper::applyMatrix(expected, matrix);
2879
2880 if (mColorManagementUsed) {
2881 ColorTransformHelper::GammaColor(expected);
2882 }
2883
2884 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2885 uint8_t(expected.b * 255), 255};
2886
2887 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2888 // channel) should be less than one
2889 const uint8_t tolerance = 1;
2890
Peiyong Lind3788632018-09-18 16:01:31 -07002891 Transaction().setColor(colorLayer, color)
2892 .setColorTransform(colorLayer, matrix, vec3()).apply();
2893 {
2894 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002895 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002896 }
2897}
2898
Alec Mouri80863a62019-01-17 15:19:35 -08002899TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002900 sp<SurfaceControl> parentLayer;
2901 sp<SurfaceControl> colorLayer;
2902 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2903 0 /* buffer height */,
2904 ISurfaceComposerClient::eFXSurfaceContainer));
2905 ASSERT_NO_FATAL_FAILURE(
2906 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2907 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2908
2909 Transaction()
2910 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2911 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2912 .setLayer(parentLayer, mLayerZBase + 1)
2913 .apply();
2914 {
2915 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002916 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002917 }
2918
2919 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2920 half3 expected = color;
2921 mat3 matrix;
2922 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2923 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2924 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2925
2926 // degamma before applying the matrix
2927 if (mColorManagementUsed) {
2928 ColorTransformHelper::DegammaColor(expected);
2929 }
2930
2931 ColorTransformHelper::applyMatrix(expected, matrix);
2932
2933 if (mColorManagementUsed) {
2934 ColorTransformHelper::GammaColor(expected);
2935 }
2936
2937 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2938 uint8_t(expected.b * 255), 255};
2939
2940 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2941 // channel) should be less than one
2942 const uint8_t tolerance = 1;
2943
2944 Transaction()
2945 .setColor(colorLayer, color)
2946 .setColorTransform(parentLayer, matrix, vec3())
2947 .apply();
2948 {
2949 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002950 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002951 }
2952}
2953
Alec Mouri80863a62019-01-17 15:19:35 -08002954TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002955 sp<SurfaceControl> parentLayer;
2956 sp<SurfaceControl> colorLayer;
2957 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2958 0 /* buffer height */,
2959 ISurfaceComposerClient::eFXSurfaceContainer));
2960 ASSERT_NO_FATAL_FAILURE(
2961 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2962 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2963
2964 Transaction()
2965 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2966 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2967 .setLayer(parentLayer, mLayerZBase + 1)
2968 .apply();
2969 {
2970 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002971 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002972 }
2973
2974 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2975 half3 expected = color;
2976 mat3 matrixChild;
2977 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2978 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2979 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2980 mat3 matrixParent;
2981 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2982 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2983 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2984
2985 // degamma before applying the matrix
2986 if (mColorManagementUsed) {
2987 ColorTransformHelper::DegammaColor(expected);
2988 }
2989
2990 ColorTransformHelper::applyMatrix(expected, matrixChild);
2991 ColorTransformHelper::applyMatrix(expected, matrixParent);
2992
2993 if (mColorManagementUsed) {
2994 ColorTransformHelper::GammaColor(expected);
2995 }
2996
2997 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2998 uint8_t(expected.b * 255), 255};
2999
3000 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3001 // channel) should be less than one
3002 const uint8_t tolerance = 1;
3003
3004 Transaction()
3005 .setColor(colorLayer, color)
3006 .setColorTransform(parentLayer, matrixParent, vec3())
3007 .setColorTransform(colorLayer, matrixChild, vec3())
3008 .apply();
3009 {
3010 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003011 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003012 }
3013}
3014
Marissa Wall80d94ad2019-01-18 16:04:36 -08003015struct CallbackData {
3016 CallbackData() = default;
3017 CallbackData(nsecs_t time, const sp<Fence>& fence,
3018 const std::vector<SurfaceControlStats>& stats)
3019 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3020
3021 nsecs_t latchTime;
3022 sp<Fence> presentFence;
3023 std::vector<SurfaceControlStats> surfaceControlStats;
3024};
3025
Marissa Wallfda30bb2018-10-12 11:34:28 -07003026class ExpectedResult {
3027public:
3028 enum Transaction {
3029 NOT_PRESENTED = 0,
3030 PRESENTED,
3031 };
3032
3033 enum Buffer {
3034 NOT_ACQUIRED = 0,
3035 ACQUIRED,
3036 };
3037
3038 enum PreviousBuffer {
3039 NOT_RELEASED = 0,
3040 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003041 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003042 };
3043
3044 void reset() {
3045 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3046 mExpectedSurfaceResults.clear();
3047 }
3048
3049 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003050 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003051 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3052 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003053 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003054 std::forward_as_tuple(bufferResult, previousBufferResult));
3055 }
3056
3057 void addSurfaces(ExpectedResult::Transaction transactionResult,
3058 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003059 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003060 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3061 for (const auto& layer : layers) {
3062 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3063 }
3064 }
3065
Marissa Wall17b4e452018-12-26 16:32:34 -08003066 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3067 mExpectedPresentTime = expectedPresentTime;
3068 }
3069
Marissa Wall80d94ad2019-01-18 16:04:36 -08003070 void verifyCallbackData(const CallbackData& callbackData) const {
3071 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003072 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3073 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003074 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003075 if (mExpectedPresentTime >= 0) {
3076 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3077 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3078 // if the panel is running at 30 hz, at the worst case, our expected time just
3079 // misses vsync and we have to wait another 33.3ms
3080 ASSERT_LE(presentFence->getSignalTime(),
3081 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3082 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003083 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003084 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003085 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3086 }
3087
Marissa Wall80d94ad2019-01-18 16:04:36 -08003088 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003089 << "wrong number of surfaces";
3090
Marissa Wall80d94ad2019-01-18 16:04:36 -08003091 for (const auto& stats : surfaceControlStats) {
3092 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3093
Marissa Wallfda30bb2018-10-12 11:34:28 -07003094 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3095 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3096 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003097 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003098 }
3099 }
3100
3101private:
3102 class ExpectedSurfaceResult {
3103 public:
3104 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3105 ExpectedResult::PreviousBuffer previousBufferResult)
3106 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3107
Marissa Wall80d94ad2019-01-18 16:04:36 -08003108 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3109 nsecs_t latchTime) const {
3110 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003111
3112 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3113 << "bad acquire time";
3114 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003115
3116 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3117 ASSERT_NE(previousReleaseFence, nullptr)
3118 << "failed to set release prev buffer fence";
3119 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3120 ASSERT_EQ(previousReleaseFence, nullptr)
3121 << "should not have set released prev buffer fence";
3122 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003123 }
3124
3125 private:
3126 ExpectedResult::Buffer mBufferResult;
3127 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3128 };
3129
Marissa Wall80d94ad2019-01-18 16:04:36 -08003130 struct SCHash {
3131 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3132 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003133 }
3134 };
3135 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003136 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003137 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003138};
3139
3140class CallbackHelper {
3141public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003142 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3143 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003144 if (!callbackContext) {
3145 ALOGE("failed to get callback context");
3146 }
3147 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3148 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003149 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003150 helper->mConditionVariable.notify_all();
3151 }
3152
Marissa Wall80d94ad2019-01-18 16:04:36 -08003153 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003154 std::unique_lock lock(mMutex);
3155
Marissa Wall80d94ad2019-01-18 16:04:36 -08003156 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003157 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3158 std::cv_status::timeout)
3159 << "did not receive callback";
3160 }
3161
Marissa Wall80d94ad2019-01-18 16:04:36 -08003162 *outData = std::move(mCallbackDataQueue.front());
3163 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003164 }
3165
3166 void verifyFinalState() {
3167 // Wait to see if there are extra callbacks
3168 std::this_thread::sleep_for(500ms);
3169
3170 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003171 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3172 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003173 }
3174
3175 void* getContext() { return static_cast<void*>(this); }
3176
3177 std::mutex mMutex;
3178 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003179 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180};
3181
3182class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003183public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003184 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003185 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003186 }
3187
Marissa Wall713b63f2018-10-17 15:42:43 -07003188 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003189 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3190 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003191 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003192 sp<GraphicBuffer> buffer;
3193 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003194 if (setBuffer) {
3195 int err = getBuffer(&buffer, &fence);
3196 if (err != NO_ERROR) {
3197 return err;
3198 }
3199
3200 transaction.setBuffer(layer, buffer);
3201 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003202 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003203
Valerie Hauaa194562019-02-05 16:21:38 -08003204 if (setBackgroundColor) {
3205 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3206 ui::Dataspace::UNKNOWN);
3207 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003208 }
3209
3210 transaction.addTransactionCompletedCallback(callbackHelper->function,
3211 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003212 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003213 }
3214
Marissa Wall861616d2018-10-22 12:52:23 -07003215 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3216 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003217 CallbackData callbackData;
3218 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3219 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003220
3221 if (finalState) {
3222 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3223 }
3224 }
3225
Marissa Wall861616d2018-10-22 12:52:23 -07003226 static void waitForCallbacks(CallbackHelper& helper,
3227 const std::vector<ExpectedResult>& expectedResults,
3228 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003229 for (const auto& expectedResult : expectedResults) {
3230 waitForCallback(helper, expectedResult);
3231 }
3232 if (finalState) {
3233 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3234 }
3235 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003236};
3237
Valerie Hauaa194562019-02-05 16:21:38 -08003238TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003239 sp<SurfaceControl> layer;
3240 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3241
3242 Transaction transaction;
3243 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003244 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003245 if (err) {
3246 GTEST_SUCCEED() << "test not supported";
3247 return;
3248 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003249
3250 transaction.apply();
3251
3252 ExpectedResult expected;
3253 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3254 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3255}
3256
Valerie Hauaa194562019-02-05 16:21:38 -08003257TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003258 sp<SurfaceControl> layer;
3259 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3260
3261 Transaction transaction;
3262 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003263 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003264 if (err) {
3265 GTEST_SUCCEED() << "test not supported";
3266 return;
3267 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003268
Marissa Wall861616d2018-10-22 12:52:23 -07003269 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003270
3271 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003272 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3273 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003274 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3275}
3276
Valerie Hauaa194562019-02-05 16:21:38 -08003277TEST_F(LayerCallbackTest, BufferNoColor) {
3278 sp<SurfaceControl> layer;
3279 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3280
3281 Transaction transaction;
3282 CallbackHelper callback;
3283 int err = fillTransaction(transaction, &callback, layer, true, false);
3284 if (err) {
3285 GTEST_SUCCEED() << "test not supported";
3286 return;
3287 }
3288
3289 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3290
3291 ExpectedResult expected;
3292 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3293 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3294}
3295
3296TEST_F(LayerCallbackTest, NoBufferColor) {
3297 sp<SurfaceControl> layer;
3298 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3299
3300 Transaction transaction;
3301 CallbackHelper callback;
3302 int err = fillTransaction(transaction, &callback, layer, false, true);
3303 if (err) {
3304 GTEST_SUCCEED() << "test not supported";
3305 return;
3306 }
3307
3308 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3309
3310 ExpectedResult expected;
3311 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3312 ExpectedResult::Buffer::NOT_ACQUIRED);
3313 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3314}
3315
Marissa Wallfda30bb2018-10-12 11:34:28 -07003316TEST_F(LayerCallbackTest, NoStateChange) {
3317 Transaction transaction;
3318 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003319 int err = fillTransaction(transaction, &callback);
3320 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 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3329}
3330
3331TEST_F(LayerCallbackTest, OffScreen) {
3332 sp<SurfaceControl> layer;
3333 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3334
3335 Transaction transaction;
3336 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003337 int err = fillTransaction(transaction, &callback, layer);
3338 if (err) {
3339 GTEST_SUCCEED() << "test not supported";
3340 return;
3341 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003342
Marissa Wall861616d2018-10-22 12:52:23 -07003343 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003344
3345 ExpectedResult expected;
3346 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3347 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3348}
3349
Valerie Hauaa194562019-02-05 16:21:38 -08003350TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003351 sp<SurfaceControl> layer1, layer2;
3352 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3353 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3354
3355 Transaction transaction1, transaction2;
3356 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003357 int err = fillTransaction(transaction1, &callback1, layer1);
3358 if (err) {
3359 GTEST_SUCCEED() << "test not supported";
3360 return;
3361 }
3362 err = fillTransaction(transaction2, &callback2, layer2);
3363 if (err) {
3364 GTEST_SUCCEED() << "test not supported";
3365 return;
3366 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003367
Marissa Wall861616d2018-10-22 12:52:23 -07003368 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3369 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003370
3371 ExpectedResult expected;
3372 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3373 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3374 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3375}
3376
Valerie Hauaa194562019-02-05 16:21:38 -08003377TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3378 sp<SurfaceControl> layer1, layer2;
3379 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3380 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3381
3382 Transaction transaction1, transaction2;
3383 CallbackHelper callback1, callback2;
3384 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3385 if (err) {
3386 GTEST_SUCCEED() << "test not supported";
3387 return;
3388 }
3389 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3390 if (err) {
3391 GTEST_SUCCEED() << "test not supported";
3392 return;
3393 }
3394
3395 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3396 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3397
3398 ExpectedResult expected;
3399 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3400 ExpectedResult::Buffer::NOT_ACQUIRED);
3401 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3402 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3403}
3404
3405TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3406 sp<SurfaceControl> layer1, layer2;
3407 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3408 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3409
3410 Transaction transaction1, transaction2;
3411 CallbackHelper callback1, callback2;
3412 int err = fillTransaction(transaction1, &callback1, layer1);
3413 if (err) {
3414 GTEST_SUCCEED() << "test not supported";
3415 return;
3416 }
3417 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3418 if (err) {
3419 GTEST_SUCCEED() << "test not supported";
3420 return;
3421 }
3422
3423 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3424 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3425
3426 ExpectedResult expected;
3427 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3428 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3429 ExpectedResult::Buffer::NOT_ACQUIRED);
3430 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3431 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3432}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003433TEST_F(LayerCallbackTest, Merge_SameCallback) {
3434 sp<SurfaceControl> layer1, layer2;
3435 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3436 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3437
3438 Transaction transaction1, transaction2;
3439 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003440 int err = fillTransaction(transaction1, &callback, layer1);
3441 if (err) {
3442 GTEST_SUCCEED() << "test not supported";
3443 return;
3444 }
3445 err = fillTransaction(transaction2, &callback, layer2);
3446 if (err) {
3447 GTEST_SUCCEED() << "test not supported";
3448 return;
3449 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003450
3451 transaction2.merge(std::move(transaction1)).apply();
3452
3453 ExpectedResult expected;
3454 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3455 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3456 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3457}
3458
3459TEST_F(LayerCallbackTest, Merge_SameLayer) {
3460 sp<SurfaceControl> layer;
3461 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3462
3463 Transaction transaction1, transaction2;
3464 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003465 int err = fillTransaction(transaction1, &callback1, layer);
3466 if (err) {
3467 GTEST_SUCCEED() << "test not supported";
3468 return;
3469 }
3470 err = fillTransaction(transaction2, &callback2, layer);
3471 if (err) {
3472 GTEST_SUCCEED() << "test not supported";
3473 return;
3474 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003475
3476 transaction2.merge(std::move(transaction1)).apply();
3477
3478 ExpectedResult expected;
3479 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3480 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3481 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3482}
3483
Marissa Wallfda30bb2018-10-12 11:34:28 -07003484TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3485 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3486 client2(new SurfaceComposerClient);
3487
3488 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3489 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3490
3491 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003492 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003493 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003494 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003495 ISurfaceComposerClient::eFXSurfaceBufferState));
3496
3497 Transaction transaction1, transaction2;
3498 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003499 int err = fillTransaction(transaction1, &callback1, layer1);
3500 if (err) {
3501 GTEST_SUCCEED() << "test not supported";
3502 return;
3503 }
3504 err = fillTransaction(transaction2, &callback2, layer2);
3505 if (err) {
3506 GTEST_SUCCEED() << "test not supported";
3507 return;
3508 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003509
Marissa Wall861616d2018-10-22 12:52:23 -07003510 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3511 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003512
3513 ExpectedResult expected;
3514 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3515 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3516 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3517}
3518
3519TEST_F(LayerCallbackTest, MultipleTransactions) {
3520 sp<SurfaceControl> layer;
3521 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3522
3523 Transaction transaction;
3524 CallbackHelper callback;
3525 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003526 int err = fillTransaction(transaction, &callback, layer);
3527 if (err) {
3528 GTEST_SUCCEED() << "test not supported";
3529 return;
3530 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003531
3532 transaction.apply();
3533
3534 ExpectedResult expected;
3535 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003536 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003537 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3538 : ExpectedResult::PreviousBuffer::RELEASED);
3539 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3540 }
3541 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3542}
3543
3544TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3545 sp<SurfaceControl> layer;
3546 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3547
3548 Transaction transaction;
3549 CallbackHelper callback;
3550 for (size_t i = 0; i < 10; i++) {
3551 ExpectedResult expected;
3552
3553 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003554 int err = fillTransaction(transaction, &callback, layer);
3555 if (err) {
3556 GTEST_SUCCEED() << "test not supported";
3557 return;
3558 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003559 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3560 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003561 int err = fillTransaction(transaction, &callback);
3562 if (err) {
3563 GTEST_SUCCEED() << "test not supported";
3564 return;
3565 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003566 }
3567
3568 transaction.apply();
3569
3570 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3571 }
3572 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3573}
3574
3575TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3576 sp<SurfaceControl> layer;
3577 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3578
3579 Transaction transaction;
3580 CallbackHelper callback;
3581 for (size_t i = 0; i < 10; i++) {
3582 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003583 int err = fillTransaction(transaction, &callback, layer);
3584 if (err) {
3585 GTEST_SUCCEED() << "test not supported";
3586 return;
3587 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003588 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003589 int err = fillTransaction(transaction, &callback);
3590 if (err) {
3591 GTEST_SUCCEED() << "test not supported";
3592 return;
3593 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003594 }
3595
Marissa Wall861616d2018-10-22 12:52:23 -07003596 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003597
3598 ExpectedResult expected;
3599 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3600 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003601 layer,
3602 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3603 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003604 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3605 }
3606 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3607}
3608
3609TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3610 sp<SurfaceControl> layer1, layer2;
3611 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3612 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3613
3614 Transaction transaction1, transaction2;
3615 CallbackHelper callback1, callback2;
3616 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003617 int err = fillTransaction(transaction1, &callback1, layer1);
3618 if (err) {
3619 GTEST_SUCCEED() << "test not supported";
3620 return;
3621 }
3622 err = fillTransaction(transaction2, &callback2, layer2);
3623 if (err) {
3624 GTEST_SUCCEED() << "test not supported";
3625 return;
3626 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003627
Marissa Wall861616d2018-10-22 12:52:23 -07003628 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3629 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003630
3631 ExpectedResult expected;
3632 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003633 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003634 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3635 : ExpectedResult::PreviousBuffer::RELEASED);
3636 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3637 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3638 }
3639 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3640 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3641}
3642
3643TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3644 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3645 client2(new SurfaceComposerClient);
3646 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3647 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3648
3649 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003650 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003651 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003652 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003653 ISurfaceComposerClient::eFXSurfaceBufferState));
3654
3655 Transaction transaction1, transaction2;
3656 CallbackHelper callback1, callback2;
3657 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003658 int err = fillTransaction(transaction1, &callback1, layer1);
3659 if (err) {
3660 GTEST_SUCCEED() << "test not supported";
3661 return;
3662 }
3663 err = fillTransaction(transaction2, &callback2, layer2);
3664 if (err) {
3665 GTEST_SUCCEED() << "test not supported";
3666 return;
3667 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003668
Marissa Wall861616d2018-10-22 12:52:23 -07003669 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3670 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003671
3672 ExpectedResult expected;
3673 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003674 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003675 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3676 : ExpectedResult::PreviousBuffer::RELEASED);
3677 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3678 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3679 }
3680 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3681 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3682}
3683
3684TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3685 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3686 client2(new SurfaceComposerClient);
3687 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3688 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3689
3690 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003691 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003692 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003693 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003694 ISurfaceComposerClient::eFXSurfaceBufferState));
3695
3696 Transaction transaction1, transaction2;
3697 CallbackHelper callback1, callback2;
3698
3699 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003700 int err = fillTransaction(transaction1, &callback1, layer1);
3701 if (err) {
3702 GTEST_SUCCEED() << "test not supported";
3703 return;
3704 }
3705 err = fillTransaction(transaction2, &callback2, layer2);
3706 if (err) {
3707 GTEST_SUCCEED() << "test not supported";
3708 return;
3709 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003710
Marissa Wall861616d2018-10-22 12:52:23 -07003711 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3712 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003713
3714 ExpectedResult expected;
3715 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3716 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3717 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3718 expected.reset();
3719
3720 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003721 err = fillTransaction(transaction1, &callback1);
3722 if (err) {
3723 GTEST_SUCCEED() << "test not supported";
3724 return;
3725 }
3726 err = fillTransaction(transaction2, &callback2);
3727 if (err) {
3728 GTEST_SUCCEED() << "test not supported";
3729 return;
3730 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003731
3732 transaction2.merge(std::move(transaction1)).apply();
3733
3734 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3735 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3736}
3737
3738TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3739 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3740 client2(new SurfaceComposerClient);
3741
3742 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3743 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3744
3745 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003746 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003747 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003748 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003749 ISurfaceComposerClient::eFXSurfaceBufferState));
3750
3751 Transaction transaction1, transaction2;
3752 CallbackHelper callback1, callback2;
3753
3754 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003755 int err = fillTransaction(transaction1, &callback1, layer1);
3756 if (err) {
3757 GTEST_SUCCEED() << "test not supported";
3758 return;
3759 }
3760 err = fillTransaction(transaction2, &callback2, layer2);
3761 if (err) {
3762 GTEST_SUCCEED() << "test not supported";
3763 return;
3764 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003765
Marissa Wall861616d2018-10-22 12:52:23 -07003766 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3767 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003768
3769 ExpectedResult expected;
3770 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3771 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3772 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3773 expected.reset();
3774
3775 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003776 err = fillTransaction(transaction1, &callback1);
3777 if (err) {
3778 GTEST_SUCCEED() << "test not supported";
3779 return;
3780 }
3781 err = fillTransaction(transaction2, &callback2);
3782 if (err) {
3783 GTEST_SUCCEED() << "test not supported";
3784 return;
3785 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003786
Marissa Wall861616d2018-10-22 12:52:23 -07003787 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003788
Marissa Wall713b63f2018-10-17 15:42:43 -07003789 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3790 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003791 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3792 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3793}
3794
3795TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3796 sp<SurfaceControl> layer;
3797 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3798
3799 Transaction transaction;
3800 CallbackHelper callback;
3801 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003802 for (auto& expected : expectedResults) {
3803 expected.reset();
3804 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003805 ExpectedResult::Buffer::ACQUIRED,
3806 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003807
Marissa Wall713b63f2018-10-17 15:42:43 -07003808 int err = fillTransaction(transaction, &callback, layer);
3809 if (err) {
3810 GTEST_SUCCEED() << "test not supported";
3811 return;
3812 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003813
3814 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003815 }
3816 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3817}
3818
3819TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3820 sp<SurfaceControl> layer;
3821 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3822
Marissa Wall713b63f2018-10-17 15:42:43 -07003823 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003824 Transaction transaction;
3825 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003826 int err = fillTransaction(transaction, &callback, layer);
3827 if (err) {
3828 GTEST_SUCCEED() << "test not supported";
3829 return;
3830 }
3831
3832 transaction.apply();
3833
3834 ExpectedResult expected;
3835 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3836 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3837
3838 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003839 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003840 for (auto& expected : expectedResults) {
3841 expected.reset();
3842
Marissa Wall713b63f2018-10-17 15:42:43 -07003843 err = fillTransaction(transaction, &callback);
3844 if (err) {
3845 GTEST_SUCCEED() << "test not supported";
3846 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003847 }
3848
3849 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003850 }
3851 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3852}
3853
3854TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3855 sp<SurfaceControl> layer;
3856 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3857
3858 // Normal call to set up test
3859 Transaction transaction;
3860 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003861 int err = fillTransaction(transaction, &callback, layer);
3862 if (err) {
3863 GTEST_SUCCEED() << "test not supported";
3864 return;
3865 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003866
Marissa Wall861616d2018-10-22 12:52:23 -07003867 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003868
3869 ExpectedResult expectedResult;
3870 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3871 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3872
3873 // Test
3874 std::vector<ExpectedResult> expectedResults(50);
3875 for (auto& expected : expectedResults) {
3876 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003877 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3878 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003879
Marissa Wall713b63f2018-10-17 15:42:43 -07003880 err = fillTransaction(transaction, &callback);
3881 if (err) {
3882 GTEST_SUCCEED() << "test not supported";
3883 return;
3884 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003885
Marissa Wall861616d2018-10-22 12:52:23 -07003886 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003887 }
3888 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3889}
3890
Marissa Wall17b4e452018-12-26 16:32:34 -08003891TEST_F(LayerCallbackTest, DesiredPresentTime) {
3892 sp<SurfaceControl> layer;
3893 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3894
3895 Transaction transaction;
3896 CallbackHelper callback;
3897 int err = fillTransaction(transaction, &callback, layer);
3898 if (err) {
3899 GTEST_SUCCEED() << "test not supported";
3900 return;
3901 }
3902
3903 // Try to present 100ms in the future
3904 nsecs_t time = systemTime() + (100 * 1e6);
3905
3906 transaction.setDesiredPresentTime(time);
3907 transaction.apply();
3908
3909 ExpectedResult expected;
3910 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3911 expected.addExpectedPresentTime(time);
3912 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3913}
3914
3915TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3916 sp<SurfaceControl> layer;
3917 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3918
3919 Transaction transaction;
3920 CallbackHelper callback1;
3921 int err = fillTransaction(transaction, &callback1, layer);
3922 if (err) {
3923 GTEST_SUCCEED() << "test not supported";
3924 return;
3925 }
3926
3927 // Try to present 100ms in the future
3928 nsecs_t time = systemTime() + (100 * 1e6);
3929
3930 transaction.setDesiredPresentTime(time);
3931 transaction.apply();
3932
3933 ExpectedResult expected1;
3934 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3935 expected1.addExpectedPresentTime(time);
3936
3937 CallbackHelper callback2;
3938 err = fillTransaction(transaction, &callback2, layer);
3939 if (err) {
3940 GTEST_SUCCEED() << "test not supported";
3941 return;
3942 }
3943
3944 // Try to present 33ms after the first frame
3945 time += (33.3 * 1e6);
3946
3947 transaction.setDesiredPresentTime(time);
3948 transaction.apply();
3949
3950 ExpectedResult expected2;
3951 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3952 ExpectedResult::Buffer::ACQUIRED,
3953 ExpectedResult::PreviousBuffer::RELEASED);
3954 expected2.addExpectedPresentTime(time);
3955
3956 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3957 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3958}
3959
3960TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3961 sp<SurfaceControl> layer;
3962 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3963
3964 Transaction transaction;
3965 CallbackHelper callback1;
3966 int err = fillTransaction(transaction, &callback1, layer);
3967 if (err) {
3968 GTEST_SUCCEED() << "test not supported";
3969 return;
3970 }
3971
3972 // Try to present 100ms in the future
3973 nsecs_t time = systemTime() + (100 * 1e6);
3974
3975 transaction.setDesiredPresentTime(time);
3976 transaction.apply();
3977
3978 ExpectedResult expected1;
3979 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3980 expected1.addExpectedPresentTime(time);
3981
3982 CallbackHelper callback2;
3983 err = fillTransaction(transaction, &callback2, layer);
3984 if (err) {
3985 GTEST_SUCCEED() << "test not supported";
3986 return;
3987 }
3988
3989 // Try to present 33ms before the previous frame
3990 time -= (33.3 * 1e6);
3991
3992 transaction.setDesiredPresentTime(time);
3993 transaction.apply();
3994
3995 ExpectedResult expected2;
3996 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3997 ExpectedResult::Buffer::ACQUIRED,
3998 ExpectedResult::PreviousBuffer::RELEASED);
3999
4000 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4001 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4002}
4003
4004TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4005 sp<SurfaceControl> layer;
4006 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4007
4008 Transaction transaction;
4009 CallbackHelper callback;
4010 int err = fillTransaction(transaction, &callback, layer);
4011 if (err) {
4012 GTEST_SUCCEED() << "test not supported";
4013 return;
4014 }
4015
4016 // Try to present 100ms in the past
4017 nsecs_t time = systemTime() - (100 * 1e6);
4018
4019 transaction.setDesiredPresentTime(time);
4020 transaction.apply();
4021
4022 ExpectedResult expected;
4023 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4024 expected.addExpectedPresentTime(systemTime());
4025 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4026}
4027
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004028class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004029protected:
4030 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004031 LayerTransactionTest::SetUp();
4032 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004033
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004034 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4035 ASSERT_FALSE(display == nullptr);
4036
Mathias Agopianc666cae2012-07-25 18:56:13 -07004037 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004038 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004039
4040 ssize_t displayWidth = info.w;
4041 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004042
4043 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004044 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4045 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004046 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004047 ASSERT_TRUE(mBGSurfaceControl->isValid());
4048 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4049
4050 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004051 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4052
Peiyong Lin566a3b42018-01-09 18:22:43 -08004053 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004054 ASSERT_TRUE(mFGSurfaceControl->isValid());
4055
4056 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4057
4058 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004059 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004060 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004061 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4062
4063 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4064
Robert Carr4cdc58f2017-08-23 14:22:20 -07004065 asTransaction([&](Transaction& t) {
4066 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004067
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004068 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004069
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004070 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4071 .setPosition(mFGSurfaceControl, 64, 64)
4072 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004073
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004074 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4075 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4076 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004077 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004078 }
4079
4080 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004081 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004082 mBGSurfaceControl = 0;
4083 mFGSurfaceControl = 0;
4084 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004085 }
4086
4087 void waitForPostedBuffers() {
4088 // Since the sync surface is in synchronous mode (i.e. double buffered)
4089 // posting three buffers to it should ensure that at least two
4090 // SurfaceFlinger::handlePageFlip calls have been made, which should
4091 // guaranteed that a buffer posted to another Surface has been retired.
4092 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4093 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4094 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4095 }
4096
Robert Carr4cdc58f2017-08-23 14:22:20 -07004097
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004098 sp<SurfaceControl> mBGSurfaceControl;
4099 sp<SurfaceControl> mFGSurfaceControl;
4100
4101 // This surface is used to ensure that the buffers posted to
4102 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4103 sp<SurfaceControl> mSyncSurfaceControl;
4104};
4105
Robert Carr7f619b22017-11-06 12:56:35 -08004106TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004107
chaviw0e3479f2018-09-10 16:49:30 -07004108 std::unique_ptr<ScreenCapture> sc;
4109
4110 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004111 fillSurfaceRGBA8(relative, 10, 10, 10);
4112 waitForPostedBuffers();
4113
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004114 Transaction{}
4115 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004116 .setPosition(relative, 64, 64)
4117 .apply();
4118
4119 {
4120 // The relative should be on top of the FG control.
4121 ScreenCapture::captureScreen(&sc);
4122 sc->checkPixel(64, 64, 10, 10, 10);
4123 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004124 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004125
4126 {
4127 // Nothing should change at this point.
4128 ScreenCapture::captureScreen(&sc);
4129 sc->checkPixel(64, 64, 10, 10, 10);
4130 }
4131
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004132 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004133
4134 {
4135 // Ensure that the relative was actually hidden, rather than
4136 // being left in the detached but visible state.
4137 ScreenCapture::captureScreen(&sc);
4138 sc->expectFGColor(64, 64);
4139 }
4140}
4141
Robert Carr8d5227b2017-03-16 15:41:03 -07004142class GeometryLatchingTest : public LayerUpdateTest {
4143protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004144 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004145 SCOPED_TRACE(trace);
4146 ScreenCapture::captureScreen(&sc);
4147 // We find the leading edge of the FG surface.
4148 sc->expectFGColor(127, 127);
4149 sc->expectBGColor(128, 128);
4150 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004151
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004152 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004153
4154 void unlockFGBuffer() {
4155 sp<Surface> s = mFGSurfaceControl->getSurface();
4156 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4157 waitForPostedBuffers();
4158 }
4159
Robert Carr8d5227b2017-03-16 15:41:03 -07004160 void completeFGResize() {
4161 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4162 waitForPostedBuffers();
4163 }
4164 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004165 asTransaction([&](Transaction& t) {
4166 t.setSize(mFGSurfaceControl, 64, 64);
4167 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004168 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004169 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004170
4171 EXPECT_INITIAL_STATE("After restoring initial state");
4172 }
chaviw0e3479f2018-09-10 16:49:30 -07004173 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004174};
4175
Robert Carr8d5227b2017-03-16 15:41:03 -07004176class CropLatchingTest : public GeometryLatchingTest {
4177protected:
4178 void EXPECT_CROPPED_STATE(const char* trace) {
4179 SCOPED_TRACE(trace);
4180 ScreenCapture::captureScreen(&sc);
4181 // The edge should be moved back one pixel by our crop.
4182 sc->expectFGColor(126, 126);
4183 sc->expectBGColor(127, 127);
4184 sc->expectBGColor(128, 128);
4185 }
chaviw59f5c562017-06-28 16:39:06 -07004186
4187 void EXPECT_RESIZE_STATE(const char* trace) {
4188 SCOPED_TRACE(trace);
4189 ScreenCapture::captureScreen(&sc);
4190 // The FG is now resized too 128,128 at 64,64
4191 sc->expectFGColor(64, 64);
4192 sc->expectFGColor(191, 191);
4193 sc->expectBGColor(192, 192);
4194 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004195};
4196
Pablo Ceballos05289c22016-04-14 15:49:55 -07004197TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004198 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004199 {
4200 SCOPED_TRACE("before anything");
4201 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004202 sc->expectBGColor(32, 32);
4203 sc->expectFGColor(96, 96);
4204 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004205 }
4206
4207 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004208 asTransaction([&](Transaction& t) {
4209 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004210 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4211 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004212 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004213
Robert Carr4cdc58f2017-08-23 14:22:20 -07004214 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004215 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004216 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4217 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004218 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004219
4220 {
4221 SCOPED_TRACE("before any trigger");
4222 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004223 sc->expectBGColor(32, 32);
4224 sc->expectFGColor(96, 96);
4225 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004226 }
4227
4228 // should trigger the first deferred transaction, but not the second one
4229 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4230 {
4231 SCOPED_TRACE("after first trigger");
4232 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004233 sc->expectBGColor(32, 32);
4234 sc->checkPixel(96, 96, 162, 63, 96);
4235 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004236 }
4237
4238 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004239 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004240
4241 // trigger the second deferred transaction
4242 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4243 {
4244 SCOPED_TRACE("after second trigger");
4245 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004246 sc->expectBGColor(32, 32);
4247 sc->expectBGColor(96, 96);
4248 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004249 }
4250}
4251
Robert Carre392b552017-09-19 12:16:05 -07004252TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004253 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004254
4255 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004256 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4257 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4258 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4259 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004260 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004261 SurfaceComposerClient::Transaction{}
4262 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4263 .show(childNoBuffer)
4264 .show(childBuffer)
4265 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004266 {
4267 ScreenCapture::captureScreen(&sc);
4268 sc->expectChildColor(73, 73);
4269 sc->expectFGColor(74, 74);
4270 }
Vishnu Nair60356342018-11-13 13:00:45 -08004271 SurfaceComposerClient::Transaction{}
4272 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4273 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004274 {
4275 ScreenCapture::captureScreen(&sc);
4276 sc->expectChildColor(73, 73);
4277 sc->expectChildColor(74, 74);
4278 }
4279}
4280
Robert Carr2c5f6d22017-09-26 12:30:35 -07004281TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004282 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004283 {
4284 SCOPED_TRACE("before move");
4285 ScreenCapture::captureScreen(&sc);
4286 sc->expectBGColor(0, 12);
4287 sc->expectFGColor(75, 75);
4288 sc->expectBGColor(145, 145);
4289 }
4290
4291 Transaction t1, t2;
4292 t1.setPosition(mFGSurfaceControl, 128, 128);
4293 t2.setPosition(mFGSurfaceControl, 0, 0);
4294 // We expect that the position update from t2 now
4295 // overwrites the position update from t1.
4296 t1.merge(std::move(t2));
4297 t1.apply();
4298
4299 {
4300 ScreenCapture::captureScreen(&sc);
4301 sc->expectFGColor(1, 1);
4302 }
4303}
4304
Robert Carr1f0a16a2016-10-24 16:27:39 -07004305class ChildLayerTest : public LayerUpdateTest {
4306protected:
4307 void SetUp() override {
4308 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004309 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4310 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004311 fillSurfaceRGBA8(mChild, 200, 200, 200);
4312
4313 {
4314 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004315 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004316 mCapture->expectChildColor(64, 64);
4317 }
4318 }
4319 void TearDown() override {
4320 LayerUpdateTest::TearDown();
4321 mChild = 0;
4322 }
4323
4324 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004325 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004326};
4327
4328TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004329 asTransaction([&](Transaction& t) {
4330 t.show(mChild);
4331 t.setPosition(mChild, 10, 10);
4332 t.setPosition(mFGSurfaceControl, 64, 64);
4333 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004334
4335 {
chaviw0e3479f2018-09-10 16:49:30 -07004336 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004337 // Top left of foreground must now be visible
4338 mCapture->expectFGColor(64, 64);
4339 // But 10 pixels in we should see the child surface
4340 mCapture->expectChildColor(74, 74);
4341 // And 10 more pixels we should be back to the foreground surface
4342 mCapture->expectFGColor(84, 84);
4343 }
4344
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004345 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004346
4347 {
chaviw0e3479f2018-09-10 16:49:30 -07004348 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004349 // Top left of foreground should now be at 0, 0
4350 mCapture->expectFGColor(0, 0);
4351 // But 10 pixels in we should see the child surface
4352 mCapture->expectChildColor(10, 10);
4353 // And 10 more pixels we should be back to the foreground surface
4354 mCapture->expectFGColor(20, 20);
4355 }
4356}
4357
Robert Carr41b08b52017-06-01 16:11:34 -07004358TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004359 asTransaction([&](Transaction& t) {
4360 t.show(mChild);
4361 t.setPosition(mChild, 0, 0);
4362 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004363 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004364 });
Robert Carr41b08b52017-06-01 16:11:34 -07004365
4366 {
chaviw0e3479f2018-09-10 16:49:30 -07004367 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004368 mCapture->expectChildColor(0, 0);
4369 mCapture->expectChildColor(4, 4);
4370 mCapture->expectBGColor(5, 5);
4371 }
4372}
4373
Robert Carr1f0a16a2016-10-24 16:27:39 -07004374TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004375 asTransaction([&](Transaction& t) {
4376 t.show(mChild);
4377 t.setPosition(mFGSurfaceControl, 0, 0);
4378 t.setPosition(mChild, 63, 63);
4379 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004380
4381 {
chaviw0e3479f2018-09-10 16:49:30 -07004382 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004383 mCapture->expectFGColor(0, 0);
4384 // Last pixel in foreground should now be the child.
4385 mCapture->expectChildColor(63, 63);
4386 // But the child should be constrained and the next pixel
4387 // must be the background
4388 mCapture->expectBGColor(64, 64);
4389 }
4390}
4391
4392TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004393 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004394
4395 // Find the boundary between the parent and child
4396 {
chaviw0e3479f2018-09-10 16:49:30 -07004397 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004398 mCapture->expectChildColor(9, 9);
4399 mCapture->expectFGColor(10, 10);
4400 }
4401
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004402 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004403
4404 // The boundary should be twice as far from the origin now.
4405 // The pixels from the last test should all be child now
4406 {
chaviw0e3479f2018-09-10 16:49:30 -07004407 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004408 mCapture->expectChildColor(9, 9);
4409 mCapture->expectChildColor(10, 10);
4410 mCapture->expectChildColor(19, 19);
4411 mCapture->expectFGColor(20, 20);
4412 }
4413}
Robert Carr9524cb32017-02-13 11:32:32 -08004414
Robert Carr6452f122017-03-21 10:41:29 -07004415TEST_F(ChildLayerTest, ChildLayerAlpha) {
4416 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4417 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4418 fillSurfaceRGBA8(mChild, 0, 254, 0);
4419 waitForPostedBuffers();
4420
Robert Carr4cdc58f2017-08-23 14:22:20 -07004421 asTransaction([&](Transaction& t) {
4422 t.show(mChild);
4423 t.setPosition(mChild, 0, 0);
4424 t.setPosition(mFGSurfaceControl, 0, 0);
4425 });
Robert Carr6452f122017-03-21 10:41:29 -07004426
4427 {
chaviw0e3479f2018-09-10 16:49:30 -07004428 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004429 // Unblended child color
4430 mCapture->checkPixel(0, 0, 0, 254, 0);
4431 }
4432
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004433 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004434
4435 {
chaviw0e3479f2018-09-10 16:49:30 -07004436 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004437 // Child and BG blended.
4438 mCapture->checkPixel(0, 0, 127, 127, 0);
4439 }
4440
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004441 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004442
4443 {
chaviw0e3479f2018-09-10 16:49:30 -07004444 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004445 // Child and BG blended.
4446 mCapture->checkPixel(0, 0, 95, 64, 95);
4447 }
4448}
4449
Robert Carr9524cb32017-02-13 11:32:32 -08004450TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004451 asTransaction([&](Transaction& t) {
4452 t.show(mChild);
4453 t.setPosition(mChild, 10, 10);
4454 t.setPosition(mFGSurfaceControl, 64, 64);
4455 });
Robert Carr9524cb32017-02-13 11:32:32 -08004456
4457 {
chaviw0e3479f2018-09-10 16:49:30 -07004458 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004459 // Top left of foreground must now be visible
4460 mCapture->expectFGColor(64, 64);
4461 // But 10 pixels in we should see the child surface
4462 mCapture->expectChildColor(74, 74);
4463 // And 10 more pixels we should be back to the foreground surface
4464 mCapture->expectFGColor(84, 84);
4465 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004466
4467 asTransaction([&](Transaction& t) {
4468 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4469 });
4470
Robert Carr9524cb32017-02-13 11:32:32 -08004471 {
chaviw0e3479f2018-09-10 16:49:30 -07004472 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004473 mCapture->expectFGColor(64, 64);
4474 // In reparenting we should have exposed the entire foreground surface.
4475 mCapture->expectFGColor(74, 74);
4476 // And the child layer should now begin at 10, 10 (since the BG
4477 // layer is at (0, 0)).
4478 mCapture->expectBGColor(9, 9);
4479 mCapture->expectChildColor(10, 10);
4480 }
4481}
4482
Robert Carr2e102c92018-10-23 12:11:15 -07004483TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4484 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004485 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004486 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4487
4488 {
4489 SCOPED_TRACE("Grandchild visible");
4490 ScreenCapture::captureScreen(&mCapture);
4491 mCapture->checkPixel(64, 64, 111, 111, 111);
4492 }
4493
Robert Carr87246532019-02-04 15:20:26 -08004494 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004495
4496 {
4497 SCOPED_TRACE("After destroying child");
4498 ScreenCapture::captureScreen(&mCapture);
4499 mCapture->expectFGColor(64, 64);
4500 }
4501
4502 asTransaction([&](Transaction& t) {
4503 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4504 });
4505
4506 {
4507 SCOPED_TRACE("After reparenting grandchild");
4508 ScreenCapture::captureScreen(&mCapture);
4509 mCapture->checkPixel(64, 64, 111, 111, 111);
4510 }
4511}
4512
chaviw161410b02017-07-27 10:46:08 -07004513TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004514 asTransaction([&](Transaction& t) {
4515 t.show(mChild);
4516 t.setPosition(mChild, 10, 10);
4517 t.setPosition(mFGSurfaceControl, 64, 64);
4518 });
Robert Carr9524cb32017-02-13 11:32:32 -08004519
4520 {
chaviw0e3479f2018-09-10 16:49:30 -07004521 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004522 // Top left of foreground must now be visible
4523 mCapture->expectFGColor(64, 64);
4524 // But 10 pixels in we should see the child surface
4525 mCapture->expectChildColor(74, 74);
4526 // And 10 more pixels we should be back to the foreground surface
4527 mCapture->expectFGColor(84, 84);
4528 }
4529
chaviw0e3479f2018-09-10 16:49:30 -07004530
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004531 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004532
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004533 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004534
chaviw161410b02017-07-27 10:46:08 -07004535 // Since the child has the same client as the parent, it will not get
4536 // detached and will be hidden.
4537 {
chaviw0e3479f2018-09-10 16:49:30 -07004538 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004539 mCapture->expectFGColor(64, 64);
4540 mCapture->expectFGColor(74, 74);
4541 mCapture->expectFGColor(84, 84);
4542 }
4543}
4544
4545TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4546 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004547 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004548 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4549 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004550
chaviw161410b02017-07-27 10:46:08 -07004551 ASSERT_TRUE(mChildNewClient->isValid());
4552
4553 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4554
Robert Carr4cdc58f2017-08-23 14:22:20 -07004555 asTransaction([&](Transaction& t) {
4556 t.hide(mChild);
4557 t.show(mChildNewClient);
4558 t.setPosition(mChildNewClient, 10, 10);
4559 t.setPosition(mFGSurfaceControl, 64, 64);
4560 });
chaviw161410b02017-07-27 10:46:08 -07004561
4562 {
chaviw0e3479f2018-09-10 16:49:30 -07004563 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004564 // Top left of foreground must now be visible
4565 mCapture->expectFGColor(64, 64);
4566 // But 10 pixels in we should see the child surface
4567 mCapture->expectChildColor(74, 74);
4568 // And 10 more pixels we should be back to the foreground surface
4569 mCapture->expectFGColor(84, 84);
4570 }
4571
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004572 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004573
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004574 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004575
Robert Carr9524cb32017-02-13 11:32:32 -08004576 // Nothing should have changed.
4577 {
chaviw0e3479f2018-09-10 16:49:30 -07004578 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004579 mCapture->expectFGColor(64, 64);
4580 mCapture->expectChildColor(74, 74);
4581 mCapture->expectFGColor(84, 84);
4582 }
4583}
4584
chaviw5aedec92018-10-22 10:40:38 -07004585TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4586 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4587 sp<SurfaceControl> childNewClient =
4588 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4589 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4590
4591 ASSERT_TRUE(childNewClient != nullptr);
4592 ASSERT_TRUE(childNewClient->isValid());
4593
4594 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4595
4596 Transaction()
4597 .hide(mChild)
4598 .show(childNewClient)
4599 .setPosition(childNewClient, 10, 10)
4600 .setPosition(mFGSurfaceControl, 64, 64)
4601 .apply();
4602
4603 {
4604 mCapture = screenshot();
4605 // Top left of foreground must now be visible
4606 mCapture->expectFGColor(64, 64);
4607 // But 10 pixels in we should see the child surface
4608 mCapture->expectChildColor(74, 74);
4609 // And 10 more pixels we should be back to the foreground surface
4610 mCapture->expectFGColor(84, 84);
4611 }
4612
4613 Transaction().detachChildren(mFGSurfaceControl).apply();
4614 Transaction().hide(childNewClient).apply();
4615
4616 // Nothing should have changed.
4617 {
4618 mCapture = screenshot();
4619 mCapture->expectFGColor(64, 64);
4620 mCapture->expectChildColor(74, 74);
4621 mCapture->expectFGColor(84, 84);
4622 }
4623
4624 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4625 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4626 32);
4627 Transaction()
4628 .setLayer(newParentSurface, INT32_MAX - 1)
4629 .show(newParentSurface)
4630 .setPosition(newParentSurface, 20, 20)
4631 .reparent(childNewClient, newParentSurface->getHandle())
4632 .apply();
4633 {
4634 mCapture = screenshot();
4635 // Child is now hidden.
4636 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4637 }
4638}
4639
Robert Carr9b429f42017-04-17 14:56:57 -07004640TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004641 asTransaction([&](Transaction& t) {
4642 t.show(mChild);
4643 t.setPosition(mChild, 0, 0);
4644 t.setPosition(mFGSurfaceControl, 0, 0);
4645 });
Robert Carr9b429f42017-04-17 14:56:57 -07004646
4647 {
chaviw0e3479f2018-09-10 16:49:30 -07004648 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004649 // We've positioned the child in the top left.
4650 mCapture->expectChildColor(0, 0);
4651 // But it's only 10x10.
4652 mCapture->expectFGColor(10, 10);
4653 }
4654
Robert Carr4cdc58f2017-08-23 14:22:20 -07004655 asTransaction([&](Transaction& t) {
4656 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4657 // We cause scaling by 2.
4658 t.setSize(mFGSurfaceControl, 128, 128);
4659 });
Robert Carr9b429f42017-04-17 14:56:57 -07004660
4661 {
chaviw0e3479f2018-09-10 16:49:30 -07004662 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004663 // We've positioned the child in the top left.
4664 mCapture->expectChildColor(0, 0);
4665 mCapture->expectChildColor(10, 10);
4666 mCapture->expectChildColor(19, 19);
4667 // And now it should be scaled all the way to 20x20
4668 mCapture->expectFGColor(20, 20);
4669 }
4670}
4671
Robert Carr1725eee2017-04-26 18:32:15 -07004672// Regression test for b/37673612
4673TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004674 asTransaction([&](Transaction& t) {
4675 t.show(mChild);
4676 t.setPosition(mChild, 0, 0);
4677 t.setPosition(mFGSurfaceControl, 0, 0);
4678 });
Robert Carr1725eee2017-04-26 18:32:15 -07004679
4680 {
chaviw0e3479f2018-09-10 16:49:30 -07004681 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004682 // We've positioned the child in the top left.
4683 mCapture->expectChildColor(0, 0);
4684 // But it's only 10x10.
4685 mCapture->expectFGColor(10, 10);
4686 }
Robert Carr1725eee2017-04-26 18:32:15 -07004687 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4688 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004689 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004690 sp<Surface> s = mFGSurfaceControl->getSurface();
4691 auto anw = static_cast<ANativeWindow*>(s.get());
4692 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4693 native_window_set_buffers_dimensions(anw, 64, 128);
4694 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4695 waitForPostedBuffers();
4696
4697 {
4698 // The child should still be in the same place and not have any strange scaling as in
4699 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004700 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004701 mCapture->expectChildColor(0, 0);
4702 mCapture->expectFGColor(10, 10);
4703 }
4704}
4705
Dan Stoza412903f2017-04-27 13:42:17 -07004706TEST_F(ChildLayerTest, Bug36858924) {
4707 // Destroy the child layer
4708 mChild.clear();
4709
4710 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004711 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4712 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004713
4714 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004715 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004716 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4717 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004718 t.show(mChild);
4719 });
Dan Stoza412903f2017-04-27 13:42:17 -07004720
4721 // Render the foreground surface a few times
4722 //
4723 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4724 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4725 // never acquire/release the first buffer
4726 ALOGI("Filling 1");
4727 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4728 ALOGI("Filling 2");
4729 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4730 ALOGI("Filling 3");
4731 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4732 ALOGI("Filling 4");
4733 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4734}
4735
chaviwf1961f72017-09-18 16:41:07 -07004736TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004737 asTransaction([&](Transaction& t) {
4738 t.show(mChild);
4739 t.setPosition(mChild, 10, 10);
4740 t.setPosition(mFGSurfaceControl, 64, 64);
4741 });
chaviw06178942017-07-27 10:25:59 -07004742
4743 {
chaviw0e3479f2018-09-10 16:49:30 -07004744 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004745 // Top left of foreground must now be visible
4746 mCapture->expectFGColor(64, 64);
4747 // But 10 pixels in we should see the child surface
4748 mCapture->expectChildColor(74, 74);
4749 // And 10 more pixels we should be back to the foreground surface
4750 mCapture->expectFGColor(84, 84);
4751 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004752
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004753 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004754
chaviw06178942017-07-27 10:25:59 -07004755 {
chaviw0e3479f2018-09-10 16:49:30 -07004756 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004757 mCapture->expectFGColor(64, 64);
4758 // In reparenting we should have exposed the entire foreground surface.
4759 mCapture->expectFGColor(74, 74);
4760 // And the child layer should now begin at 10, 10 (since the BG
4761 // layer is at (0, 0)).
4762 mCapture->expectBGColor(9, 9);
4763 mCapture->expectChildColor(10, 10);
4764 }
4765}
4766
chaviwf1961f72017-09-18 16:41:07 -07004767TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004768 asTransaction([&](Transaction& t) {
4769 t.show(mChild);
4770 t.setPosition(mChild, 10, 10);
4771 t.setPosition(mFGSurfaceControl, 64, 64);
4772 });
chaviwf1961f72017-09-18 16:41:07 -07004773
4774 {
chaviw0e3479f2018-09-10 16:49:30 -07004775 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004776 // Top left of foreground must now be visible
4777 mCapture->expectFGColor(64, 64);
4778 // But 10 pixels in we should see the child surface
4779 mCapture->expectChildColor(74, 74);
4780 // And 10 more pixels we should be back to the foreground surface
4781 mCapture->expectFGColor(84, 84);
4782 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004783 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004784 {
chaviw0e3479f2018-09-10 16:49:30 -07004785 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004786 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004787 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004788 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004789 mCapture->expectFGColor(84, 84);
4790 }
4791}
4792
4793TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004794 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004795 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004796 ASSERT_TRUE(newSurface->isValid());
4797
4798 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004799 asTransaction([&](Transaction& t) {
4800 t.hide(mChild);
4801 t.show(newSurface);
4802 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004803 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004804 t.setPosition(mFGSurfaceControl, 64, 64);
4805 });
chaviwf1961f72017-09-18 16:41:07 -07004806
4807 {
chaviw0e3479f2018-09-10 16:49:30 -07004808 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004809 // Top left of foreground must now be visible
4810 mCapture->expectFGColor(64, 64);
4811 // At 10, 10 we should see the new surface
4812 mCapture->checkPixel(10, 10, 63, 195, 63);
4813 }
4814
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004815 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004816
4817 {
chaviw0e3479f2018-09-10 16:49:30 -07004818 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004819 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4820 // mFGSurface, putting it at 74, 74.
4821 mCapture->expectFGColor(64, 64);
4822 mCapture->checkPixel(74, 74, 63, 195, 63);
4823 mCapture->expectFGColor(84, 84);
4824 }
4825}
4826
chaviwc9674332017-08-28 12:32:18 -07004827TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004828 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4829 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004830 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4831
4832 {
chaviw0e3479f2018-09-10 16:49:30 -07004833 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004834 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4835 // which begins at 64, 64
4836 mCapture->checkPixel(64, 64, 50, 50, 50);
4837 }
4838}
4839
Robert Carr503c7042017-09-27 15:06:08 -07004840TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004841 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004842 fillSurfaceRGBA8(relative, 255, 255, 255);
4843
4844 Transaction t;
4845 t.setLayer(relative, INT32_MAX)
4846 .setRelativeLayer(mChild, relative->getHandle(), 1)
4847 .setPosition(mFGSurfaceControl, 0, 0)
4848 .apply(true);
4849
4850 // We expect that the child should have been elevated above our
4851 // INT_MAX layer even though it's not a child of it.
4852 {
chaviw0e3479f2018-09-10 16:49:30 -07004853 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004854 mCapture->expectChildColor(0, 0);
4855 mCapture->expectChildColor(9, 9);
4856 mCapture->checkPixel(10, 10, 255, 255, 255);
4857 }
4858}
Vishnu Nair60356342018-11-13 13:00:45 -08004859class BoundlessLayerTest : public LayerUpdateTest {
4860protected:
4861 std::unique_ptr<ScreenCapture> mCapture;
4862};
4863
4864// Verify setting a size on a buffer layer has no effect.
4865TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4866 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004867 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4868 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004869 ASSERT_TRUE(bufferLayer->isValid());
4870 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4871 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4872 {
4873 mCapture = screenshot();
4874 // Top left of background must now be visible
4875 mCapture->expectBGColor(0, 0);
4876 // Foreground Surface bounds must be color layer
4877 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4878 // Buffer layer should not extend past buffer bounds
4879 mCapture->expectFGColor(95, 95);
4880 }
4881}
4882
4883// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4884// which will crop the color layer.
4885TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4886 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004887 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4888 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004889 ASSERT_TRUE(colorLayer->isValid());
4890 asTransaction([&](Transaction& t) {
4891 t.setColor(colorLayer, half3{0, 0, 0});
4892 t.show(colorLayer);
4893 });
4894 {
4895 mCapture = screenshot();
4896 // Top left of background must now be visible
4897 mCapture->expectBGColor(0, 0);
4898 // Foreground Surface bounds must be color layer
4899 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4900 // Color layer should not extend past foreground bounds
4901 mCapture->expectBGColor(129, 129);
4902 }
4903}
4904
4905// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4906// a crop which will be used to crop the color layer.
4907TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004908 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4909 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004910 ASSERT_TRUE(cropLayer->isValid());
4911 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004912 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4913 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004914 ASSERT_TRUE(colorLayer->isValid());
4915 asTransaction([&](Transaction& t) {
4916 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4917 t.setColor(colorLayer, half3{0, 0, 0});
4918 t.show(cropLayer);
4919 t.show(colorLayer);
4920 });
4921 {
4922 mCapture = screenshot();
4923 // Top left of background must now be visible
4924 mCapture->expectBGColor(0, 0);
4925 // Top left of foreground must now be visible
4926 mCapture->expectFGColor(64, 64);
4927 // 5 pixels from the foreground we should see the child surface
4928 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4929 // 10 pixels from the foreground we should be back to the foreground surface
4930 mCapture->expectFGColor(74, 74);
4931 }
4932}
4933
4934// Verify for boundless layer with no children, their transforms have no effect.
4935TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4936 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004937 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4938 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004939 ASSERT_TRUE(colorLayer->isValid());
4940 asTransaction([&](Transaction& t) {
4941 t.setPosition(colorLayer, 320, 320);
4942 t.setMatrix(colorLayer, 2, 0, 0, 2);
4943 t.setColor(colorLayer, half3{0, 0, 0});
4944 t.show(colorLayer);
4945 });
4946 {
4947 mCapture = screenshot();
4948 // Top left of background must now be visible
4949 mCapture->expectBGColor(0, 0);
4950 // Foreground Surface bounds must be color layer
4951 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4952 // Color layer should not extend past foreground bounds
4953 mCapture->expectBGColor(129, 129);
4954 }
4955}
4956
4957// Verify for boundless layer with children, their transforms have an effect.
4958TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4959 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004960 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4961 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004962 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4963 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004964 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4965 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004966 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4967 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004968 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4969 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004970 ASSERT_TRUE(colorLayer->isValid());
4971 asTransaction([&](Transaction& t) {
4972 t.setPosition(boundlessLayerRightShift, 32, 0);
4973 t.show(boundlessLayerRightShift);
4974 t.setPosition(boundlessLayerDownShift, 0, 32);
4975 t.show(boundlessLayerDownShift);
4976 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4977 t.setColor(colorLayer, half3{0, 0, 0});
4978 t.show(colorLayer);
4979 });
4980 {
4981 mCapture = screenshot();
4982 // Top left of background must now be visible
4983 mCapture->expectBGColor(0, 0);
4984 // Top left of foreground must now be visible
4985 mCapture->expectFGColor(64, 64);
4986 // Foreground Surface bounds must be color layer
4987 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4988 // Color layer should not extend past foreground bounds
4989 mCapture->expectBGColor(129, 129);
4990 }
4991}
4992
4993// Verify child layers do not get clipped if they temporarily move into the negative
4994// coordinate space as the result of an intermediate transformation.
4995TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4996 sp<SurfaceControl> boundlessLayer =
4997 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4998 0 /* flags */, mFGSurfaceControl.get());
4999 ASSERT_TRUE(boundlessLayer != nullptr);
5000 ASSERT_TRUE(boundlessLayer->isValid());
5001 sp<SurfaceControl> colorLayer =
5002 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5003 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5004 ASSERT_TRUE(colorLayer != nullptr);
5005 ASSERT_TRUE(colorLayer->isValid());
5006 asTransaction([&](Transaction& t) {
5007 // shift child layer off bounds. If this layer was not boundless, we will
5008 // expect the child layer to be cropped.
5009 t.setPosition(boundlessLayer, 32, 32);
5010 t.show(boundlessLayer);
5011 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5012 // undo shift by parent
5013 t.setPosition(colorLayer, -32, -32);
5014 t.setColor(colorLayer, half3{0, 0, 0});
5015 t.show(colorLayer);
5016 });
5017 {
5018 mCapture = screenshot();
5019 // Top left of background must now be visible
5020 mCapture->expectBGColor(0, 0);
5021 // Foreground Surface bounds must be color layer
5022 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5023 // Color layer should not extend past foreground bounds
5024 mCapture->expectBGColor(129, 129);
5025 }
5026}
5027
5028// Verify for boundless root layers with children, their transforms have an effect.
5029TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005030 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5031 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005032 ASSERT_TRUE(rootBoundlessLayer->isValid());
5033 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005034 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5035 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5036
Vishnu Nair60356342018-11-13 13:00:45 -08005037 ASSERT_TRUE(colorLayer->isValid());
5038 asTransaction([&](Transaction& t) {
5039 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5040 t.setPosition(rootBoundlessLayer, 32, 32);
5041 t.show(rootBoundlessLayer);
5042 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5043 t.setColor(colorLayer, half3{0, 0, 0});
5044 t.show(colorLayer);
5045 t.hide(mFGSurfaceControl);
5046 });
5047 {
5048 mCapture = screenshot();
5049 // Top left of background must now be visible
5050 mCapture->expectBGColor(0, 0);
5051 // Top left of foreground must now be visible
5052 mCapture->expectBGColor(31, 31);
5053 // Foreground Surface bounds must be color layer
5054 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5055 // Color layer should not extend past foreground bounds
5056 mCapture->expectBGColor(97, 97);
5057 }
5058}
Robert Carr503c7042017-09-27 15:06:08 -07005059
chaviwa76b2712017-09-20 12:02:26 -07005060class ScreenCaptureTest : public LayerUpdateTest {
5061protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005062 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005063};
5064
5065TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5066 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005067 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005068 mCapture->expectBGColor(0, 0);
5069 // Doesn't capture FG layer which is at 64, 64
5070 mCapture->expectBGColor(64, 64);
5071}
5072
5073TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5074 auto fgHandle = mFGSurfaceControl->getHandle();
5075
Vishnu Nair88a11f22018-11-28 18:30:57 -08005076 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5077 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005078 fillSurfaceRGBA8(child, 200, 200, 200);
5079
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005080 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005081
5082 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005083 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005084 mCapture->expectFGColor(10, 10);
5085 mCapture->expectChildColor(0, 0);
5086}
5087
Robert Carr578038f2018-03-09 12:25:24 -08005088TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5089 auto fgHandle = mFGSurfaceControl->getHandle();
5090
Vishnu Nair88a11f22018-11-28 18:30:57 -08005091 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5092 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005093 fillSurfaceRGBA8(child, 200, 200, 200);
5094
5095 SurfaceComposerClient::Transaction().show(child).apply(true);
5096
5097 // Captures mFGSurfaceControl's child
5098 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5099 mCapture->checkPixel(10, 10, 0, 0, 0);
5100 mCapture->expectChildColor(0, 0);
5101}
5102
chaviw50da5042018-04-09 13:49:37 -07005103TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005104 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5105 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005106
5107 fillSurfaceRGBA8(child, 200, 200, 200);
5108
5109 SurfaceComposerClient::Transaction().show(child).apply(true);
5110
5111 auto childHandle = child->getHandle();
5112
5113 // Captures child
5114 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5115 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5116 // Area outside of child's bounds is transparent.
5117 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5118}
5119
chaviw4b129c22018-04-09 16:19:43 -07005120TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5121 auto fgHandle = mFGSurfaceControl->getHandle();
5122
Vishnu Nair88a11f22018-11-28 18:30:57 -08005123 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5124 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5125 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005126 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005127 fillSurfaceRGBA8(child, 200, 200, 200);
5128 fillSurfaceRGBA8(relative, 100, 100, 100);
5129
5130 SurfaceComposerClient::Transaction()
5131 .show(child)
5132 // Set relative layer above fg layer so should be shown above when computing all layers.
5133 .setRelativeLayer(relative, fgHandle, 1)
5134 .show(relative)
5135 .apply(true);
5136
5137 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5138 ScreenCapture::captureLayers(&mCapture, fgHandle);
5139 mCapture->expectFGColor(10, 10);
5140 mCapture->expectChildColor(0, 0);
5141}
5142
5143TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5144 auto fgHandle = mFGSurfaceControl->getHandle();
5145
Vishnu Nair88a11f22018-11-28 18:30:57 -08005146 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5147 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5148 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5149 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005150 fillSurfaceRGBA8(child, 200, 200, 200);
5151 fillSurfaceRGBA8(relative, 100, 100, 100);
5152
5153 SurfaceComposerClient::Transaction()
5154 .show(child)
5155 // Set relative layer below fg layer but relative to child layer so it should be shown
5156 // above child layer.
5157 .setLayer(relative, -1)
5158 .setRelativeLayer(relative, child->getHandle(), 1)
5159 .show(relative)
5160 .apply(true);
5161
5162 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5163 // relative value should be taken into account, placing it above child layer.
5164 ScreenCapture::captureLayers(&mCapture, fgHandle);
5165 mCapture->expectFGColor(10, 10);
5166 // Relative layer is showing on top of child layer
5167 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5168}
Robert Carr578038f2018-03-09 12:25:24 -08005169
5170// In the following tests we verify successful skipping of a parent layer,
5171// so we use the same verification logic and only change how we mutate
5172// the parent layer to verify that various properties are ignored.
5173class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5174public:
5175 void SetUp() override {
5176 LayerUpdateTest::SetUp();
5177
Vishnu Nair88a11f22018-11-28 18:30:57 -08005178 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5179 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005180 fillSurfaceRGBA8(mChild, 200, 200, 200);
5181
5182 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5183 }
5184
Vishnu Nair333a9572019-02-15 16:05:56 -08005185 void verify(std::function<void()> verifyStartingState) {
5186 // Verify starting state before a screenshot is taken.
5187 verifyStartingState();
5188
5189 // Verify child layer does not inherit any of the properties of its
5190 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005191 auto fgHandle = mFGSurfaceControl->getHandle();
5192 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5193 mCapture->checkPixel(10, 10, 0, 0, 0);
5194 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005195
5196 // Verify all assumptions are still true after the screenshot is taken.
5197 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005198 }
5199
5200 std::unique_ptr<ScreenCapture> mCapture;
5201 sp<SurfaceControl> mChild;
5202};
5203
Vishnu Nair333a9572019-02-15 16:05:56 -08005204// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005205TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5206
5207 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5208
5209 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005210
5211 // Before and after reparenting, verify child is properly hidden
5212 // when rendering full-screen.
5213 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005214}
5215
5216TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005217 SurfaceComposerClient::Transaction()
5218 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5219 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005220
5221 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005222
5223 // Before and after reparenting, verify child is cropped by parent.
5224 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005225}
5226
Vishnu Nair333a9572019-02-15 16:05:56 -08005227// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005228TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005229 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005230
5231 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005232
Vishnu Nair333a9572019-02-15 16:05:56 -08005233 // Before and after reparenting, verify child is properly scaled.
5234 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005235}
5236
5237
chaviwa76b2712017-09-20 12:02:26 -07005238TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5239 auto fgHandle = mFGSurfaceControl->getHandle();
5240
Vishnu Nair88a11f22018-11-28 18:30:57 -08005241 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5242 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005243 fillSurfaceRGBA8(child, 200, 200, 200);
5244
Vishnu Nair88a11f22018-11-28 18:30:57 -08005245 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5246 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005247
5248 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5249 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005250 .show(child)
5251 .setPosition(grandchild, 5, 5)
5252 .show(grandchild)
5253 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005254
5255 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005256 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005257 mCapture->expectFGColor(10, 10);
5258 mCapture->expectChildColor(0, 0);
5259 mCapture->checkPixel(5, 5, 50, 50, 50);
5260}
5261
5262TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005263 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5264 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005265 fillSurfaceRGBA8(child, 200, 200, 200);
5266 auto childHandle = child->getHandle();
5267
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005268 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005269
5270 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005271 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005272 mCapture->expectChildColor(0, 0);
5273 mCapture->expectChildColor(9, 9);
5274}
5275
5276TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005277 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5278 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005279 fillSurfaceRGBA8(child, 200, 200, 200);
5280 auto childHandle = child->getHandle();
5281
Vishnu Nair88a11f22018-11-28 18:30:57 -08005282 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5283 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005284 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5285
5286 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005287 .show(child)
5288 .setPosition(grandchild, 5, 5)
5289 .show(grandchild)
5290 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005291
5292 auto grandchildHandle = grandchild->getHandle();
5293
5294 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005295 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005296 mCapture->checkPixel(0, 0, 50, 50, 50);
5297 mCapture->checkPixel(4, 4, 50, 50, 50);
5298}
5299
chaviw7206d492017-11-10 16:16:12 -08005300TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005301 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005302 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5303 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005304
Marissa Wall61c58622018-07-18 10:12:20 -07005305 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5306 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005307
5308 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005309 .setLayer(redLayer, INT32_MAX - 1)
5310 .show(redLayer)
5311 .show(blueLayer)
5312 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005313
5314 auto redLayerHandle = redLayer->getHandle();
5315
5316 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005317 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5318 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5319 // red area below the blue area
5320 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5321 // red area to the right of the blue area
5322 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005323
Marissa Wall861616d2018-10-22 12:52:23 -07005324 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005325 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005326 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5327 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005328 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005329 mCapture->checkPixel(30, 30, 0, 0, 0);
5330}
5331
5332TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005333 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005334 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5335 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005336
Marissa Wall61c58622018-07-18 10:12:20 -07005337 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5338 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005339
5340 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005341 .setLayer(redLayer, INT32_MAX - 1)
5342 .show(redLayer)
5343 .show(blueLayer)
5344 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005345
5346 auto redLayerHandle = redLayer->getHandle();
5347
5348 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005349 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5350 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5351 // red area below the blue area
5352 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5353 // red area to the right of the blue area
5354 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005355
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005356 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005357 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005358 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5359 // red area below the blue area
5360 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5361 // red area to the right of the blue area
5362 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005363 mCapture->checkPixel(30, 30, 0, 0, 0);
5364}
5365
5366TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005367 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005368
Marissa Wall61c58622018-07-18 10:12:20 -07005369 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005370
5371 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005372 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005373 SurfaceComposerClient::Transaction().apply(true);
5374
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005375 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005376
5377 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005378 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5379 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005380}
5381
chaviw8e3fe5d2018-02-22 10:55:42 -08005382
5383class DereferenceSurfaceControlTest : public LayerTransactionTest {
5384protected:
5385 void SetUp() override {
5386 LayerTransactionTest::SetUp();
5387 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005388 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005389 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005390 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005391 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5392 {
5393 SCOPED_TRACE("before anything");
5394 auto shot = screenshot();
5395 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5396 }
5397 }
5398 void TearDown() override {
5399 LayerTransactionTest::TearDown();
5400 bgLayer = 0;
5401 fgLayer = 0;
5402 }
5403
5404 sp<SurfaceControl> bgLayer;
5405 sp<SurfaceControl> fgLayer;
5406};
5407
5408TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5409 fgLayer = nullptr;
5410 {
5411 SCOPED_TRACE("after setting null");
5412 auto shot = screenshot();
5413 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5414 }
5415}
5416
5417TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5418 auto transaction = Transaction().show(fgLayer);
5419 fgLayer = nullptr;
5420 {
5421 SCOPED_TRACE("after setting null");
5422 auto shot = screenshot();
5423 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5424 }
5425}
5426
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005427class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5428protected:
5429 virtual void SetUp() {
5430 LayerTransactionTest::SetUp();
5431 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5432
5433 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5434 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5435
5436 sp<IGraphicBufferConsumer> consumer;
5437 BufferQueue::createBufferQueue(&mProducer, &consumer);
5438 consumer->setConsumerName(String8("Virtual disp consumer"));
5439 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5440 }
5441
5442 virtual void TearDown() {
5443 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5444 LayerTransactionTest::TearDown();
5445 mColorLayer = 0;
5446 }
5447
5448 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5449 mVirtualDisplay =
5450 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5451 asTransaction([&](Transaction& t) {
5452 t.setDisplaySurface(mVirtualDisplay, mProducer);
5453 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5454 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5455 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5456 });
5457 }
5458
5459 void createColorLayer(uint32_t layerStack) {
5460 mColorLayer =
5461 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5462 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5463 ASSERT_TRUE(mColorLayer != nullptr);
5464 ASSERT_TRUE(mColorLayer->isValid());
5465 asTransaction([&](Transaction& t) {
5466 t.setLayerStack(mColorLayer, layerStack);
5467 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5468 t.setLayer(mColorLayer, INT32_MAX - 2);
5469 t.setColor(mColorLayer,
5470 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5471 mExpectedColor.b / 255.0f});
5472 t.show(mColorLayer);
5473 });
5474 }
5475
5476 DisplayInfo mMainDisplayInfo;
5477 sp<IBinder> mMainDisplay;
5478 sp<IBinder> mVirtualDisplay;
5479 sp<IGraphicBufferProducer> mProducer;
5480 sp<SurfaceControl> mColorLayer;
5481 Color mExpectedColor = {63, 63, 195, 255};
5482};
5483
5484TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5485 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5486 createColorLayer(1 /* layerStack */);
5487
5488 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5489
5490 // Verify color layer does not render on main display.
5491 std::unique_ptr<ScreenCapture> sc;
5492 ScreenCapture::captureScreen(&sc, mMainDisplay);
5493 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5494 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5495
5496 // Verify color layer renders correctly on virtual display.
5497 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5498 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5499 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5500}
5501
5502TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5503 // Create a display and set its layer stack to the main display's layer stack so
5504 // the contents of the main display are mirrored on to the virtual display.
5505
5506 // Assumption here is that the new mirrored display has the same viewport as the
5507 // primary display that it is mirroring.
5508 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5509 createColorLayer(0 /* layerStack */);
5510
5511 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5512
5513 // Verify color layer renders correctly on main display and it is mirrored on the
5514 // virtual display.
5515 std::unique_ptr<ScreenCapture> sc;
5516 ScreenCapture::captureScreen(&sc, mMainDisplay);
5517 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5518 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5519
5520 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5521 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5522 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5523}
5524
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005525} // namespace android