blob: 181dac6136897f88c855fd145b5a5f2a4f740066 [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>
36
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070037#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070038#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070039#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070040#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070041
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070042#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070043#include <math/vec3.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044
Marissa Wall713b63f2018-10-17 15:42:43 -070045#include "BufferGenerator.h"
46
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070047namespace android {
48
Chia-I Wu718daf82017-10-20 11:57:17 -070049namespace {
50
51struct Color {
52 uint8_t r;
53 uint8_t g;
54 uint8_t b;
55 uint8_t a;
56
57 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070058 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070059 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070060 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070061 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070062 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070063};
64
65const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070066const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070067const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070068const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070069const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070070const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070073using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070074
Chia-I Wu718daf82017-10-20 11:57:17 -070075std::ostream& operator<<(std::ostream& os, const Color& color) {
76 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
77 return os;
78}
79
80// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070081void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
82 const Color& color) {
83 Rect r(0, 0, buffer.width, buffer.height);
84 if (!r.intersect(rect, &r)) {
85 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070086 }
87
Marissa Wall61c58622018-07-18 10:12:20 -070088 int32_t width = r.right - r.left;
89 int32_t height = r.bottom - r.top;
90
91 for (int32_t row = 0; row < height; row++) {
92 uint8_t* dst =
93 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
94 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070095 dst[0] = color.r;
96 dst[1] = color.g;
97 dst[2] = color.b;
98 dst[3] = color.a;
99 dst += 4;
100 }
101 }
102}
103
Marissa Wall61c58622018-07-18 10:12:20 -0700104// Fill a region with the specified color.
105void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
106 Rect r(0, 0, buffer->width, buffer->height);
107 if (!r.intersect(rect, &r)) {
108 return;
109 }
110
111 int32_t width = r.right - r.left;
112 int32_t height = r.bottom - r.top;
113
114 uint8_t* pixels;
115 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
116 reinterpret_cast<void**>(&pixels));
117
118 for (int32_t row = 0; row < height; row++) {
119 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
120 for (int32_t column = 0; column < width; column++) {
121 dst[0] = color.r;
122 dst[1] = color.g;
123 dst[2] = color.b;
124 dst[3] = color.a;
125 dst += 4;
126 }
127 }
128 buffer->unlock();
129}
130
Chia-I Wu718daf82017-10-20 11:57:17 -0700131// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000132void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700133 const Color& color, uint8_t tolerance) {
134 int32_t x = rect.left;
135 int32_t y = rect.top;
136 int32_t width = rect.right - rect.left;
137 int32_t height = rect.bottom - rect.top;
138
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000139 int32_t bufferWidth = int32_t(outBuffer->getWidth());
140 int32_t bufferHeight = int32_t(outBuffer->getHeight());
141 if (x + width > bufferWidth) {
142 x = std::min(x, bufferWidth);
143 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700144 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000145 if (y + height > bufferHeight) {
146 y = std::min(y, bufferHeight);
147 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
149
150 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
151 uint8_t tmp = a >= b ? a - b : b - a;
152 return tmp <= tolerance;
153 };
154 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000155 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700156 for (int32_t i = 0; i < width; i++) {
157 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
158 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
159 << "pixel @ (" << x + i << ", " << y + j << "): "
160 << "expected (" << color << "), "
161 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
162 src += 4;
163 }
164 }
165}
166
167} // anonymous namespace
168
Robert Carr4cdc58f2017-08-23 14:22:20 -0700169using Transaction = SurfaceComposerClient::Transaction;
170
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700171// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700172static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
173 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800174 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800176 ASSERT_TRUE(s != nullptr);
177 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700179 for (int y = 0; y < outBuffer.height; y++) {
180 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700181 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700182 pixel[0] = r;
183 pixel[1] = g;
184 pixel[2] = b;
185 pixel[3] = 255;
186 }
187 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700188 if (unlock) {
189 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
190 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700191}
192
193// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
194// individual pixel values for testing purposes.
195class ScreenCapture : public RefBase {
196public:
chaviw0e3479f2018-09-10 16:49:30 -0700197 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800198 const auto sf = ComposerService::getComposerService();
199 const auto token = sf->getInternalDisplayToken();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700200 SurfaceComposerClient::Transaction().apply(true);
201
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000202 sp<GraphicBuffer> outBuffer;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800203 ASSERT_EQ(NO_ERROR, sf->captureScreen(token, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700204 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000205 }
206
207 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
208 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
209 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
210 SurfaceComposerClient::Transaction().apply(true);
211
212 sp<GraphicBuffer> outBuffer;
213 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
214 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700215 }
216
Robert Carr578038f2018-03-09 12:25:24 -0800217 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
218 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
219 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
220 SurfaceComposerClient::Transaction().apply(true);
221
222 sp<GraphicBuffer> outBuffer;
223 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
224 *sc = std::make_unique<ScreenCapture>(outBuffer);
225 }
226
Chia-I Wu718daf82017-10-20 11:57:17 -0700227 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000228 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
229 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700230 }
231
232 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000233 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700234 const bool leftBorder = rect.left > 0;
235 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000236 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
237 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700238
239 if (topBorder) {
240 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
241 if (leftBorder) {
242 top.left -= 1;
243 }
244 if (rightBorder) {
245 top.right += 1;
246 }
247 expectColor(top, color, tolerance);
248 }
249 if (leftBorder) {
250 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
251 expectColor(left, color, tolerance);
252 }
253 if (rightBorder) {
254 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
255 expectColor(right, color, tolerance);
256 }
257 if (bottomBorder) {
258 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
259 if (leftBorder) {
260 bottom.left -= 1;
261 }
262 if (rightBorder) {
263 bottom.right += 1;
264 }
265 expectColor(bottom, color, tolerance);
266 }
267 }
268
Chia-I Wu93853fe2017-11-02 08:30:27 -0700269 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
270 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
271 uint8_t tolerance = 0) {
272 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
273
274 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
275 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
276 // avoid checking borders due to unspecified filtering behavior
277 const int32_t offsetX = filtered ? 2 : 0;
278 const int32_t offsetY = filtered ? 2 : 0;
279 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
280 tolerance);
281 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
282 tolerance);
283 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
284 tolerance);
285 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
286 bottomRight, tolerance);
287 }
288
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700289 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000290 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
291 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700292 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
293 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700294 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
295 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700296 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700297 }
298 }
299
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700300 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700301
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700302 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700303
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700304 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700305
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800306 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000307 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700308 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700309
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000310 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700311
312private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000313 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800314 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700315};
316
Chia-I Wu718daf82017-10-20 11:57:17 -0700317class LayerTransactionTest : public ::testing::Test {
318protected:
319 void SetUp() override {
320 mClient = new SurfaceComposerClient;
321 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
322
323 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700324
325 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700326 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700327 }
328
chaviw0e3479f2018-09-10 16:49:30 -0700329 virtual void TearDown() {
330 mBlackBgSurface = 0;
331 mClient->dispose();
332 mClient = 0;
333 }
334
Marissa Wallfda30bb2018-10-12 11:34:28 -0700335 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
336 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800337 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
338 auto layer =
339 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700340
Vishnu Nair60356342018-11-13 13:00:45 -0800341 Transaction t;
342 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800343
344 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700345 if (error != NO_ERROR) {
346 ADD_FAILURE() << "failed to initialize SurfaceControl";
347 layer.clear();
348 }
349
350 return layer;
351 }
352
Vishnu Nair88a11f22018-11-28 18:30:57 -0800353 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
354 const char* name, uint32_t width, uint32_t height,
355 PixelFormat format, uint32_t flags,
356 SurfaceControl* parent = nullptr) {
357 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
358 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
359 return layer;
360 }
361
Marissa Wallfda30bb2018-10-12 11:34:28 -0700362 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800363 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
364 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700365 }
366
Marissa Wall61c58622018-07-18 10:12:20 -0700367 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700368 // wait for previous transactions (such as setSize) to complete
369 Transaction().apply(true);
370
371 ANativeWindow_Buffer buffer = {};
372 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
373
374 return buffer;
375 }
376
Marissa Wall61c58622018-07-18 10:12:20 -0700377 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700378 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
379
380 // wait for the newly posted buffer to be latched
381 waitForLayerBuffers();
382 }
383
Marissa Wall61c58622018-07-18 10:12:20 -0700384 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
385 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700386 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700387 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
388 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
389 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700390 }
391
Marissa Wall61c58622018-07-18 10:12:20 -0700392 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
393 int32_t bufferWidth, int32_t bufferHeight) {
394 sp<GraphicBuffer> buffer =
395 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
396 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
397 BufferUsage::COMPOSER_OVERLAY,
398 "test");
399 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700400 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700401 }
402
403 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
404 int32_t bufferWidth, int32_t bufferHeight) {
405 switch (mLayerType) {
406 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
407 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
408 break;
409 case ISurfaceComposerClient::eFXSurfaceBufferState:
410 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
411 break;
412 default:
413 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
414 }
415 }
416
417 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
418 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700419 const Color& topRight, const Color& bottomLeft,
420 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700421 switch (mLayerType) {
422 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
423 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
424 bottomLeft, bottomRight);
425 break;
426 case ISurfaceComposerClient::eFXSurfaceBufferState:
427 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
428 bottomLeft, bottomRight);
429 break;
430 default:
431 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
432 }
433 }
434
435 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
436 int32_t bufferHeight, const Color& topLeft,
437 const Color& topRight, const Color& bottomLeft,
438 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700439 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700440 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
441 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700442
Marissa Wall61c58622018-07-18 10:12:20 -0700443 const int32_t halfW = bufferWidth / 2;
444 const int32_t halfH = bufferHeight / 2;
445 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
446 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
447 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
448 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
449 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700450
Marissa Wall61c58622018-07-18 10:12:20 -0700451 postBufferQueueLayerBuffer(layer);
452 }
453
454 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
455 int32_t bufferHeight, const Color& topLeft,
456 const Color& topRight, const Color& bottomLeft,
457 const Color& bottomRight) {
458 sp<GraphicBuffer> buffer =
459 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
460 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
461 BufferUsage::COMPOSER_OVERLAY,
462 "test");
463
464 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
465
466 const int32_t halfW = bufferWidth / 2;
467 const int32_t halfH = bufferHeight / 2;
468 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
469 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
470 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
471 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
472
473 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700474 }
475
chaviw0e3479f2018-09-10 16:49:30 -0700476 std::unique_ptr<ScreenCapture> screenshot() {
477 std::unique_ptr<ScreenCapture> screenshot;
478 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700479 return screenshot;
480 }
481
Marissa Wall713b63f2018-10-17 15:42:43 -0700482 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
483 static BufferGenerator bufferGenerator;
484 return bufferGenerator.get(outBuffer, outFence);
485 }
486
Chia-I Wu718daf82017-10-20 11:57:17 -0700487 sp<SurfaceComposerClient> mClient;
488
489 sp<IBinder> mDisplay;
490 uint32_t mDisplayWidth;
491 uint32_t mDisplayHeight;
492 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700493 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700494
495 // leave room for ~256 layers
496 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
497
chaviw0e3479f2018-09-10 16:49:30 -0700498 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700499 bool mColorManagementUsed;
500
Chia-I Wu718daf82017-10-20 11:57:17 -0700501private:
502 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800503 mDisplay = mClient->getInternalDisplayToken();
504 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700505
506 // get display width/height
507 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800508 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700509 mDisplayWidth = info.w;
510 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700511 mDisplayRect =
512 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700513
514 // After a new buffer is queued, SurfaceFlinger is notified and will
515 // latch the new buffer on next vsync. Let's heuristically wait for 3
516 // vsyncs.
517 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
518
519 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700520
Vishnu Nair88a11f22018-11-28 18:30:57 -0800521 mBlackBgSurface =
522 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
523 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700524
Chia-I Wu718daf82017-10-20 11:57:17 -0700525 // set layer stack (b/68888219)
526 Transaction t;
527 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800528 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700529 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
530 t.setColor(mBlackBgSurface, half3{0, 0, 0});
531 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700532 t.apply();
533 }
534
chaviw0e3479f2018-09-10 16:49:30 -0700535 void waitForLayerBuffers() {
536 // Request an empty transaction to get applied synchronously to ensure the buffer is
537 // latched.
538 Transaction().apply(true);
539 usleep(mBufferPostDelay);
540 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700541
542 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800543
544 friend class LayerRenderPathTestHarness;
545};
546enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
547
548class LayerRenderPathTestHarness {
549public:
550 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
551 : mDelegate(delegate), mRenderPath(renderPath) {}
552
553 std::unique_ptr<ScreenCapture> getScreenCapture() {
554 switch (mRenderPath) {
555 case RenderPath::SCREENSHOT:
556 return mDelegate->screenshot();
557 case RenderPath::VIRTUAL_DISPLAY:
558
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800559 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800560 DisplayInfo mainDisplayInfo;
561 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
562
563 sp<IBinder> vDisplay;
564 sp<IGraphicBufferProducer> producer;
565 sp<IGraphicBufferConsumer> consumer;
566 sp<BufferItemConsumer> itemConsumer;
567 BufferQueue::createBufferQueue(&producer, &consumer);
568
569 consumer->setConsumerName(String8("Virtual disp consumer"));
570 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
571
572 itemConsumer = new BufferItemConsumer(consumer,
573 // Sample usage bits from screenrecord
574 GRALLOC_USAGE_HW_VIDEO_ENCODER |
575 GRALLOC_USAGE_SW_READ_OFTEN);
576
577 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
578 false /*secure*/);
579
580 SurfaceComposerClient::Transaction t;
581 t.setDisplaySurface(vDisplay, producer);
582 t.setDisplayLayerStack(vDisplay, 0);
583 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
584 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
585 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
586 t.apply();
587 SurfaceComposerClient::Transaction().apply(true);
588 BufferItem item;
589 itemConsumer->acquireBuffer(&item, 0, true);
590 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
591 itemConsumer->releaseBuffer(item);
592 SurfaceComposerClient::destroyDisplay(vDisplay);
593 return sc;
594 }
595 }
596
597protected:
598 LayerTransactionTest* mDelegate;
599 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700600};
601
Alec Mouri80863a62019-01-17 15:19:35 -0800602class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700603public:
Alec Mouri80863a62019-01-17 15:19:35 -0800604 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700605
606 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800607 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700608 // if the flags already have a layer type specified, return an error
609 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
610 return nullptr;
611 }
chaviwf66724d2018-11-28 16:35:21 -0800612 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700613 }
614
615 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
616 int32_t bufferHeight) {
617 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
618 bufferWidth, bufferHeight));
619 }
620
621 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
622 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
623 const Color& bottomLeft, const Color& bottomRight) {
624 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
625 bufferWidth, bufferHeight,
626 topLeft, topRight,
627 bottomLeft, bottomRight));
628 }
629
630protected:
631 uint32_t mLayerType;
632};
633
Alec Mouri80863a62019-01-17 15:19:35 -0800634class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
635 public ::testing::WithParamInterface<uint32_t> {
636public:
637 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
638};
639
640class LayerTypeAndRenderTypeTransactionTest
641 : public LayerTypeTransactionHarness,
642 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
643public:
644 LayerTypeAndRenderTypeTransactionTest()
645 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
646 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
647
648 std::unique_ptr<ScreenCapture> getScreenCapture() {
649 return mRenderPathHarness.getScreenCapture();
650 }
651
652protected:
653 LayerRenderPathTestHarness mRenderPathHarness;
654};
655
656// Environment for starting up binder threads. This is required for testing
657// virtual displays, as BufferQueue parameters may be queried over binder.
658class BinderEnvironment : public ::testing::Environment {
659public:
660 void SetUp() override { ProcessState::self()->startThreadPool(); }
661};
662
663::testing::Environment* const binderEnv =
664 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
665
666class LayerRenderTypeTransactionTest : public LayerTransactionTest,
667 public ::testing::WithParamInterface<RenderPath> {
668public:
669 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
670
671 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
672 void setRelativeZBasicHelper(uint32_t layerType);
673 void setRelativeZGroupHelper(uint32_t layerType);
674 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800675 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
676 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800677
678protected:
679 LayerRenderPathTestHarness mHarness;
680};
681
682INSTANTIATE_TEST_CASE_P(
683 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
684 ::testing::Combine(
685 ::testing::Values(
686 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
687 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
688 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
689
690INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
691 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
692
Marissa Wall61c58622018-07-18 10:12:20 -0700693INSTANTIATE_TEST_CASE_P(
694 LayerTypeTransactionTests, LayerTypeTransactionTest,
695 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
696 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
697
Alec Mouri80863a62019-01-17 15:19:35 -0800698TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700699 sp<SurfaceControl> layer;
700 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700701 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700702
703 {
704 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700705 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800706 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700707 shot->expectColor(rect, Color::RED);
708 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700709 }
710
711 Transaction().setPosition(layer, 5, 10).apply();
712 {
713 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700714 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800715 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700716 shot->expectColor(rect, Color::RED);
717 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700718 }
719}
720
Alec Mouri80863a62019-01-17 15:19:35 -0800721TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700722 sp<SurfaceControl> layer;
723 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700724 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700725
726 // GLES requires only 4 bits of subpixel precision during rasterization
727 // XXX GLES composition does not match HWC composition due to precision
728 // loss (b/69315223)
729 const float epsilon = 1.0f / 16.0f;
730 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
731 {
732 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800733 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700734 }
735
736 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
737 {
738 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800739 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700740 }
741}
742
Alec Mouri80863a62019-01-17 15:19:35 -0800743TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700744 sp<SurfaceControl> layer;
745 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700746 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700747
748 Transaction().setPosition(layer, -32, -32).apply();
749 {
750 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800751 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700752 }
753
754 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
755 {
756 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800757 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700758 }
759}
760
Alec Mouri80863a62019-01-17 15:19:35 -0800761TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700762 sp<SurfaceControl> layer;
763 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700764 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700765
766 // partially out of bounds
767 Transaction().setPosition(layer, -30, -30).apply();
768 {
769 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800770 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 }
772
773 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
774 {
775 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800776 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
777 mDisplayHeight),
778 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700779 }
780}
781
Alec Mouri80863a62019-01-17 15:19:35 -0800782TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700783 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700784 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
785 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700786
787 // setPosition is applied immediately by default, with or without resize
788 // pending
789 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
790 {
791 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800792 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700793 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700794 shot->expectColor(rect, Color::RED);
795 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700796 }
797
Marissa Wall861616d2018-10-22 12:52:23 -0700798 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700799 {
800 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800801 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 }
803}
804
Alec Mouri80863a62019-01-17 15:19:35 -0800805TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700806 sp<SurfaceControl> layer;
807 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700808 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700809
810 // request setPosition to be applied with the next resize
811 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
812 {
813 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800814 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700815 }
816
817 Transaction().setPosition(layer, 15, 20).apply();
818 {
819 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800820 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700821 }
822
823 Transaction().setSize(layer, 64, 64).apply();
824 {
825 SCOPED_TRACE("resize 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 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700830 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700831 {
832 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800833 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 }
835}
836
Alec Mouri80863a62019-01-17 15:19:35 -0800837TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700838 sp<SurfaceControl> layer;
839 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700840 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700841
842 // setPosition is not immediate even with SCALE_TO_WINDOW override
843 Transaction()
844 .setPosition(layer, 5, 10)
845 .setSize(layer, 64, 64)
846 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
847 .setGeometryAppliesWithResize(layer)
848 .apply();
849 {
850 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800851 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700852 }
853
Marissa Wall61c58622018-07-18 10:12:20 -0700854 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 {
856 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800857 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 }
859}
860
Alec Mouri80863a62019-01-17 15:19:35 -0800861TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700862 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700863 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
864 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700865
866 Transaction().setSize(layer, 64, 64).apply();
867 {
868 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800869 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700870 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700871 shot->expectColor(rect, Color::RED);
872 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700873 }
874
Marissa Wall861616d2018-10-22 12:52:23 -0700875 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700876 {
877 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800878 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700879 const Rect rect(0, 0, 64, 64);
880 shot->expectColor(rect, Color::RED);
881 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700882 }
883}
884
Alec Mouri80863a62019-01-17 15:19:35 -0800885TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700886 // cannot test robustness against invalid sizes (zero or really huge)
887}
888
Alec Mouri80863a62019-01-17 15:19:35 -0800889TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700890 sp<SurfaceControl> layer;
891 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700892 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700893
894 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
895 Transaction()
896 .setSize(layer, 64, 64)
897 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
898 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800899 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700900}
901
Alec Mouri80863a62019-01-17 15:19:35 -0800902TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700903 sp<SurfaceControl> layerR;
904 sp<SurfaceControl> layerG;
905 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700906 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700907 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700908 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700909
910 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
911 {
912 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800913 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700914 }
915
916 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
917 {
918 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800919 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700920 }
921}
922
Alec Mouri80863a62019-01-17 15:19:35 -0800923TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700924 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800925 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700926 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800927 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700928 sp<SurfaceControl> layerR;
929 sp<SurfaceControl> layerG;
930 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700931 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700932 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700933 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700934
chaviw0e3479f2018-09-10 16:49:30 -0700935 Transaction()
936 .reparent(layerR, parent->getHandle())
937 .reparent(layerG, parent->getHandle())
938 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700939 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
940 {
941 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800942 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700943 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700944 }
945
946 Transaction().setLayer(layerR, -3).apply();
947 {
948 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800949 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700950 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700951 }
952}
953
Alec Mouri80863a62019-01-17 15:19:35 -0800954void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700955 sp<SurfaceControl> layerR;
956 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700957 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
958 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
959 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
960 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700961
Marissa Wall861616d2018-10-22 12:52:23 -0700962 switch (layerType) {
963 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
964 Transaction()
965 .setPosition(layerG, 16, 16)
966 .setRelativeLayer(layerG, layerR->getHandle(), 1)
967 .apply();
968 break;
969 case ISurfaceComposerClient::eFXSurfaceBufferState:
970 Transaction()
971 .setFrame(layerR, Rect(0, 0, 32, 32))
972 .setFrame(layerG, Rect(16, 16, 48, 48))
973 .setRelativeLayer(layerG, layerR->getHandle(), 1)
974 .apply();
975 break;
976 default:
977 ASSERT_FALSE(true) << "Unsupported layer type";
978 }
Chia-I Wu49313302017-10-31 10:14:40 -0700979 {
980 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800981 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700982 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
983 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
984 }
985
986 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
987 {
988 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800989 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700990 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
991 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
992 }
993}
994
Alec Mouri80863a62019-01-17 15:19:35 -0800995TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700996 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
997}
998
Alec Mouri80863a62019-01-17 15:19:35 -0800999TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001000 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1001}
1002
Marissa Wall61c58622018-07-18 10:12:20 -07001003TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001004 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001005 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001006 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001007 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001008 sp<SurfaceControl> layerR;
1009 sp<SurfaceControl> layerG;
1010 sp<SurfaceControl> layerB;
1011 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001012 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001013 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001014 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001015 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001016 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001017
chaviw0e3479f2018-09-10 16:49:30 -07001018 Transaction()
1019 .reparent(layerB, parent->getHandle())
1020 .apply();
1021
Chia-I Wuec2d9852017-11-21 09:21:01 -08001022 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1023 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1024
chaviw0e3479f2018-09-10 16:49:30 -07001025 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001026 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001027 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001028 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1030}
1031
Alec Mouri80863a62019-01-17 15:19:35 -08001032void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001033 sp<SurfaceControl> layerR;
1034 sp<SurfaceControl> layerG;
1035 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001036 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1037 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1038 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1039 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1040 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1041 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001042
1043 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001044 switch (layerType) {
1045 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1046 Transaction()
1047 .setPosition(layerG, 8, 8)
1048 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1049 .setPosition(layerB, 16, 16)
1050 .setLayer(layerB, mLayerZBase + 2)
1051 .apply();
1052 break;
1053 case ISurfaceComposerClient::eFXSurfaceBufferState:
1054 Transaction()
1055 .setFrame(layerR, Rect(0, 0, 32, 32))
1056 .setFrame(layerG, Rect(8, 8, 40, 40))
1057 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1058 .setFrame(layerB, Rect(16, 16, 48, 48))
1059 .setLayer(layerB, mLayerZBase + 2)
1060 .apply();
1061 break;
1062 default:
1063 ASSERT_FALSE(true) << "Unsupported layer type";
1064 }
1065
Chia-I Wu49313302017-10-31 10:14:40 -07001066 {
1067 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001068 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001069 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1070 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1071 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1072 }
1073
1074 // layerR = 4, layerG = layerR + 3, layerB = 2
1075 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1076 {
1077 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001078 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001079 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1080 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1081 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1082 }
1083
1084 // layerR = 4, layerG = layerR - 3, layerB = 2
1085 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1086 {
1087 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001088 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001089 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1090 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1091 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1092 }
1093
1094 // restore to absolute z
1095 // layerR = 4, layerG = 0, layerB = 2
1096 Transaction().setLayer(layerG, mLayerZBase).apply();
1097 {
1098 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001099 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001100 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1101 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1102 }
1103
1104 // layerR should not affect layerG anymore
1105 // layerR = 1, layerG = 0, layerB = 2
1106 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1107 {
1108 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001109 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001110 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1111 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1112 }
1113}
1114
Alec Mouri80863a62019-01-17 15:19:35 -08001115TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001116 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1117}
1118
Alec Mouri80863a62019-01-17 15:19:35 -08001119TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001120 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1121}
1122
Alec Mouri80863a62019-01-17 15:19:35 -08001123TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001124 sp<SurfaceControl> layerR;
1125 sp<SurfaceControl> layerG;
1126
1127 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001128 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001129 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001130 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001131
1132 Transaction()
1133 .setPosition(layerG, 16, 16)
1134 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1135 .apply();
1136
Robert Carr87246532019-02-04 15:20:26 -08001137 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001138 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001139 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001140}
1141
Alec Mouri80863a62019-01-17 15:19:35 -08001142TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001143 sp<SurfaceControl> layer;
1144 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001145 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001146
1147 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1148 {
1149 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001150 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001151 }
1152
1153 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1154 {
1155 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001156 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001157 }
1158}
1159
Alec Mouri80863a62019-01-17 15:19:35 -08001160TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001161 const Color translucentRed = {100, 0, 0, 100};
1162 sp<SurfaceControl> layerR;
1163 sp<SurfaceControl> layerG;
1164 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001165 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001166 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001167 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001168
1169 Transaction()
1170 .setLayer(layerR, mLayerZBase + 1)
1171 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1172 .apply();
1173 {
1174 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001175 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001176 }
1177
1178 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1179 {
1180 SCOPED_TRACE("layerR translucent");
1181 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001182 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001183 }
1184}
1185
Marissa Wall61c58622018-07-18 10:12:20 -07001186TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001187 sp<SurfaceControl> layer;
1188 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001189 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001190
1191 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001192 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001193 Transaction()
1194 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1195 .apply(true);
1196 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001197 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001198
1199 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1200 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001201 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001202}
1203
Alec Mouri80863a62019-01-17 15:19:35 -08001204TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001205 const Rect top(0, 0, 32, 16);
1206 const Rect bottom(0, 16, 32, 32);
1207 sp<SurfaceControl> layer;
1208 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1209
1210 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001211 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1212 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1213 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001214 // setTransparentRegionHint always applies to the following buffer
1215 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001216 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001217 {
1218 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001219 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001220 shot->expectColor(top, Color::BLACK);
1221 shot->expectColor(bottom, Color::RED);
1222 }
1223
1224 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1225 {
1226 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001227 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001228 shot->expectColor(top, Color::BLACK);
1229 shot->expectColor(bottom, Color::RED);
1230 }
1231
Marissa Wall61c58622018-07-18 10:12:20 -07001232 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1233 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1234 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1235 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001236 {
1237 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001238 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001239 shot->expectColor(top, Color::RED);
1240 shot->expectColor(bottom, Color::BLACK);
1241 }
1242}
1243
Alec Mouri80863a62019-01-17 15:19:35 -08001244TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001245 const Rect top(0, 0, 32, 16);
1246 const Rect bottom(0, 16, 32, 32);
1247 sp<SurfaceControl> layer;
1248 ASSERT_NO_FATAL_FAILURE(
1249 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1250
1251 sp<GraphicBuffer> buffer =
1252 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1253 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1254 BufferUsage::COMPOSER_OVERLAY,
1255 "test");
1256
1257 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1258 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1259 Transaction()
1260 .setTransparentRegionHint(layer, Region(top))
1261 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001262 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001263 .apply();
1264 {
1265 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001266 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001267 shot->expectColor(top, Color::BLACK);
1268 shot->expectColor(bottom, Color::RED);
1269 }
1270
1271 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1272 {
1273 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001274 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001275 shot->expectColor(top, Color::BLACK);
1276 shot->expectColor(bottom, Color::BLACK);
1277 }
1278
1279 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1280 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1281 BufferUsage::COMPOSER_OVERLAY,
1282 "test");
1283
1284 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1285 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001286 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001287 {
1288 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001289 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001290 shot->expectColor(top, Color::RED);
1291 shot->expectColor(bottom, Color::BLACK);
1292 }
1293}
1294
Alec Mouri80863a62019-01-17 15:19:35 -08001295TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001296 sp<SurfaceControl> layerTransparent;
1297 sp<SurfaceControl> layerR;
1298 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1299 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1300
1301 // check that transparent region hint is bound by the layer size
1302 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001303 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001304 .setPosition(layerR, 16, 16)
1305 .setLayer(layerR, mLayerZBase + 1)
1306 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001307 ASSERT_NO_FATAL_FAILURE(
1308 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1309 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001310 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001311}
1312
Alec Mouri80863a62019-01-17 15:19:35 -08001313TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001314 sp<SurfaceControl> layerTransparent;
1315 sp<SurfaceControl> layerR;
1316 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1317 ASSERT_NO_FATAL_FAILURE(
1318 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1319
1320 // check that transparent region hint is bound by the layer size
1321 Transaction()
1322 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1323 .setFrame(layerR, Rect(16, 16, 48, 48))
1324 .setLayer(layerR, mLayerZBase + 1)
1325 .apply();
1326 ASSERT_NO_FATAL_FAILURE(
1327 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1328 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001329 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001330}
1331
Alec Mouri80863a62019-01-17 15:19:35 -08001332void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001333 sp<SurfaceControl> layer1;
1334 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001335 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1336 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1337 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1338 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001339
Marissa Wall861616d2018-10-22 12:52:23 -07001340 switch (layerType) {
1341 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1342 Transaction()
1343 .setAlpha(layer1, 0.25f)
1344 .setAlpha(layer2, 0.75f)
1345 .setPosition(layer2, 16, 0)
1346 .setLayer(layer2, mLayerZBase + 1)
1347 .apply();
1348 break;
1349 case ISurfaceComposerClient::eFXSurfaceBufferState:
1350 Transaction()
1351 .setAlpha(layer1, 0.25f)
1352 .setAlpha(layer2, 0.75f)
1353 .setFrame(layer1, Rect(0, 0, 32, 32))
1354 .setFrame(layer2, Rect(16, 0, 48, 32))
1355 .setLayer(layer2, mLayerZBase + 1)
1356 .apply();
1357 break;
1358 default:
1359 ASSERT_FALSE(true) << "Unsupported layer type";
1360 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001361 {
Alec Mouri80863a62019-01-17 15:19:35 -08001362 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001363 uint8_t r = 16; // 64 * 0.25f
1364 uint8_t g = 48; // 64 * 0.75f
1365 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1366 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1367
1368 r /= 4; // r * (1.0f - 0.75f)
1369 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1370 }
1371}
1372
Alec Mouri80863a62019-01-17 15:19:35 -08001373TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001374 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1375}
1376
Alec Mouri80863a62019-01-17 15:19:35 -08001377TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001378 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1379}
1380
Alec Mouri80863a62019-01-17 15:19:35 -08001381TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001382 const Color color = {64, 0, 0, 255};
1383 sp<SurfaceControl> layer;
1384 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001385 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001386
1387 Transaction().setAlpha(layer, 2.0f).apply();
1388 {
1389 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001390 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001391 }
1392
1393 Transaction().setAlpha(layer, -1.0f).apply();
1394 {
1395 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001396 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001397 }
1398}
1399
Alec Mouri80863a62019-01-17 15:19:35 -08001400TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001401 sp<SurfaceControl> layer;
1402 const uint8_t size = 64;
1403 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001404 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001405 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1406 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1407
1408 Transaction()
1409 .setCornerRadius(layer, cornerRadius)
1410 .apply();
1411 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001412 const uint8_t bottom = size - 1;
1413 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001414 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001415 // Transparent corners
1416 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001417 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1418 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1419 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1420 }
1421}
1422
Alec Mouri80863a62019-01-17 15:19:35 -08001423TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001424 sp<SurfaceControl> parent;
1425 sp<SurfaceControl> child;
1426 const uint8_t size = 64;
1427 const uint8_t testArea = 4;
1428 const float cornerRadius = 20.0f;
1429 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1430 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1431 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1432 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1433
1434 Transaction()
1435 .setCornerRadius(parent, cornerRadius)
1436 .reparent(child, parent->getHandle())
1437 .setPosition(child, 0, size / 2)
1438 .apply();
1439 {
1440 const uint8_t bottom = size - 1;
1441 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001442 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001443 // Top edge of child should not have rounded corners because it's translated in the parent
1444 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1445 Color::GREEN);
1446 // But bottom edges should have been clipped according to parent bounds
1447 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1448 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001449 }
1450}
1451
Alec Mouri80863a62019-01-17 15:19:35 -08001452TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001453 sp<SurfaceControl> bufferLayer;
1454 sp<SurfaceControl> colorLayer;
1455 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001456 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001457 ASSERT_NO_FATAL_FAILURE(colorLayer =
1458 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1459 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001460
Vishnu Nair88a11f22018-11-28 18:30:57 -08001461 Transaction()
1462 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1463 .setLayer(colorLayer, mLayerZBase + 1)
1464 .apply();
1465
Chia-I Wue4ef6102017-11-01 15:16:35 -07001466 {
1467 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001468 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001469 }
1470
1471 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1472 const Color expected = {15, 51, 85, 255};
1473 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1474 // channel) should be less than one
1475 const uint8_t tolerance = 1;
1476 Transaction().setColor(colorLayer, color).apply();
1477 {
1478 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001479 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001480 }
1481}
1482
Valerie Haudd0b7572019-01-29 14:59:27 -08001483// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1484// BLUE: prior background color
1485// GREEN: final background color
1486// BLACK: no color or fill
1487void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1488 bool bufferFill, float alpha,
1489 Color finalColor) {
1490 sp<SurfaceControl> layer;
1491 int32_t width = 500;
1492 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001493
Valerie Haudd0b7572019-01-29 14:59:27 -08001494 Color fillColor = Color::RED;
1495 Color priorBgColor = Color::BLUE;
1496 Color expectedColor = Color::BLACK;
1497 switch (layerType) {
1498 case ISurfaceComposerClient::eFXSurfaceColor:
1499 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1500 Transaction()
1501 .setCrop_legacy(layer, Rect(0, 0, width, height))
1502 .setColor(layer, half3(1.0f, 0, 0))
1503 .apply();
1504 expectedColor = fillColor;
1505 break;
1506 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1507 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1508 if (bufferFill) {
1509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1510 expectedColor = fillColor;
1511 }
1512 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1513 break;
1514 case ISurfaceComposerClient::eFXSurfaceBufferState:
1515 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1516 if (bufferFill) {
1517 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1518 expectedColor = fillColor;
1519 }
1520 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1521 break;
1522 default:
1523 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1524 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001525 }
1526
Valerie Haudd0b7572019-01-29 14:59:27 -08001527 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1528 Transaction()
1529 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1530 .apply();
1531 if (!bufferFill) {
1532 expectedColor = priorBgColor;
1533 }
1534 }
1535
1536 {
1537 SCOPED_TRACE("default before setting background color layer");
1538 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1539 }
Valerie Haua72e2812019-01-23 13:40:39 -08001540 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001541 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001542 .apply();
1543
1544 {
Valerie Haua72e2812019-01-23 13:40:39 -08001545 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001546 shot->expectColor(Rect(0, 0, width, height), finalColor);
1547 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001548 }
1549}
1550
Valerie Haudd0b7572019-01-29 14:59:27 -08001551TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1552 bool priorColor = false;
1553 bool bufferFill = false;
1554 float alpha = 1.0f;
1555 Color finalColor = Color::RED;
1556 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1557 priorColor, bufferFill, alpha, finalColor));
1558}
Valerie Haua72e2812019-01-23 13:40:39 -08001559
Valerie Haudd0b7572019-01-29 14:59:27 -08001560TEST_P(LayerRenderTypeTransactionTest,
1561 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1562 bool priorColor = false;
1563 bool bufferFill = true;
1564 float alpha = 1.0f;
1565 Color finalColor = Color::RED;
1566 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1567 priorColor, bufferFill, alpha, finalColor));
1568}
Valerie Haua72e2812019-01-23 13:40:39 -08001569
Valerie Haudd0b7572019-01-29 14:59:27 -08001570TEST_P(LayerRenderTypeTransactionTest,
1571 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1572 bool priorColor = false;
1573 bool bufferFill = false;
1574 float alpha = 1.0f;
1575 Color finalColor = Color::GREEN;
1576 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1577 priorColor, bufferFill, alpha, finalColor));
1578}
Valerie Haua72e2812019-01-23 13:40:39 -08001579
Valerie Haudd0b7572019-01-29 14:59:27 -08001580TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1581 bool priorColor = true;
1582 bool bufferFill = true;
1583 float alpha = 1.0f;
1584 Color finalColor = Color::RED;
1585 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1586 priorColor, bufferFill, alpha, finalColor));
1587}
1588
1589TEST_P(LayerRenderTypeTransactionTest,
1590 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1591 bool priorColor = true;
1592 bool bufferFill = false;
1593 float alpha = 1.0f;
1594 Color finalColor = Color::GREEN;
1595 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1596 priorColor, bufferFill, alpha, finalColor));
1597}
1598TEST_P(LayerRenderTypeTransactionTest,
1599 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1600 bool priorColor = false;
1601 bool bufferFill = false;
1602 float alpha = 0;
1603 Color finalColor = Color::BLACK;
1604 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1605 priorColor, bufferFill, alpha, finalColor));
1606}
1607
1608TEST_P(LayerRenderTypeTransactionTest,
1609 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1610 bool priorColor = true;
1611 bool bufferFill = false;
1612 float alpha = 0;
1613 Color finalColor = Color::BLACK;
1614 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1615 priorColor, bufferFill, alpha, finalColor));
1616}
1617
1618TEST_P(LayerRenderTypeTransactionTest,
1619 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1620 bool priorColor = false;
1621 bool bufferFill = true;
1622 float alpha = 1.0f;
1623 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001624 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001625 priorColor, bufferFill, alpha, finalColor));
1626}
1627
1628TEST_P(LayerRenderTypeTransactionTest,
1629 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1630 bool priorColor = false;
1631 bool bufferFill = false;
1632 float alpha = 1.0f;
1633 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001634 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001635 priorColor, bufferFill, alpha, finalColor));
1636}
1637
1638TEST_P(LayerRenderTypeTransactionTest,
1639 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1640 bool priorColor = true;
1641 bool bufferFill = false;
1642 float alpha = 1.0f;
1643 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001644 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001645 priorColor, bufferFill, alpha, finalColor));
1646}
1647
1648TEST_P(LayerRenderTypeTransactionTest,
1649 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1650 bool priorColor = false;
1651 bool bufferFill = false;
1652 float alpha = 0;
1653 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001654 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001655 priorColor, bufferFill, alpha, finalColor));
1656}
1657
1658TEST_P(LayerRenderTypeTransactionTest,
1659 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1660 bool priorColor = true;
1661 bool bufferFill = false;
1662 float alpha = 0;
1663 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001664 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001665 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001666}
1667
Alec Mouri80863a62019-01-17 15:19:35 -08001668TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001669 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001670 ASSERT_NO_FATAL_FAILURE(colorLayer =
1671 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1672 ISurfaceComposerClient::eFXSurfaceColor));
1673 Transaction()
1674 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1675 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1676 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001677
Alec Mouri80863a62019-01-17 15:19:35 -08001678 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001679}
1680
Alec Mouri80863a62019-01-17 15:19:35 -08001681TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001682 sp<SurfaceControl> bufferLayer;
1683 sp<SurfaceControl> colorLayer;
1684 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001685 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001686 ASSERT_NO_FATAL_FAILURE(colorLayer =
1687 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1688 ISurfaceComposerClient::eFXSurfaceColor));
1689 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001690
1691 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1692 const float alpha = 0.25f;
1693 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1694 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1695 // channel) should be less than one
1696 const uint8_t tolerance = 1;
1697 Transaction()
1698 .setColor(colorLayer, color)
1699 .setAlpha(colorLayer, alpha)
1700 .setLayer(colorLayer, mLayerZBase + 1)
1701 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001702 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1703 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001704}
1705
Alec Mouri80863a62019-01-17 15:19:35 -08001706TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001707 sp<SurfaceControl> bufferLayer;
1708 sp<SurfaceControl> parentLayer;
1709 sp<SurfaceControl> colorLayer;
1710 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1711 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001712 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001713 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1714 0 /* buffer height */,
1715 ISurfaceComposerClient::eFXSurfaceColor));
1716 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001717 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1718 const float alpha = 0.25f;
1719 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1720 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1721 // channel) should be less than one
1722 const uint8_t tolerance = 1;
1723 Transaction()
1724 .reparent(colorLayer, parentLayer->getHandle())
1725 .setColor(colorLayer, color)
1726 .setAlpha(parentLayer, alpha)
1727 .setLayer(parentLayer, mLayerZBase + 1)
1728 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001729 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1730 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001731}
1732
Alec Mouri80863a62019-01-17 15:19:35 -08001733TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001734 sp<SurfaceControl> bufferLayer;
1735 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001736 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001737
1738 // color is ignored
1739 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
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(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001744 sp<SurfaceControl> layer;
1745 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001746 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001747
1748 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1749 {
1750 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001751 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001752 }
1753
1754 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1755 {
1756 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001757 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001758 }
1759}
1760
Alec Mouri80863a62019-01-17 15:19:35 -08001761TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001762 sp<SurfaceControl> layer;
1763 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001764 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1765 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001766
1767 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1768 {
1769 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001770 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1771 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001772 }
1773
1774 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1775 {
1776 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001777 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1778 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001779 }
1780
1781 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1782 {
1783 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001784 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1785 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001786 }
1787
1788 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1789 {
1790 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001791 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1792 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001793 }
1794
1795 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1796 {
1797 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001798 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1799 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001800 }
1801}
1802
Alec Mouri80863a62019-01-17 15:19:35 -08001803TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001804 sp<SurfaceControl> layer;
1805 ASSERT_NO_FATAL_FAILURE(
1806 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1807 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1808 Color::BLUE, Color::WHITE));
1809
1810 Transaction()
1811 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1812 .setFrame(layer, Rect(0, 0, 32, 32))
1813 .apply();
1814 {
1815 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001816 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1817 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001818 }
1819
1820 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1821 {
1822 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001823 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1824 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001825 }
1826
1827 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1828 {
1829 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001830 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1831 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001832 }
1833
1834 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1835 {
1836 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001837 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1838 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001839 }
1840
1841 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1842 {
1843 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001844 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1845 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001846 }
1847}
1848
Alec Mouri80863a62019-01-17 15:19:35 -08001849TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001850 sp<SurfaceControl> layer;
1851 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001852 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1853 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001854
1855 const float rot = M_SQRT1_2; // 45 degrees
1856 const float trans = M_SQRT2 * 16.0f;
1857 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1858
Alec Mouri80863a62019-01-17 15:19:35 -08001859 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001860 // check a 8x8 region inside each color
1861 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1862 const int32_t halfL = 4;
1863 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1864 };
1865 const int32_t unit = int32_t(trans / 2);
1866 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1867 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1868 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1869 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1870}
1871
Alec Mouri80863a62019-01-17 15:19:35 -08001872TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001873 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001874 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1875 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001876
1877 // setMatrix is applied after any pending resize, unlike setPosition
1878 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1879 {
1880 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001881 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001882 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001883 shot->expectColor(rect, Color::RED);
1884 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001885 }
1886
Marissa Wall861616d2018-10-22 12:52:23 -07001887 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001888 {
1889 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001890 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001891 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001892 }
1893}
1894
Alec Mouri80863a62019-01-17 15:19:35 -08001895TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001896 sp<SurfaceControl> layer;
1897 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001898 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001899
1900 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1901 Transaction()
1902 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1903 .setSize(layer, 64, 64)
1904 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1905 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001906 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001907}
1908
Alec Mouri80863a62019-01-17 15:19:35 -08001909TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001910 sp<SurfaceControl> layer;
1911 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001912 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1913 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001914
1915 // XXX SCALE_CROP is not respected; calling setSize and
1916 // setOverrideScalingMode in separate transactions does not work
1917 // (b/69315456)
1918 Transaction()
1919 .setSize(layer, 64, 16)
1920 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1921 .apply();
1922 {
1923 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001924 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1925 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001926 }
1927}
1928
Dan Stoza000dd012018-08-01 13:31:52 -07001929TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1930 sp<SurfaceControl> layer;
1931 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1932
1933 sp<IBinder> handle = layer->getHandle();
1934 ASSERT_TRUE(handle != nullptr);
1935
1936 FrameStats frameStats;
1937 mClient->getLayerFrameStats(handle, &frameStats);
1938
1939 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1940}
1941
Alec Mouri80863a62019-01-17 15:19:35 -08001942TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001943 sp<SurfaceControl> layer;
1944 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001945 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001946 const Rect crop(8, 8, 24, 24);
1947
Marissa Wallf58c14b2018-07-24 10:50:43 -07001948 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001949 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001950 shot->expectColor(crop, Color::RED);
1951 shot->expectBorder(crop, Color::BLACK);
1952}
1953
Alec Mouri80863a62019-01-17 15:19:35 -08001954TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001955 sp<SurfaceControl> layer;
1956 ASSERT_NO_FATAL_FAILURE(
1957 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1958 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1959 const Rect crop(8, 8, 24, 24);
1960
1961 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001962 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001963 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1964 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001965}
1966
Alec Mouri80863a62019-01-17 15:19:35 -08001967TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001968 sp<SurfaceControl> layer;
1969 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001970 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001971
1972 {
1973 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001974 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001975 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001976 }
1977
1978 {
1979 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001980 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001981 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001982 }
1983}
1984
Alec Mouri80863a62019-01-17 15:19:35 -08001985TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001986 sp<SurfaceControl> layer;
1987 ASSERT_NO_FATAL_FAILURE(
1988 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1989 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1990
1991 {
1992 SCOPED_TRACE("empty rect");
1993 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001994 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001995 }
1996
1997 {
1998 SCOPED_TRACE("negative rect");
1999 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002000 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002001 }
2002}
2003
Alec Mouri80863a62019-01-17 15:19:35 -08002004TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_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
Marissa Wallf58c14b2018-07-24 10:50:43 -07002009 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002010 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002011 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2012 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2013}
2014
Alec Mouri80863a62019-01-17 15:19:35 -08002015TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002016 sp<SurfaceControl> layer;
2017 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2018 ISurfaceComposerClient::eFXSurfaceBufferState));
2019 sp<GraphicBuffer> buffer =
2020 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2021 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2022 BufferUsage::COMPOSER_OVERLAY,
2023 "test");
2024 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2025 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2026 Color::RED);
2027
2028 Transaction().setBuffer(layer, buffer).apply();
2029
2030 // Partially out of bounds in the negative (upper left) direction
2031 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2032 {
2033 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002034 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002035 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2036 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2037 }
2038
2039 // Partially out of bounds in the positive (lower right) direction
2040 Transaction()
2041 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2042 .apply();
2043 {
2044 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002045 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002046 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2047 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2048 }
2049
2050 // Fully out of buffer space bounds
2051 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2052 {
2053 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002054 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002055 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2056 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2057 Color::RED);
2058 }
2059}
2060
Alec Mouri80863a62019-01-17 15:19:35 -08002061TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002062 sp<SurfaceControl> layer;
2063 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002064 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002065
2066 const Point position(32, 32);
2067 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002068 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002069 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002070 shot->expectColor(crop + position, Color::RED);
2071 shot->expectBorder(crop + position, Color::BLACK);
2072}
2073
Alec Mouri80863a62019-01-17 15:19:35 -08002074TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002075 sp<SurfaceControl> layer;
2076 ASSERT_NO_FATAL_FAILURE(
2077 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2078 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2079
Marissa Wall861616d2018-10-22 12:52:23 -07002080 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002081 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002082 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002083 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002084 shot->expectColor(frame, Color::RED);
2085 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002086}
2087
Alec Mouri80863a62019-01-17 15:19:35 -08002088TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002089 sp<SurfaceControl> layer;
2090 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002091 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002092
Marissa Wall861616d2018-10-22 12:52:23 -07002093 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002094 Transaction()
2095 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002096 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002097 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002098 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002099 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2100 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2101}
2102
Alec Mouri80863a62019-01-17 15:19:35 -08002103TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002104 sp<SurfaceControl> layer;
2105 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002106 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002107
Marissa Wallf58c14b2018-07-24 10:50:43 -07002108 // setCrop_legacy is applied immediately by default, with or without resize pending
2109 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002110 {
2111 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002112 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002113 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2114 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2115 }
2116
Marissa Wall61c58622018-07-18 10:12:20 -07002117 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002118 {
2119 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002120 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002121 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2122 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2123 }
2124}
2125
Alec Mouri80863a62019-01-17 15:19:35 -08002126TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002127 sp<SurfaceControl> layer;
2128 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002129 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002130
Marissa Wallf58c14b2018-07-24 10:50:43 -07002131 // request setCrop_legacy to be applied with the next resize
2132 Transaction()
2133 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2134 .setGeometryAppliesWithResize(layer)
2135 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002136 {
2137 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002138 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002139 }
2140
Marissa Wallf58c14b2018-07-24 10:50:43 -07002141 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002142 {
2143 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002144 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002145 }
2146
2147 Transaction().setSize(layer, 16, 16).apply();
2148 {
2149 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002150 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002151 }
2152
2153 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002154 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002155 {
2156 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002157 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002158 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2159 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2160 }
2161}
2162
Alec Mouri80863a62019-01-17 15:19:35 -08002163TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002164 sp<SurfaceControl> layer;
2165 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002166 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002167
Marissa Wallf58c14b2018-07-24 10:50:43 -07002168 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002169 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002170 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002171 .setSize(layer, 16, 16)
2172 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2173 .setGeometryAppliesWithResize(layer)
2174 .apply();
2175 {
2176 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002177 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002178 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2179 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2180 }
2181
2182 // XXX crop is never latched without other geometry change (b/69315677)
2183 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002184 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002185 Transaction().setPosition(layer, 0, 0).apply();
2186 {
2187 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002188 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2190 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2191 }
2192}
2193
Alec Mouri80863a62019-01-17 15:19:35 -08002194TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002195 sp<SurfaceControl> layer;
2196 ASSERT_NO_FATAL_FAILURE(
2197 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2198 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2199 const Rect frame(8, 8, 24, 24);
2200
2201 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002202 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002203 shot->expectColor(frame, Color::RED);
2204 shot->expectBorder(frame, Color::BLACK);
2205}
2206
Alec Mouri80863a62019-01-17 15:19:35 -08002207TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002208 sp<SurfaceControl> layer;
2209 ASSERT_NO_FATAL_FAILURE(
2210 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2211 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2212
Marissa Wall61c58622018-07-18 10:12:20 -07002213 {
Marissa Wall861616d2018-10-22 12:52:23 -07002214 SCOPED_TRACE("empty rect");
2215 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002216 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002217 }
2218
Marissa Wall61c58622018-07-18 10:12:20 -07002219 {
Marissa Wall861616d2018-10-22 12:52:23 -07002220 SCOPED_TRACE("negative rect");
2221 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002222 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002223 }
2224}
2225
Alec Mouri80863a62019-01-17 15:19:35 -08002226TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002227 sp<SurfaceControl> layer;
2228 ASSERT_NO_FATAL_FAILURE(
2229 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2230 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2231
2232 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002233 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002234 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2235 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2236}
2237
Alec Mouri80863a62019-01-17 15:19:35 -08002238TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002239 sp<SurfaceControl> parent, child;
2240 ASSERT_NO_FATAL_FAILURE(
2241 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2242 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2243 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2244
2245 ASSERT_NO_FATAL_FAILURE(
2246 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2247 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2248
2249 Transaction().reparent(child, parent->getHandle()).apply();
2250
2251 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002252 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002253 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2254 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2255}
2256
Alec Mouri80863a62019-01-17 15:19:35 -08002257TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002258 sp<SurfaceControl> parent, child;
2259 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2260 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2261
2262 ASSERT_NO_FATAL_FAILURE(
2263 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2264 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2265
2266 Transaction().reparent(child, parent->getHandle()).apply();
2267
2268 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002269 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002270 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2271 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2272}
2273
Alec Mouri80863a62019-01-17 15:19:35 -08002274TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002275 sp<SurfaceControl> layer;
2276 ASSERT_NO_FATAL_FAILURE(
2277 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2278 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2279 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2280
2281 std::this_thread::sleep_for(500ms);
2282
2283 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2284
Alec Mouri80863a62019-01-17 15:19:35 -08002285 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002286 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2287 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2288}
2289
Alec Mouri80863a62019-01-17 15:19:35 -08002290TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002291 sp<SurfaceControl> parent, child;
2292 ASSERT_NO_FATAL_FAILURE(
2293 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2294 ASSERT_NO_FATAL_FAILURE(
2295 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2296 Transaction().reparent(child, parent->getHandle()).apply();
2297
2298 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2299 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2300
2301 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2302 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2303
Alec Mouri80863a62019-01-17 15:19:35 -08002304 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002305 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2306 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2307 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2308}
2309
Alec Mouri80863a62019-01-17 15:19:35 -08002310TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002311 sp<SurfaceControl> layer;
2312 ASSERT_NO_FATAL_FAILURE(
2313 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2314
2315 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2316
Alec Mouri80863a62019-01-17 15:19:35 -08002317 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002318 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2319 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2320}
2321
Alec Mouri80863a62019-01-17 15:19:35 -08002322TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002323 sp<SurfaceControl> layer;
2324 ASSERT_NO_FATAL_FAILURE(
2325 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2326
2327 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2328
2329 {
2330 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002331 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002332 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2333 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2334 }
2335
2336 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2337
2338 {
2339 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002340 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002341 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2342 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2343 }
2344
2345 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2346
2347 {
2348 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002349 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002350 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2351 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2352 }
2353}
2354
Alec Mouri80863a62019-01-17 15:19:35 -08002355TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002356 sp<SurfaceControl> layer1;
2357 ASSERT_NO_FATAL_FAILURE(
2358 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2359
2360 sp<SurfaceControl> layer2;
2361 ASSERT_NO_FATAL_FAILURE(
2362 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2363
2364 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2365
Marissa Wall861616d2018-10-22 12:52:23 -07002366 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002367 {
2368 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002369 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002370 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2371 }
2372
2373 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2374
Marissa Wall861616d2018-10-22 12:52:23 -07002375 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002376 {
2377 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002378 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002379 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2380 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2381 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2382 }
2383
2384 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2385 {
2386 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002387 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002388 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2389 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2390 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2391 }
2392
2393 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2394
2395 {
2396 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002397 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002398 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2399 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2400 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2401 }
2402}
2403
Valerie Haua6b15a12019-02-05 14:16:30 -08002404TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002405 sp<SurfaceControl> layer;
2406 ASSERT_NO_FATAL_FAILURE(
2407 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2408
2409 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2410
2411 std::array<sp<GraphicBuffer>, 10> buffers;
2412
2413 size_t idx = 0;
2414 for (auto& buffer : buffers) {
2415 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2416 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2417 BufferUsage::COMPOSER_OVERLAY,
2418 "test");
2419 Color color = colors[idx % colors.size()];
2420 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2421 idx++;
2422 }
2423
2424 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2425 // cache is working.
2426 idx = 0;
2427 for (auto& buffer : buffers) {
2428 for (int i = 0; i < 2; i++) {
2429 Transaction().setBuffer(layer, buffer).apply();
2430
2431 Color color = colors[idx % colors.size()];
2432 auto shot = screenshot();
2433 shot->expectColor(Rect(0, 0, 32, 32), color);
2434 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2435 }
2436 idx++;
2437 }
2438}
2439
Valerie Haua6b15a12019-02-05 14:16:30 -08002440TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002441 sp<SurfaceControl> layer;
2442 ASSERT_NO_FATAL_FAILURE(
2443 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2444
2445 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2446
2447 std::array<sp<GraphicBuffer>, 70> buffers;
2448
2449 size_t idx = 0;
2450 for (auto& buffer : buffers) {
2451 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2452 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2453 BufferUsage::COMPOSER_OVERLAY,
2454 "test");
2455 Color color = colors[idx % colors.size()];
2456 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2457 idx++;
2458 }
2459
2460 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2461 // cache is working.
2462 idx = 0;
2463 for (auto& buffer : buffers) {
2464 for (int i = 0; i < 2; i++) {
2465 Transaction().setBuffer(layer, buffer).apply();
2466
2467 Color color = colors[idx % colors.size()];
2468 auto shot = screenshot();
2469 shot->expectColor(Rect(0, 0, 32, 32), color);
2470 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2471 }
2472 idx++;
2473 }
2474}
2475
Valerie Haua6b15a12019-02-05 14:16:30 -08002476TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002477 sp<SurfaceControl> layer;
2478 ASSERT_NO_FATAL_FAILURE(
2479 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2480
2481 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2482
2483 std::array<sp<GraphicBuffer>, 65> buffers;
2484
2485 size_t idx = 0;
2486 for (auto& buffer : buffers) {
2487 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2488 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2489 BufferUsage::COMPOSER_OVERLAY,
2490 "test");
2491 Color color = colors[idx % colors.size()];
2492 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2493 idx++;
2494 }
2495
2496 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2497 // cache is working.
2498 idx = 0;
2499 for (auto& buffer : buffers) {
2500 for (int i = 0; i < 2; i++) {
2501 Transaction().setBuffer(layer, buffer).apply();
2502
2503 Color color = colors[idx % colors.size()];
2504 auto shot = screenshot();
2505 shot->expectColor(Rect(0, 0, 32, 32), color);
2506 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2507 }
2508 if (idx == 0) {
2509 buffers[0].clear();
2510 }
2511 idx++;
2512 }
2513}
2514
Alec Mouri80863a62019-01-17 15:19:35 -08002515TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002516 sp<SurfaceControl> layer;
2517 ASSERT_NO_FATAL_FAILURE(
2518 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2519
2520 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2521 Color::BLUE, Color::WHITE));
2522
Marissa Wall861616d2018-10-22 12:52:23 -07002523 Transaction()
2524 .setFrame(layer, Rect(0, 0, 32, 32))
2525 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2526 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002527
Alec Mouri80863a62019-01-17 15:19:35 -08002528 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2529 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002530}
2531
Alec Mouri80863a62019-01-17 15:19:35 -08002532TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002533 sp<SurfaceControl> layer;
2534 ASSERT_NO_FATAL_FAILURE(
2535 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2536
2537 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2538 Color::BLUE, Color::WHITE));
2539
Marissa Wall861616d2018-10-22 12:52:23 -07002540 Transaction()
2541 .setFrame(layer, Rect(0, 0, 32, 32))
2542 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2543 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002544
Alec Mouri80863a62019-01-17 15:19:35 -08002545 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2546 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002547}
2548
Alec Mouri80863a62019-01-17 15:19:35 -08002549TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002550 sp<SurfaceControl> layer;
2551 ASSERT_NO_FATAL_FAILURE(
2552 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2553
2554 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2555 Color::BLUE, Color::WHITE));
2556
Marissa Wall861616d2018-10-22 12:52:23 -07002557 Transaction()
2558 .setFrame(layer, Rect(0, 0, 32, 32))
2559 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2560 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002561
Alec Mouri80863a62019-01-17 15:19:35 -08002562 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2563 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002564}
2565
2566TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2567 sp<SurfaceControl> layer;
2568 ASSERT_NO_FATAL_FAILURE(
2569 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2570
2571 Transaction().setTransformToDisplayInverse(layer, false).apply();
2572
2573 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2574
2575 Transaction().setTransformToDisplayInverse(layer, true).apply();
2576}
2577
Alec Mouri80863a62019-01-17 15:19:35 -08002578TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002579 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002580 Transaction transaction;
2581 ASSERT_NO_FATAL_FAILURE(
2582 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2583
2584 sp<GraphicBuffer> buffer =
2585 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2586 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2587 BufferUsage::COMPOSER_OVERLAY,
2588 "test");
2589 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2590
2591 sp<Fence> fence;
2592 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2593 GTEST_SUCCEED() << "test not supported";
2594 return;
2595 }
2596
2597 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2598
2599 status_t status = fence->wait(1000);
2600 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2601 std::this_thread::sleep_for(200ms);
2602
Alec Mouri80863a62019-01-17 15:19:35 -08002603 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002604 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2605 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2606}
2607
Alec Mouri80863a62019-01-17 15:19:35 -08002608TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002609 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002610 ASSERT_NO_FATAL_FAILURE(
2611 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2612
2613 sp<GraphicBuffer> buffer =
2614 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2615 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2616 BufferUsage::COMPOSER_OVERLAY,
2617 "test");
2618 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2619
Marissa Wallfda30bb2018-10-12 11:34:28 -07002620 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002621
2622 Transaction()
2623 .setBuffer(layer, buffer)
2624 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002625 .apply();
2626
Alec Mouri80863a62019-01-17 15:19:35 -08002627 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002628 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2629 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2630}
2631
Alec Mouri80863a62019-01-17 15:19:35 -08002632TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002633 sp<SurfaceControl> layer;
2634 ASSERT_NO_FATAL_FAILURE(
2635 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2636
2637 sp<GraphicBuffer> buffer =
2638 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2639 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2640 BufferUsage::COMPOSER_OVERLAY,
2641 "test");
2642 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2643
2644 Transaction()
2645 .setBuffer(layer, buffer)
2646 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002647 .apply();
2648
Alec Mouri80863a62019-01-17 15:19:35 -08002649 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002650 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2651 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2652}
2653
Alec Mouri80863a62019-01-17 15:19:35 -08002654TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002655 sp<SurfaceControl> layer;
2656 ASSERT_NO_FATAL_FAILURE(
2657 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2658
2659 sp<GraphicBuffer> buffer =
2660 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2661 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2662 BufferUsage::COMPOSER_OVERLAY,
2663 "test");
2664 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2665
2666 HdrMetadata hdrMetadata;
2667 hdrMetadata.validTypes = 0;
2668 Transaction()
2669 .setBuffer(layer, buffer)
2670 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002671 .apply();
2672
Alec Mouri80863a62019-01-17 15:19:35 -08002673 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002674 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2675 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2676}
2677
Alec Mouri80863a62019-01-17 15:19:35 -08002678TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002679 sp<SurfaceControl> layer;
2680 ASSERT_NO_FATAL_FAILURE(
2681 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2682
2683 sp<GraphicBuffer> buffer =
2684 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2685 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2686 BufferUsage::COMPOSER_OVERLAY,
2687 "test");
2688 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2689
2690 Region region;
2691 region.set(32, 32);
2692 Transaction()
2693 .setBuffer(layer, buffer)
2694 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002695 .apply();
2696
Alec Mouri80863a62019-01-17 15:19:35 -08002697 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002698 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2699 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2700}
2701
Alec Mouri80863a62019-01-17 15:19:35 -08002702TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002703 sp<SurfaceControl> layer;
2704 ASSERT_NO_FATAL_FAILURE(
2705 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2706
2707 sp<GraphicBuffer> buffer =
2708 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2709 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2710 BufferUsage::COMPOSER_OVERLAY,
2711 "test");
2712 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2713
2714 Transaction()
2715 .setBuffer(layer, buffer)
2716 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002717 .apply();
2718
Alec Mouri80863a62019-01-17 15:19:35 -08002719 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002720 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2721 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2722}
2723
2724TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2725 sp<SurfaceControl> layer;
2726 ASSERT_NO_FATAL_FAILURE(
2727 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2728
2729 // verify this doesn't cause a crash
2730 Transaction().setSidebandStream(layer, nullptr).apply();
2731}
2732
Robert Carr54cf5b12019-01-25 14:02:28 -08002733TEST_F(LayerTransactionTest, ReparentToSelf) {
2734 sp<SurfaceControl> layer;
2735 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2736 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2737 Transaction().reparent(layer, layer->getHandle()).apply();
2738
2739 {
2740 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2741 // to still be functioning.
2742 SCOPED_TRACE("after reparent to self");
2743 const Rect rect(0, 0, 32, 32);
2744 auto shot = screenshot();
2745 shot->expectColor(rect, Color::RED);
2746 shot->expectBorder(rect, Color::BLACK);
2747 }
2748}
2749
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002750class ColorTransformHelper {
2751public:
2752 static void DegammaColorSingle(half& s) {
2753 if (s <= 0.03928f)
2754 s = s / 12.92f;
2755 else
2756 s = pow((s + 0.055f) / 1.055f, 2.4f);
2757 }
2758
2759 static void DegammaColor(half3& color) {
2760 DegammaColorSingle(color.r);
2761 DegammaColorSingle(color.g);
2762 DegammaColorSingle(color.b);
2763 }
2764
2765 static void GammaColorSingle(half& s) {
2766 if (s <= 0.0031308f) {
2767 s = s * 12.92f;
2768 } else {
2769 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2770 }
2771 }
2772
2773 static void GammaColor(half3& color) {
2774 GammaColorSingle(color.r);
2775 GammaColorSingle(color.g);
2776 GammaColorSingle(color.b);
2777 }
2778
2779 static void applyMatrix(half3& color, const mat3& mat) {
2780 half3 ret = half3(0);
2781
2782 for (int i = 0; i < 3; i++) {
2783 for (int j = 0; j < 3; j++) {
2784 ret[i] = ret[i] + color[j] * mat[j][i];
2785 }
2786 }
2787 color = ret;
2788 }
2789};
2790
Alec Mouri80863a62019-01-17 15:19:35 -08002791TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002792 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002793 ASSERT_NO_FATAL_FAILURE(colorLayer =
2794 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2795 ISurfaceComposerClient::eFXSurfaceColor));
2796 Transaction()
2797 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2798 .setLayer(colorLayer, mLayerZBase + 1)
2799 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002800 {
2801 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002802 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002803 }
2804
2805 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002806 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002807 mat3 matrix;
2808 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2809 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2810 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002811
2812 // degamma before applying the matrix
2813 if (mColorManagementUsed) {
2814 ColorTransformHelper::DegammaColor(expected);
2815 }
2816
2817 ColorTransformHelper::applyMatrix(expected, matrix);
2818
2819 if (mColorManagementUsed) {
2820 ColorTransformHelper::GammaColor(expected);
2821 }
2822
2823 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2824 uint8_t(expected.b * 255), 255};
2825
2826 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2827 // channel) should be less than one
2828 const uint8_t tolerance = 1;
2829
Peiyong Lind3788632018-09-18 16:01:31 -07002830 Transaction().setColor(colorLayer, color)
2831 .setColorTransform(colorLayer, matrix, vec3()).apply();
2832 {
2833 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002834 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002835 }
2836}
2837
Alec Mouri80863a62019-01-17 15:19:35 -08002838TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002839 sp<SurfaceControl> parentLayer;
2840 sp<SurfaceControl> colorLayer;
2841 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2842 0 /* buffer height */,
2843 ISurfaceComposerClient::eFXSurfaceContainer));
2844 ASSERT_NO_FATAL_FAILURE(
2845 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2846 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2847
2848 Transaction()
2849 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2850 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2851 .setLayer(parentLayer, mLayerZBase + 1)
2852 .apply();
2853 {
2854 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002855 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002856 }
2857
2858 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2859 half3 expected = color;
2860 mat3 matrix;
2861 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2862 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2863 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2864
2865 // degamma before applying the matrix
2866 if (mColorManagementUsed) {
2867 ColorTransformHelper::DegammaColor(expected);
2868 }
2869
2870 ColorTransformHelper::applyMatrix(expected, matrix);
2871
2872 if (mColorManagementUsed) {
2873 ColorTransformHelper::GammaColor(expected);
2874 }
2875
2876 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2877 uint8_t(expected.b * 255), 255};
2878
2879 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2880 // channel) should be less than one
2881 const uint8_t tolerance = 1;
2882
2883 Transaction()
2884 .setColor(colorLayer, color)
2885 .setColorTransform(parentLayer, matrix, vec3())
2886 .apply();
2887 {
2888 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002889 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002890 }
2891}
2892
Alec Mouri80863a62019-01-17 15:19:35 -08002893TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002894 sp<SurfaceControl> parentLayer;
2895 sp<SurfaceControl> colorLayer;
2896 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2897 0 /* buffer height */,
2898 ISurfaceComposerClient::eFXSurfaceContainer));
2899 ASSERT_NO_FATAL_FAILURE(
2900 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2901 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2902
2903 Transaction()
2904 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2905 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2906 .setLayer(parentLayer, mLayerZBase + 1)
2907 .apply();
2908 {
2909 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002910 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002911 }
2912
2913 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2914 half3 expected = color;
2915 mat3 matrixChild;
2916 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2917 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2918 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2919 mat3 matrixParent;
2920 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2921 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2922 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2923
2924 // degamma before applying the matrix
2925 if (mColorManagementUsed) {
2926 ColorTransformHelper::DegammaColor(expected);
2927 }
2928
2929 ColorTransformHelper::applyMatrix(expected, matrixChild);
2930 ColorTransformHelper::applyMatrix(expected, matrixParent);
2931
2932 if (mColorManagementUsed) {
2933 ColorTransformHelper::GammaColor(expected);
2934 }
2935
2936 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2937 uint8_t(expected.b * 255), 255};
2938
2939 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2940 // channel) should be less than one
2941 const uint8_t tolerance = 1;
2942
2943 Transaction()
2944 .setColor(colorLayer, color)
2945 .setColorTransform(parentLayer, matrixParent, vec3())
2946 .setColorTransform(colorLayer, matrixChild, 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
Marissa Wall80d94ad2019-01-18 16:04:36 -08002954struct CallbackData {
2955 CallbackData() = default;
2956 CallbackData(nsecs_t time, const sp<Fence>& fence,
2957 const std::vector<SurfaceControlStats>& stats)
2958 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
2959
2960 nsecs_t latchTime;
2961 sp<Fence> presentFence;
2962 std::vector<SurfaceControlStats> surfaceControlStats;
2963};
2964
Marissa Wallfda30bb2018-10-12 11:34:28 -07002965class ExpectedResult {
2966public:
2967 enum Transaction {
2968 NOT_PRESENTED = 0,
2969 PRESENTED,
2970 };
2971
2972 enum Buffer {
2973 NOT_ACQUIRED = 0,
2974 ACQUIRED,
2975 };
2976
2977 enum PreviousBuffer {
2978 NOT_RELEASED = 0,
2979 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08002980 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002981 };
2982
2983 void reset() {
2984 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
2985 mExpectedSurfaceResults.clear();
2986 }
2987
2988 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07002989 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002990 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
2991 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08002992 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07002993 std::forward_as_tuple(bufferResult, previousBufferResult));
2994 }
2995
2996 void addSurfaces(ExpectedResult::Transaction transactionResult,
2997 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07002998 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002999 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3000 for (const auto& layer : layers) {
3001 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3002 }
3003 }
3004
Marissa Wall17b4e452018-12-26 16:32:34 -08003005 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3006 mExpectedPresentTime = expectedPresentTime;
3007 }
3008
Marissa Wall80d94ad2019-01-18 16:04:36 -08003009 void verifyCallbackData(const CallbackData& callbackData) const {
3010 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003011 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3012 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003013 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003014 if (mExpectedPresentTime >= 0) {
3015 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3016 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3017 // if the panel is running at 30 hz, at the worst case, our expected time just
3018 // misses vsync and we have to wait another 33.3ms
3019 ASSERT_LE(presentFence->getSignalTime(),
3020 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3021 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003022 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003023 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003024 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3025 }
3026
Marissa Wall80d94ad2019-01-18 16:04:36 -08003027 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003028 << "wrong number of surfaces";
3029
Marissa Wall80d94ad2019-01-18 16:04:36 -08003030 for (const auto& stats : surfaceControlStats) {
3031 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3032
Marissa Wallfda30bb2018-10-12 11:34:28 -07003033 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3034 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3035 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003036 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003037 }
3038 }
3039
3040private:
3041 class ExpectedSurfaceResult {
3042 public:
3043 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3044 ExpectedResult::PreviousBuffer previousBufferResult)
3045 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3046
Marissa Wall80d94ad2019-01-18 16:04:36 -08003047 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3048 nsecs_t latchTime) const {
3049 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003050
3051 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3052 << "bad acquire time";
3053 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003054
3055 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3056 ASSERT_NE(previousReleaseFence, nullptr)
3057 << "failed to set release prev buffer fence";
3058 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3059 ASSERT_EQ(previousReleaseFence, nullptr)
3060 << "should not have set released prev buffer fence";
3061 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003062 }
3063
3064 private:
3065 ExpectedResult::Buffer mBufferResult;
3066 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3067 };
3068
Marissa Wall80d94ad2019-01-18 16:04:36 -08003069 struct SCHash {
3070 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3071 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003072 }
3073 };
3074 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003075 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003076 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003077};
3078
3079class CallbackHelper {
3080public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003081 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3082 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003083 if (!callbackContext) {
3084 ALOGE("failed to get callback context");
3085 }
3086 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3087 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003088 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003089 helper->mConditionVariable.notify_all();
3090 }
3091
Marissa Wall80d94ad2019-01-18 16:04:36 -08003092 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003093 std::unique_lock lock(mMutex);
3094
Marissa Wall80d94ad2019-01-18 16:04:36 -08003095 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003096 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3097 std::cv_status::timeout)
3098 << "did not receive callback";
3099 }
3100
Marissa Wall80d94ad2019-01-18 16:04:36 -08003101 *outData = std::move(mCallbackDataQueue.front());
3102 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003103 }
3104
3105 void verifyFinalState() {
3106 // Wait to see if there are extra callbacks
3107 std::this_thread::sleep_for(500ms);
3108
3109 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003110 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3111 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003112 }
3113
3114 void* getContext() { return static_cast<void*>(this); }
3115
3116 std::mutex mMutex;
3117 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003118 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003119};
3120
3121class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003122public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003123 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003124 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003125 }
3126
Marissa Wall713b63f2018-10-17 15:42:43 -07003127 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003128 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3129 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003130 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003131 sp<GraphicBuffer> buffer;
3132 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003133 if (setBuffer) {
3134 int err = getBuffer(&buffer, &fence);
3135 if (err != NO_ERROR) {
3136 return err;
3137 }
3138
3139 transaction.setBuffer(layer, buffer);
3140 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003141 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003142
Valerie Hauaa194562019-02-05 16:21:38 -08003143 if (setBackgroundColor) {
3144 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3145 ui::Dataspace::UNKNOWN);
3146 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003147 }
3148
3149 transaction.addTransactionCompletedCallback(callbackHelper->function,
3150 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003151 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003152 }
3153
Marissa Wall861616d2018-10-22 12:52:23 -07003154 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3155 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003156 CallbackData callbackData;
3157 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3158 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003159
3160 if (finalState) {
3161 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3162 }
3163 }
3164
Marissa Wall861616d2018-10-22 12:52:23 -07003165 static void waitForCallbacks(CallbackHelper& helper,
3166 const std::vector<ExpectedResult>& expectedResults,
3167 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003168 for (const auto& expectedResult : expectedResults) {
3169 waitForCallback(helper, expectedResult);
3170 }
3171 if (finalState) {
3172 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3173 }
3174 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003175};
3176
Valerie Hauaa194562019-02-05 16:21:38 -08003177TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003178 sp<SurfaceControl> layer;
3179 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3180
3181 Transaction transaction;
3182 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003183 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003184 if (err) {
3185 GTEST_SUCCEED() << "test not supported";
3186 return;
3187 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003188
3189 transaction.apply();
3190
3191 ExpectedResult expected;
3192 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3193 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3194}
3195
Valerie Hauaa194562019-02-05 16:21:38 -08003196TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003197 sp<SurfaceControl> layer;
3198 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3199
3200 Transaction transaction;
3201 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003202 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 if (err) {
3204 GTEST_SUCCEED() << "test not supported";
3205 return;
3206 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003207
Marissa Wall861616d2018-10-22 12:52:23 -07003208 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003209
3210 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003211 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3212 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003213 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3214}
3215
Valerie Hauaa194562019-02-05 16:21:38 -08003216TEST_F(LayerCallbackTest, BufferNoColor) {
3217 sp<SurfaceControl> layer;
3218 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3219
3220 Transaction transaction;
3221 CallbackHelper callback;
3222 int err = fillTransaction(transaction, &callback, layer, true, false);
3223 if (err) {
3224 GTEST_SUCCEED() << "test not supported";
3225 return;
3226 }
3227
3228 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3229
3230 ExpectedResult expected;
3231 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3232 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3233}
3234
3235TEST_F(LayerCallbackTest, NoBufferColor) {
3236 sp<SurfaceControl> layer;
3237 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3238
3239 Transaction transaction;
3240 CallbackHelper callback;
3241 int err = fillTransaction(transaction, &callback, layer, false, true);
3242 if (err) {
3243 GTEST_SUCCEED() << "test not supported";
3244 return;
3245 }
3246
3247 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3248
3249 ExpectedResult expected;
3250 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3251 ExpectedResult::Buffer::NOT_ACQUIRED);
3252 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3253}
3254
Marissa Wallfda30bb2018-10-12 11:34:28 -07003255TEST_F(LayerCallbackTest, NoStateChange) {
3256 Transaction transaction;
3257 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003258 int err = fillTransaction(transaction, &callback);
3259 if (err) {
3260 GTEST_SUCCEED() << "test not supported";
3261 return;
3262 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003263
3264 transaction.apply();
3265
3266 ExpectedResult expected;
3267 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3268}
3269
3270TEST_F(LayerCallbackTest, OffScreen) {
3271 sp<SurfaceControl> layer;
3272 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3273
3274 Transaction transaction;
3275 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003276 int err = fillTransaction(transaction, &callback, layer);
3277 if (err) {
3278 GTEST_SUCCEED() << "test not supported";
3279 return;
3280 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003281
Marissa Wall861616d2018-10-22 12:52:23 -07003282 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003283
3284 ExpectedResult expected;
3285 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3286 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3287}
3288
Valerie Hauaa194562019-02-05 16:21:38 -08003289TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003290 sp<SurfaceControl> layer1, layer2;
3291 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3292 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3293
3294 Transaction transaction1, transaction2;
3295 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003296 int err = fillTransaction(transaction1, &callback1, layer1);
3297 if (err) {
3298 GTEST_SUCCEED() << "test not supported";
3299 return;
3300 }
3301 err = fillTransaction(transaction2, &callback2, layer2);
3302 if (err) {
3303 GTEST_SUCCEED() << "test not supported";
3304 return;
3305 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003306
Marissa Wall861616d2018-10-22 12:52:23 -07003307 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3308 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003309
3310 ExpectedResult expected;
3311 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3312 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3313 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3314}
3315
Valerie Hauaa194562019-02-05 16:21:38 -08003316TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3317 sp<SurfaceControl> layer1, layer2;
3318 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3319 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3320
3321 Transaction transaction1, transaction2;
3322 CallbackHelper callback1, callback2;
3323 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3324 if (err) {
3325 GTEST_SUCCEED() << "test not supported";
3326 return;
3327 }
3328 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3329 if (err) {
3330 GTEST_SUCCEED() << "test not supported";
3331 return;
3332 }
3333
3334 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3335 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3336
3337 ExpectedResult expected;
3338 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3339 ExpectedResult::Buffer::NOT_ACQUIRED);
3340 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3341 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3342}
3343
3344TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3345 sp<SurfaceControl> layer1, layer2;
3346 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3347 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3348
3349 Transaction transaction1, transaction2;
3350 CallbackHelper callback1, callback2;
3351 int err = fillTransaction(transaction1, &callback1, layer1);
3352 if (err) {
3353 GTEST_SUCCEED() << "test not supported";
3354 return;
3355 }
3356 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3357 if (err) {
3358 GTEST_SUCCEED() << "test not supported";
3359 return;
3360 }
3361
3362 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3363 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3364
3365 ExpectedResult expected;
3366 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3367 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3368 ExpectedResult::Buffer::NOT_ACQUIRED);
3369 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3370 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3371}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003372TEST_F(LayerCallbackTest, Merge_SameCallback) {
3373 sp<SurfaceControl> layer1, layer2;
3374 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3375 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3376
3377 Transaction transaction1, transaction2;
3378 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003379 int err = fillTransaction(transaction1, &callback, layer1);
3380 if (err) {
3381 GTEST_SUCCEED() << "test not supported";
3382 return;
3383 }
3384 err = fillTransaction(transaction2, &callback, layer2);
3385 if (err) {
3386 GTEST_SUCCEED() << "test not supported";
3387 return;
3388 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003389
3390 transaction2.merge(std::move(transaction1)).apply();
3391
3392 ExpectedResult expected;
3393 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3394 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3395 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3396}
3397
3398TEST_F(LayerCallbackTest, Merge_SameLayer) {
3399 sp<SurfaceControl> layer;
3400 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3401
3402 Transaction transaction1, transaction2;
3403 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003404 int err = fillTransaction(transaction1, &callback1, layer);
3405 if (err) {
3406 GTEST_SUCCEED() << "test not supported";
3407 return;
3408 }
3409 err = fillTransaction(transaction2, &callback2, layer);
3410 if (err) {
3411 GTEST_SUCCEED() << "test not supported";
3412 return;
3413 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003414
3415 transaction2.merge(std::move(transaction1)).apply();
3416
3417 ExpectedResult expected;
3418 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3419 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3420 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3421}
3422
Marissa Wallfda30bb2018-10-12 11:34:28 -07003423TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3424 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3425 client2(new SurfaceComposerClient);
3426
3427 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3428 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3429
3430 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003431 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003432 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003433 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003434 ISurfaceComposerClient::eFXSurfaceBufferState));
3435
3436 Transaction transaction1, transaction2;
3437 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003438 int err = fillTransaction(transaction1, &callback1, layer1);
3439 if (err) {
3440 GTEST_SUCCEED() << "test not supported";
3441 return;
3442 }
3443 err = fillTransaction(transaction2, &callback2, layer2);
3444 if (err) {
3445 GTEST_SUCCEED() << "test not supported";
3446 return;
3447 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003448
Marissa Wall861616d2018-10-22 12:52:23 -07003449 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3450 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003451
3452 ExpectedResult expected;
3453 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3454 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3455 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3456}
3457
3458TEST_F(LayerCallbackTest, MultipleTransactions) {
3459 sp<SurfaceControl> layer;
3460 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3461
3462 Transaction transaction;
3463 CallbackHelper callback;
3464 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003465 int err = fillTransaction(transaction, &callback, layer);
3466 if (err) {
3467 GTEST_SUCCEED() << "test not supported";
3468 return;
3469 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003470
3471 transaction.apply();
3472
3473 ExpectedResult expected;
3474 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003475 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003476 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3477 : ExpectedResult::PreviousBuffer::RELEASED);
3478 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3479 }
3480 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3481}
3482
3483TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3484 sp<SurfaceControl> layer;
3485 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3486
3487 Transaction transaction;
3488 CallbackHelper callback;
3489 for (size_t i = 0; i < 10; i++) {
3490 ExpectedResult expected;
3491
3492 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003493 int err = fillTransaction(transaction, &callback, layer);
3494 if (err) {
3495 GTEST_SUCCEED() << "test not supported";
3496 return;
3497 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003498 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3499 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003500 int err = fillTransaction(transaction, &callback);
3501 if (err) {
3502 GTEST_SUCCEED() << "test not supported";
3503 return;
3504 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003505 }
3506
3507 transaction.apply();
3508
3509 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3510 }
3511 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3512}
3513
3514TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3515 sp<SurfaceControl> layer;
3516 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3517
3518 Transaction transaction;
3519 CallbackHelper callback;
3520 for (size_t i = 0; i < 10; i++) {
3521 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003522 int err = fillTransaction(transaction, &callback, layer);
3523 if (err) {
3524 GTEST_SUCCEED() << "test not supported";
3525 return;
3526 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003527 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003528 int err = fillTransaction(transaction, &callback);
3529 if (err) {
3530 GTEST_SUCCEED() << "test not supported";
3531 return;
3532 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003533 }
3534
Marissa Wall861616d2018-10-22 12:52:23 -07003535 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003536
3537 ExpectedResult expected;
3538 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3539 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003540 layer,
3541 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3542 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003543 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3544 }
3545 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3546}
3547
3548TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3549 sp<SurfaceControl> layer1, layer2;
3550 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3551 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3552
3553 Transaction transaction1, transaction2;
3554 CallbackHelper callback1, callback2;
3555 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003556 int err = fillTransaction(transaction1, &callback1, layer1);
3557 if (err) {
3558 GTEST_SUCCEED() << "test not supported";
3559 return;
3560 }
3561 err = fillTransaction(transaction2, &callback2, layer2);
3562 if (err) {
3563 GTEST_SUCCEED() << "test not supported";
3564 return;
3565 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003566
Marissa Wall861616d2018-10-22 12:52:23 -07003567 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3568 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003569
3570 ExpectedResult expected;
3571 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003572 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003573 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3574 : ExpectedResult::PreviousBuffer::RELEASED);
3575 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3576 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3577 }
3578 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3579 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3580}
3581
3582TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3583 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3584 client2(new SurfaceComposerClient);
3585 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3586 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3587
3588 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003589 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003590 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003591 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003592 ISurfaceComposerClient::eFXSurfaceBufferState));
3593
3594 Transaction transaction1, transaction2;
3595 CallbackHelper callback1, callback2;
3596 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003597 int err = fillTransaction(transaction1, &callback1, layer1);
3598 if (err) {
3599 GTEST_SUCCEED() << "test not supported";
3600 return;
3601 }
3602 err = fillTransaction(transaction2, &callback2, layer2);
3603 if (err) {
3604 GTEST_SUCCEED() << "test not supported";
3605 return;
3606 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003607
Marissa Wall861616d2018-10-22 12:52:23 -07003608 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3609 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003610
3611 ExpectedResult expected;
3612 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003613 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003614 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3615 : ExpectedResult::PreviousBuffer::RELEASED);
3616 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3617 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3618 }
3619 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3620 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3621}
3622
3623TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3624 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3625 client2(new SurfaceComposerClient);
3626 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3627 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3628
3629 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003630 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003631 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003632 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003633 ISurfaceComposerClient::eFXSurfaceBufferState));
3634
3635 Transaction transaction1, transaction2;
3636 CallbackHelper callback1, callback2;
3637
3638 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003639 int err = fillTransaction(transaction1, &callback1, layer1);
3640 if (err) {
3641 GTEST_SUCCEED() << "test not supported";
3642 return;
3643 }
3644 err = fillTransaction(transaction2, &callback2, layer2);
3645 if (err) {
3646 GTEST_SUCCEED() << "test not supported";
3647 return;
3648 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003649
Marissa Wall861616d2018-10-22 12:52:23 -07003650 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3651 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003652
3653 ExpectedResult expected;
3654 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3655 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3656 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3657 expected.reset();
3658
3659 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003660 err = fillTransaction(transaction1, &callback1);
3661 if (err) {
3662 GTEST_SUCCEED() << "test not supported";
3663 return;
3664 }
3665 err = fillTransaction(transaction2, &callback2);
3666 if (err) {
3667 GTEST_SUCCEED() << "test not supported";
3668 return;
3669 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003670
3671 transaction2.merge(std::move(transaction1)).apply();
3672
3673 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3674 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3675}
3676
3677TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3678 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3679 client2(new SurfaceComposerClient);
3680
3681 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3682 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3683
3684 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003685 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003686 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003687 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003688 ISurfaceComposerClient::eFXSurfaceBufferState));
3689
3690 Transaction transaction1, transaction2;
3691 CallbackHelper callback1, callback2;
3692
3693 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003694 int err = fillTransaction(transaction1, &callback1, layer1);
3695 if (err) {
3696 GTEST_SUCCEED() << "test not supported";
3697 return;
3698 }
3699 err = fillTransaction(transaction2, &callback2, layer2);
3700 if (err) {
3701 GTEST_SUCCEED() << "test not supported";
3702 return;
3703 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003704
Marissa Wall861616d2018-10-22 12:52:23 -07003705 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3706 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003707
3708 ExpectedResult expected;
3709 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3710 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3711 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3712 expected.reset();
3713
3714 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003715 err = fillTransaction(transaction1, &callback1);
3716 if (err) {
3717 GTEST_SUCCEED() << "test not supported";
3718 return;
3719 }
3720 err = fillTransaction(transaction2, &callback2);
3721 if (err) {
3722 GTEST_SUCCEED() << "test not supported";
3723 return;
3724 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003725
Marissa Wall861616d2018-10-22 12:52:23 -07003726 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003727
Marissa Wall713b63f2018-10-17 15:42:43 -07003728 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3729 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003730 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3731 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3732}
3733
3734TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3735 sp<SurfaceControl> layer;
3736 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3737
3738 Transaction transaction;
3739 CallbackHelper callback;
3740 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003741 for (auto& expected : expectedResults) {
3742 expected.reset();
3743 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003744 ExpectedResult::Buffer::ACQUIRED,
3745 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003746
Marissa Wall713b63f2018-10-17 15:42:43 -07003747 int err = fillTransaction(transaction, &callback, layer);
3748 if (err) {
3749 GTEST_SUCCEED() << "test not supported";
3750 return;
3751 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003752
3753 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003754 }
3755 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3756}
3757
3758TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3759 sp<SurfaceControl> layer;
3760 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3761
Marissa Wall713b63f2018-10-17 15:42:43 -07003762 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003763 Transaction transaction;
3764 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003765 int err = fillTransaction(transaction, &callback, layer);
3766 if (err) {
3767 GTEST_SUCCEED() << "test not supported";
3768 return;
3769 }
3770
3771 transaction.apply();
3772
3773 ExpectedResult expected;
3774 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3775 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3776
3777 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003778 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003779 for (auto& expected : expectedResults) {
3780 expected.reset();
3781
Marissa Wall713b63f2018-10-17 15:42:43 -07003782 err = fillTransaction(transaction, &callback);
3783 if (err) {
3784 GTEST_SUCCEED() << "test not supported";
3785 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003786 }
3787
3788 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003789 }
3790 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3791}
3792
3793TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3794 sp<SurfaceControl> layer;
3795 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3796
3797 // Normal call to set up test
3798 Transaction transaction;
3799 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003800 int err = fillTransaction(transaction, &callback, layer);
3801 if (err) {
3802 GTEST_SUCCEED() << "test not supported";
3803 return;
3804 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003805
Marissa Wall861616d2018-10-22 12:52:23 -07003806 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003807
3808 ExpectedResult expectedResult;
3809 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3810 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3811
3812 // Test
3813 std::vector<ExpectedResult> expectedResults(50);
3814 for (auto& expected : expectedResults) {
3815 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003816 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3817 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003818
Marissa Wall713b63f2018-10-17 15:42:43 -07003819 err = fillTransaction(transaction, &callback);
3820 if (err) {
3821 GTEST_SUCCEED() << "test not supported";
3822 return;
3823 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003824
Marissa Wall861616d2018-10-22 12:52:23 -07003825 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003826 }
3827 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3828}
3829
Marissa Wall17b4e452018-12-26 16:32:34 -08003830TEST_F(LayerCallbackTest, DesiredPresentTime) {
3831 sp<SurfaceControl> layer;
3832 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3833
3834 Transaction transaction;
3835 CallbackHelper callback;
3836 int err = fillTransaction(transaction, &callback, layer);
3837 if (err) {
3838 GTEST_SUCCEED() << "test not supported";
3839 return;
3840 }
3841
3842 // Try to present 100ms in the future
3843 nsecs_t time = systemTime() + (100 * 1e6);
3844
3845 transaction.setDesiredPresentTime(time);
3846 transaction.apply();
3847
3848 ExpectedResult expected;
3849 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3850 expected.addExpectedPresentTime(time);
3851 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3852}
3853
3854TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3855 sp<SurfaceControl> layer;
3856 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3857
3858 Transaction transaction;
3859 CallbackHelper callback1;
3860 int err = fillTransaction(transaction, &callback1, layer);
3861 if (err) {
3862 GTEST_SUCCEED() << "test not supported";
3863 return;
3864 }
3865
3866 // Try to present 100ms in the future
3867 nsecs_t time = systemTime() + (100 * 1e6);
3868
3869 transaction.setDesiredPresentTime(time);
3870 transaction.apply();
3871
3872 ExpectedResult expected1;
3873 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3874 expected1.addExpectedPresentTime(time);
3875
3876 CallbackHelper callback2;
3877 err = fillTransaction(transaction, &callback2, layer);
3878 if (err) {
3879 GTEST_SUCCEED() << "test not supported";
3880 return;
3881 }
3882
3883 // Try to present 33ms after the first frame
3884 time += (33.3 * 1e6);
3885
3886 transaction.setDesiredPresentTime(time);
3887 transaction.apply();
3888
3889 ExpectedResult expected2;
3890 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3891 ExpectedResult::Buffer::ACQUIRED,
3892 ExpectedResult::PreviousBuffer::RELEASED);
3893 expected2.addExpectedPresentTime(time);
3894
3895 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3896 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3897}
3898
3899TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3900 sp<SurfaceControl> layer;
3901 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3902
3903 Transaction transaction;
3904 CallbackHelper callback1;
3905 int err = fillTransaction(transaction, &callback1, layer);
3906 if (err) {
3907 GTEST_SUCCEED() << "test not supported";
3908 return;
3909 }
3910
3911 // Try to present 100ms in the future
3912 nsecs_t time = systemTime() + (100 * 1e6);
3913
3914 transaction.setDesiredPresentTime(time);
3915 transaction.apply();
3916
3917 ExpectedResult expected1;
3918 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3919 expected1.addExpectedPresentTime(time);
3920
3921 CallbackHelper callback2;
3922 err = fillTransaction(transaction, &callback2, layer);
3923 if (err) {
3924 GTEST_SUCCEED() << "test not supported";
3925 return;
3926 }
3927
3928 // Try to present 33ms before the previous frame
3929 time -= (33.3 * 1e6);
3930
3931 transaction.setDesiredPresentTime(time);
3932 transaction.apply();
3933
3934 ExpectedResult expected2;
3935 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3936 ExpectedResult::Buffer::ACQUIRED,
3937 ExpectedResult::PreviousBuffer::RELEASED);
3938
3939 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3940 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3941}
3942
3943TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3944 sp<SurfaceControl> layer;
3945 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3946
3947 Transaction transaction;
3948 CallbackHelper callback;
3949 int err = fillTransaction(transaction, &callback, layer);
3950 if (err) {
3951 GTEST_SUCCEED() << "test not supported";
3952 return;
3953 }
3954
3955 // Try to present 100ms in the past
3956 nsecs_t time = systemTime() - (100 * 1e6);
3957
3958 transaction.setDesiredPresentTime(time);
3959 transaction.apply();
3960
3961 ExpectedResult expected;
3962 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3963 expected.addExpectedPresentTime(systemTime());
3964 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3965}
3966
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003967class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003968protected:
3969 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003970 LayerTransactionTest::SetUp();
3971 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003972
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003973 const auto display = SurfaceComposerClient::getInternalDisplayToken();
3974 ASSERT_FALSE(display == nullptr);
3975
Mathias Agopianc666cae2012-07-25 18:56:13 -07003976 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003977 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003978
3979 ssize_t displayWidth = info.w;
3980 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003981
3982 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003983 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3984 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003985 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003986 ASSERT_TRUE(mBGSurfaceControl->isValid());
3987 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3988
3989 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003990 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
3991
Peiyong Lin566a3b42018-01-09 18:22:43 -08003992 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003993 ASSERT_TRUE(mFGSurfaceControl->isValid());
3994
3995 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
3996
3997 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07003998 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003999 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004000 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4001
4002 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4003
Robert Carr4cdc58f2017-08-23 14:22:20 -07004004 asTransaction([&](Transaction& t) {
4005 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004006
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004007 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004008
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004009 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4010 .setPosition(mFGSurfaceControl, 64, 64)
4011 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004012
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004013 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4014 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4015 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004016 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004017 }
4018
4019 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004020 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004021 mBGSurfaceControl = 0;
4022 mFGSurfaceControl = 0;
4023 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004024 }
4025
4026 void waitForPostedBuffers() {
4027 // Since the sync surface is in synchronous mode (i.e. double buffered)
4028 // posting three buffers to it should ensure that at least two
4029 // SurfaceFlinger::handlePageFlip calls have been made, which should
4030 // guaranteed that a buffer posted to another Surface has been retired.
4031 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4032 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4033 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4034 }
4035
Robert Carr4cdc58f2017-08-23 14:22:20 -07004036 void asTransaction(const std::function<void(Transaction&)>& exec) {
4037 Transaction t;
4038 exec(t);
4039 t.apply(true);
4040 }
4041
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004042 sp<SurfaceControl> mBGSurfaceControl;
4043 sp<SurfaceControl> mFGSurfaceControl;
4044
4045 // This surface is used to ensure that the buffers posted to
4046 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4047 sp<SurfaceControl> mSyncSurfaceControl;
4048};
4049
Robert Carr7f619b22017-11-06 12:56:35 -08004050TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004051
chaviw0e3479f2018-09-10 16:49:30 -07004052 std::unique_ptr<ScreenCapture> sc;
4053
4054 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004055 fillSurfaceRGBA8(relative, 10, 10, 10);
4056 waitForPostedBuffers();
4057
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004058 Transaction{}
4059 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004060 .setPosition(relative, 64, 64)
4061 .apply();
4062
4063 {
4064 // The relative should be on top of the FG control.
4065 ScreenCapture::captureScreen(&sc);
4066 sc->checkPixel(64, 64, 10, 10, 10);
4067 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004068 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004069
4070 {
4071 // Nothing should change at this point.
4072 ScreenCapture::captureScreen(&sc);
4073 sc->checkPixel(64, 64, 10, 10, 10);
4074 }
4075
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004076 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004077
4078 {
4079 // Ensure that the relative was actually hidden, rather than
4080 // being left in the detached but visible state.
4081 ScreenCapture::captureScreen(&sc);
4082 sc->expectFGColor(64, 64);
4083 }
4084}
4085
Robert Carr8d5227b2017-03-16 15:41:03 -07004086class GeometryLatchingTest : public LayerUpdateTest {
4087protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004088 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004089 SCOPED_TRACE(trace);
4090 ScreenCapture::captureScreen(&sc);
4091 // We find the leading edge of the FG surface.
4092 sc->expectFGColor(127, 127);
4093 sc->expectBGColor(128, 128);
4094 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004095
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004096 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004097
4098 void unlockFGBuffer() {
4099 sp<Surface> s = mFGSurfaceControl->getSurface();
4100 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4101 waitForPostedBuffers();
4102 }
4103
Robert Carr8d5227b2017-03-16 15:41:03 -07004104 void completeFGResize() {
4105 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4106 waitForPostedBuffers();
4107 }
4108 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004109 asTransaction([&](Transaction& t) {
4110 t.setSize(mFGSurfaceControl, 64, 64);
4111 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004112 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004113 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004114
4115 EXPECT_INITIAL_STATE("After restoring initial state");
4116 }
chaviw0e3479f2018-09-10 16:49:30 -07004117 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004118};
4119
Robert Carr8d5227b2017-03-16 15:41:03 -07004120class CropLatchingTest : public GeometryLatchingTest {
4121protected:
4122 void EXPECT_CROPPED_STATE(const char* trace) {
4123 SCOPED_TRACE(trace);
4124 ScreenCapture::captureScreen(&sc);
4125 // The edge should be moved back one pixel by our crop.
4126 sc->expectFGColor(126, 126);
4127 sc->expectBGColor(127, 127);
4128 sc->expectBGColor(128, 128);
4129 }
chaviw59f5c562017-06-28 16:39:06 -07004130
4131 void EXPECT_RESIZE_STATE(const char* trace) {
4132 SCOPED_TRACE(trace);
4133 ScreenCapture::captureScreen(&sc);
4134 // The FG is now resized too 128,128 at 64,64
4135 sc->expectFGColor(64, 64);
4136 sc->expectFGColor(191, 191);
4137 sc->expectBGColor(192, 192);
4138 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004139};
4140
Pablo Ceballos05289c22016-04-14 15:49:55 -07004141TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004142 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004143 {
4144 SCOPED_TRACE("before anything");
4145 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004146 sc->expectBGColor(32, 32);
4147 sc->expectFGColor(96, 96);
4148 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004149 }
4150
4151 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004152 asTransaction([&](Transaction& t) {
4153 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004154 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4155 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004156 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004157
Robert Carr4cdc58f2017-08-23 14:22:20 -07004158 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004159 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004160 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4161 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004162 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004163
4164 {
4165 SCOPED_TRACE("before any trigger");
4166 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004167 sc->expectBGColor(32, 32);
4168 sc->expectFGColor(96, 96);
4169 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004170 }
4171
4172 // should trigger the first deferred transaction, but not the second one
4173 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4174 {
4175 SCOPED_TRACE("after first trigger");
4176 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004177 sc->expectBGColor(32, 32);
4178 sc->checkPixel(96, 96, 162, 63, 96);
4179 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004180 }
4181
4182 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004183 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004184
4185 // trigger the second deferred transaction
4186 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4187 {
4188 SCOPED_TRACE("after second trigger");
4189 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004190 sc->expectBGColor(32, 32);
4191 sc->expectBGColor(96, 96);
4192 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004193 }
4194}
4195
Robert Carre392b552017-09-19 12:16:05 -07004196TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004197 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004198
4199 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004200 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4201 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4202 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4203 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004204 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004205 SurfaceComposerClient::Transaction{}
4206 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4207 .show(childNoBuffer)
4208 .show(childBuffer)
4209 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004210 {
4211 ScreenCapture::captureScreen(&sc);
4212 sc->expectChildColor(73, 73);
4213 sc->expectFGColor(74, 74);
4214 }
Vishnu Nair60356342018-11-13 13:00:45 -08004215 SurfaceComposerClient::Transaction{}
4216 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4217 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004218 {
4219 ScreenCapture::captureScreen(&sc);
4220 sc->expectChildColor(73, 73);
4221 sc->expectChildColor(74, 74);
4222 }
4223}
4224
Robert Carr2c5f6d22017-09-26 12:30:35 -07004225TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004226 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004227 {
4228 SCOPED_TRACE("before move");
4229 ScreenCapture::captureScreen(&sc);
4230 sc->expectBGColor(0, 12);
4231 sc->expectFGColor(75, 75);
4232 sc->expectBGColor(145, 145);
4233 }
4234
4235 Transaction t1, t2;
4236 t1.setPosition(mFGSurfaceControl, 128, 128);
4237 t2.setPosition(mFGSurfaceControl, 0, 0);
4238 // We expect that the position update from t2 now
4239 // overwrites the position update from t1.
4240 t1.merge(std::move(t2));
4241 t1.apply();
4242
4243 {
4244 ScreenCapture::captureScreen(&sc);
4245 sc->expectFGColor(1, 1);
4246 }
4247}
4248
Robert Carr1f0a16a2016-10-24 16:27:39 -07004249class ChildLayerTest : public LayerUpdateTest {
4250protected:
4251 void SetUp() override {
4252 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004253 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4254 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004255 fillSurfaceRGBA8(mChild, 200, 200, 200);
4256
4257 {
4258 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004259 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004260 mCapture->expectChildColor(64, 64);
4261 }
4262 }
4263 void TearDown() override {
4264 LayerUpdateTest::TearDown();
4265 mChild = 0;
4266 }
4267
4268 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004269 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004270};
4271
4272TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004273 asTransaction([&](Transaction& t) {
4274 t.show(mChild);
4275 t.setPosition(mChild, 10, 10);
4276 t.setPosition(mFGSurfaceControl, 64, 64);
4277 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004278
4279 {
chaviw0e3479f2018-09-10 16:49:30 -07004280 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004281 // Top left of foreground must now be visible
4282 mCapture->expectFGColor(64, 64);
4283 // But 10 pixels in we should see the child surface
4284 mCapture->expectChildColor(74, 74);
4285 // And 10 more pixels we should be back to the foreground surface
4286 mCapture->expectFGColor(84, 84);
4287 }
4288
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004289 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004290
4291 {
chaviw0e3479f2018-09-10 16:49:30 -07004292 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004293 // Top left of foreground should now be at 0, 0
4294 mCapture->expectFGColor(0, 0);
4295 // But 10 pixels in we should see the child surface
4296 mCapture->expectChildColor(10, 10);
4297 // And 10 more pixels we should be back to the foreground surface
4298 mCapture->expectFGColor(20, 20);
4299 }
4300}
4301
Robert Carr41b08b52017-06-01 16:11:34 -07004302TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004303 asTransaction([&](Transaction& t) {
4304 t.show(mChild);
4305 t.setPosition(mChild, 0, 0);
4306 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004307 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004308 });
Robert Carr41b08b52017-06-01 16:11:34 -07004309
4310 {
chaviw0e3479f2018-09-10 16:49:30 -07004311 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004312 mCapture->expectChildColor(0, 0);
4313 mCapture->expectChildColor(4, 4);
4314 mCapture->expectBGColor(5, 5);
4315 }
4316}
4317
Robert Carr1f0a16a2016-10-24 16:27:39 -07004318TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004319 asTransaction([&](Transaction& t) {
4320 t.show(mChild);
4321 t.setPosition(mFGSurfaceControl, 0, 0);
4322 t.setPosition(mChild, 63, 63);
4323 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004324
4325 {
chaviw0e3479f2018-09-10 16:49:30 -07004326 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004327 mCapture->expectFGColor(0, 0);
4328 // Last pixel in foreground should now be the child.
4329 mCapture->expectChildColor(63, 63);
4330 // But the child should be constrained and the next pixel
4331 // must be the background
4332 mCapture->expectBGColor(64, 64);
4333 }
4334}
4335
4336TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004337 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004338
4339 // Find the boundary between the parent and child
4340 {
chaviw0e3479f2018-09-10 16:49:30 -07004341 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004342 mCapture->expectChildColor(9, 9);
4343 mCapture->expectFGColor(10, 10);
4344 }
4345
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004346 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004347
4348 // The boundary should be twice as far from the origin now.
4349 // The pixels from the last test should all be child now
4350 {
chaviw0e3479f2018-09-10 16:49:30 -07004351 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004352 mCapture->expectChildColor(9, 9);
4353 mCapture->expectChildColor(10, 10);
4354 mCapture->expectChildColor(19, 19);
4355 mCapture->expectFGColor(20, 20);
4356 }
4357}
Robert Carr9524cb32017-02-13 11:32:32 -08004358
Robert Carr6452f122017-03-21 10:41:29 -07004359TEST_F(ChildLayerTest, ChildLayerAlpha) {
4360 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4361 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4362 fillSurfaceRGBA8(mChild, 0, 254, 0);
4363 waitForPostedBuffers();
4364
Robert Carr4cdc58f2017-08-23 14:22:20 -07004365 asTransaction([&](Transaction& t) {
4366 t.show(mChild);
4367 t.setPosition(mChild, 0, 0);
4368 t.setPosition(mFGSurfaceControl, 0, 0);
4369 });
Robert Carr6452f122017-03-21 10:41:29 -07004370
4371 {
chaviw0e3479f2018-09-10 16:49:30 -07004372 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004373 // Unblended child color
4374 mCapture->checkPixel(0, 0, 0, 254, 0);
4375 }
4376
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004377 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004378
4379 {
chaviw0e3479f2018-09-10 16:49:30 -07004380 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004381 // Child and BG blended.
4382 mCapture->checkPixel(0, 0, 127, 127, 0);
4383 }
4384
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004385 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004386
4387 {
chaviw0e3479f2018-09-10 16:49:30 -07004388 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004389 // Child and BG blended.
4390 mCapture->checkPixel(0, 0, 95, 64, 95);
4391 }
4392}
4393
Robert Carr9524cb32017-02-13 11:32:32 -08004394TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004395 asTransaction([&](Transaction& t) {
4396 t.show(mChild);
4397 t.setPosition(mChild, 10, 10);
4398 t.setPosition(mFGSurfaceControl, 64, 64);
4399 });
Robert Carr9524cb32017-02-13 11:32:32 -08004400
4401 {
chaviw0e3479f2018-09-10 16:49:30 -07004402 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004403 // Top left of foreground must now be visible
4404 mCapture->expectFGColor(64, 64);
4405 // But 10 pixels in we should see the child surface
4406 mCapture->expectChildColor(74, 74);
4407 // And 10 more pixels we should be back to the foreground surface
4408 mCapture->expectFGColor(84, 84);
4409 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004410
4411 asTransaction([&](Transaction& t) {
4412 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4413 });
4414
Robert Carr9524cb32017-02-13 11:32:32 -08004415 {
chaviw0e3479f2018-09-10 16:49:30 -07004416 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004417 mCapture->expectFGColor(64, 64);
4418 // In reparenting we should have exposed the entire foreground surface.
4419 mCapture->expectFGColor(74, 74);
4420 // And the child layer should now begin at 10, 10 (since the BG
4421 // layer is at (0, 0)).
4422 mCapture->expectBGColor(9, 9);
4423 mCapture->expectChildColor(10, 10);
4424 }
4425}
4426
Robert Carr2e102c92018-10-23 12:11:15 -07004427TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4428 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004429 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004430 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4431
4432 {
4433 SCOPED_TRACE("Grandchild visible");
4434 ScreenCapture::captureScreen(&mCapture);
4435 mCapture->checkPixel(64, 64, 111, 111, 111);
4436 }
4437
Robert Carr87246532019-02-04 15:20:26 -08004438 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004439
4440 {
4441 SCOPED_TRACE("After destroying child");
4442 ScreenCapture::captureScreen(&mCapture);
4443 mCapture->expectFGColor(64, 64);
4444 }
4445
4446 asTransaction([&](Transaction& t) {
4447 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4448 });
4449
4450 {
4451 SCOPED_TRACE("After reparenting grandchild");
4452 ScreenCapture::captureScreen(&mCapture);
4453 mCapture->checkPixel(64, 64, 111, 111, 111);
4454 }
4455}
4456
chaviw161410b02017-07-27 10:46:08 -07004457TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004458 asTransaction([&](Transaction& t) {
4459 t.show(mChild);
4460 t.setPosition(mChild, 10, 10);
4461 t.setPosition(mFGSurfaceControl, 64, 64);
4462 });
Robert Carr9524cb32017-02-13 11:32:32 -08004463
4464 {
chaviw0e3479f2018-09-10 16:49:30 -07004465 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004466 // Top left of foreground must now be visible
4467 mCapture->expectFGColor(64, 64);
4468 // But 10 pixels in we should see the child surface
4469 mCapture->expectChildColor(74, 74);
4470 // And 10 more pixels we should be back to the foreground surface
4471 mCapture->expectFGColor(84, 84);
4472 }
4473
chaviw0e3479f2018-09-10 16:49:30 -07004474
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004475 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004476
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004477 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004478
chaviw161410b02017-07-27 10:46:08 -07004479 // Since the child has the same client as the parent, it will not get
4480 // detached and will be hidden.
4481 {
chaviw0e3479f2018-09-10 16:49:30 -07004482 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004483 mCapture->expectFGColor(64, 64);
4484 mCapture->expectFGColor(74, 74);
4485 mCapture->expectFGColor(84, 84);
4486 }
4487}
4488
4489TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4490 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004491 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004492 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4493 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004494
chaviw161410b02017-07-27 10:46:08 -07004495 ASSERT_TRUE(mChildNewClient->isValid());
4496
4497 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4498
Robert Carr4cdc58f2017-08-23 14:22:20 -07004499 asTransaction([&](Transaction& t) {
4500 t.hide(mChild);
4501 t.show(mChildNewClient);
4502 t.setPosition(mChildNewClient, 10, 10);
4503 t.setPosition(mFGSurfaceControl, 64, 64);
4504 });
chaviw161410b02017-07-27 10:46:08 -07004505
4506 {
chaviw0e3479f2018-09-10 16:49:30 -07004507 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004508 // Top left of foreground must now be visible
4509 mCapture->expectFGColor(64, 64);
4510 // But 10 pixels in we should see the child surface
4511 mCapture->expectChildColor(74, 74);
4512 // And 10 more pixels we should be back to the foreground surface
4513 mCapture->expectFGColor(84, 84);
4514 }
4515
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004516 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004517
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004518 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004519
Robert Carr9524cb32017-02-13 11:32:32 -08004520 // Nothing should have changed.
4521 {
chaviw0e3479f2018-09-10 16:49:30 -07004522 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004523 mCapture->expectFGColor(64, 64);
4524 mCapture->expectChildColor(74, 74);
4525 mCapture->expectFGColor(84, 84);
4526 }
4527}
4528
chaviw5aedec92018-10-22 10:40:38 -07004529TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4530 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4531 sp<SurfaceControl> childNewClient =
4532 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4533 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4534
4535 ASSERT_TRUE(childNewClient != nullptr);
4536 ASSERT_TRUE(childNewClient->isValid());
4537
4538 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4539
4540 Transaction()
4541 .hide(mChild)
4542 .show(childNewClient)
4543 .setPosition(childNewClient, 10, 10)
4544 .setPosition(mFGSurfaceControl, 64, 64)
4545 .apply();
4546
4547 {
4548 mCapture = screenshot();
4549 // Top left of foreground must now be visible
4550 mCapture->expectFGColor(64, 64);
4551 // But 10 pixels in we should see the child surface
4552 mCapture->expectChildColor(74, 74);
4553 // And 10 more pixels we should be back to the foreground surface
4554 mCapture->expectFGColor(84, 84);
4555 }
4556
4557 Transaction().detachChildren(mFGSurfaceControl).apply();
4558 Transaction().hide(childNewClient).apply();
4559
4560 // Nothing should have changed.
4561 {
4562 mCapture = screenshot();
4563 mCapture->expectFGColor(64, 64);
4564 mCapture->expectChildColor(74, 74);
4565 mCapture->expectFGColor(84, 84);
4566 }
4567
4568 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4569 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4570 32);
4571 Transaction()
4572 .setLayer(newParentSurface, INT32_MAX - 1)
4573 .show(newParentSurface)
4574 .setPosition(newParentSurface, 20, 20)
4575 .reparent(childNewClient, newParentSurface->getHandle())
4576 .apply();
4577 {
4578 mCapture = screenshot();
4579 // Child is now hidden.
4580 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4581 }
4582}
4583
Robert Carr9b429f42017-04-17 14:56:57 -07004584TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004585 asTransaction([&](Transaction& t) {
4586 t.show(mChild);
4587 t.setPosition(mChild, 0, 0);
4588 t.setPosition(mFGSurfaceControl, 0, 0);
4589 });
Robert Carr9b429f42017-04-17 14:56:57 -07004590
4591 {
chaviw0e3479f2018-09-10 16:49:30 -07004592 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004593 // We've positioned the child in the top left.
4594 mCapture->expectChildColor(0, 0);
4595 // But it's only 10x10.
4596 mCapture->expectFGColor(10, 10);
4597 }
4598
Robert Carr4cdc58f2017-08-23 14:22:20 -07004599 asTransaction([&](Transaction& t) {
4600 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4601 // We cause scaling by 2.
4602 t.setSize(mFGSurfaceControl, 128, 128);
4603 });
Robert Carr9b429f42017-04-17 14:56:57 -07004604
4605 {
chaviw0e3479f2018-09-10 16:49:30 -07004606 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004607 // We've positioned the child in the top left.
4608 mCapture->expectChildColor(0, 0);
4609 mCapture->expectChildColor(10, 10);
4610 mCapture->expectChildColor(19, 19);
4611 // And now it should be scaled all the way to 20x20
4612 mCapture->expectFGColor(20, 20);
4613 }
4614}
4615
Robert Carr1725eee2017-04-26 18:32:15 -07004616// Regression test for b/37673612
4617TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004618 asTransaction([&](Transaction& t) {
4619 t.show(mChild);
4620 t.setPosition(mChild, 0, 0);
4621 t.setPosition(mFGSurfaceControl, 0, 0);
4622 });
Robert Carr1725eee2017-04-26 18:32:15 -07004623
4624 {
chaviw0e3479f2018-09-10 16:49:30 -07004625 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004626 // We've positioned the child in the top left.
4627 mCapture->expectChildColor(0, 0);
4628 // But it's only 10x10.
4629 mCapture->expectFGColor(10, 10);
4630 }
Robert Carr1725eee2017-04-26 18:32:15 -07004631 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4632 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004633 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004634 sp<Surface> s = mFGSurfaceControl->getSurface();
4635 auto anw = static_cast<ANativeWindow*>(s.get());
4636 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4637 native_window_set_buffers_dimensions(anw, 64, 128);
4638 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4639 waitForPostedBuffers();
4640
4641 {
4642 // The child should still be in the same place and not have any strange scaling as in
4643 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004644 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004645 mCapture->expectChildColor(0, 0);
4646 mCapture->expectFGColor(10, 10);
4647 }
4648}
4649
Dan Stoza412903f2017-04-27 13:42:17 -07004650TEST_F(ChildLayerTest, Bug36858924) {
4651 // Destroy the child layer
4652 mChild.clear();
4653
4654 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004655 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4656 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004657
4658 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004659 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004660 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4661 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004662 t.show(mChild);
4663 });
Dan Stoza412903f2017-04-27 13:42:17 -07004664
4665 // Render the foreground surface a few times
4666 //
4667 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4668 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4669 // never acquire/release the first buffer
4670 ALOGI("Filling 1");
4671 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4672 ALOGI("Filling 2");
4673 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4674 ALOGI("Filling 3");
4675 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4676 ALOGI("Filling 4");
4677 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4678}
4679
chaviwf1961f72017-09-18 16:41:07 -07004680TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004681 asTransaction([&](Transaction& t) {
4682 t.show(mChild);
4683 t.setPosition(mChild, 10, 10);
4684 t.setPosition(mFGSurfaceControl, 64, 64);
4685 });
chaviw06178942017-07-27 10:25:59 -07004686
4687 {
chaviw0e3479f2018-09-10 16:49:30 -07004688 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004689 // Top left of foreground must now be visible
4690 mCapture->expectFGColor(64, 64);
4691 // But 10 pixels in we should see the child surface
4692 mCapture->expectChildColor(74, 74);
4693 // And 10 more pixels we should be back to the foreground surface
4694 mCapture->expectFGColor(84, 84);
4695 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004696
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004697 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004698
chaviw06178942017-07-27 10:25:59 -07004699 {
chaviw0e3479f2018-09-10 16:49:30 -07004700 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004701 mCapture->expectFGColor(64, 64);
4702 // In reparenting we should have exposed the entire foreground surface.
4703 mCapture->expectFGColor(74, 74);
4704 // And the child layer should now begin at 10, 10 (since the BG
4705 // layer is at (0, 0)).
4706 mCapture->expectBGColor(9, 9);
4707 mCapture->expectChildColor(10, 10);
4708 }
4709}
4710
chaviwf1961f72017-09-18 16:41:07 -07004711TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004712 asTransaction([&](Transaction& t) {
4713 t.show(mChild);
4714 t.setPosition(mChild, 10, 10);
4715 t.setPosition(mFGSurfaceControl, 64, 64);
4716 });
chaviwf1961f72017-09-18 16:41:07 -07004717
4718 {
chaviw0e3479f2018-09-10 16:49:30 -07004719 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004720 // Top left of foreground must now be visible
4721 mCapture->expectFGColor(64, 64);
4722 // But 10 pixels in we should see the child surface
4723 mCapture->expectChildColor(74, 74);
4724 // And 10 more pixels we should be back to the foreground surface
4725 mCapture->expectFGColor(84, 84);
4726 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004727 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004728 {
chaviw0e3479f2018-09-10 16:49:30 -07004729 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004730 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004731 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004732 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004733 mCapture->expectFGColor(84, 84);
4734 }
4735}
4736
4737TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004738 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004739 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004740 ASSERT_TRUE(newSurface->isValid());
4741
4742 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004743 asTransaction([&](Transaction& t) {
4744 t.hide(mChild);
4745 t.show(newSurface);
4746 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004747 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004748 t.setPosition(mFGSurfaceControl, 64, 64);
4749 });
chaviwf1961f72017-09-18 16:41:07 -07004750
4751 {
chaviw0e3479f2018-09-10 16:49:30 -07004752 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004753 // Top left of foreground must now be visible
4754 mCapture->expectFGColor(64, 64);
4755 // At 10, 10 we should see the new surface
4756 mCapture->checkPixel(10, 10, 63, 195, 63);
4757 }
4758
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004759 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004760
4761 {
chaviw0e3479f2018-09-10 16:49:30 -07004762 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004763 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4764 // mFGSurface, putting it at 74, 74.
4765 mCapture->expectFGColor(64, 64);
4766 mCapture->checkPixel(74, 74, 63, 195, 63);
4767 mCapture->expectFGColor(84, 84);
4768 }
4769}
4770
chaviwc9674332017-08-28 12:32:18 -07004771TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004772 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4773 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004774 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4775
4776 {
chaviw0e3479f2018-09-10 16:49:30 -07004777 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004778 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4779 // which begins at 64, 64
4780 mCapture->checkPixel(64, 64, 50, 50, 50);
4781 }
4782}
4783
Robert Carr503c7042017-09-27 15:06:08 -07004784TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004785 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004786 fillSurfaceRGBA8(relative, 255, 255, 255);
4787
4788 Transaction t;
4789 t.setLayer(relative, INT32_MAX)
4790 .setRelativeLayer(mChild, relative->getHandle(), 1)
4791 .setPosition(mFGSurfaceControl, 0, 0)
4792 .apply(true);
4793
4794 // We expect that the child should have been elevated above our
4795 // INT_MAX layer even though it's not a child of it.
4796 {
chaviw0e3479f2018-09-10 16:49:30 -07004797 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004798 mCapture->expectChildColor(0, 0);
4799 mCapture->expectChildColor(9, 9);
4800 mCapture->checkPixel(10, 10, 255, 255, 255);
4801 }
4802}
Vishnu Nair60356342018-11-13 13:00:45 -08004803class BoundlessLayerTest : public LayerUpdateTest {
4804protected:
4805 std::unique_ptr<ScreenCapture> mCapture;
4806};
4807
4808// Verify setting a size on a buffer layer has no effect.
4809TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4810 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004811 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4812 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004813 ASSERT_TRUE(bufferLayer->isValid());
4814 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4815 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4816 {
4817 mCapture = screenshot();
4818 // Top left of background must now be visible
4819 mCapture->expectBGColor(0, 0);
4820 // Foreground Surface bounds must be color layer
4821 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4822 // Buffer layer should not extend past buffer bounds
4823 mCapture->expectFGColor(95, 95);
4824 }
4825}
4826
4827// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4828// which will crop the color layer.
4829TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4830 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004831 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4832 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004833 ASSERT_TRUE(colorLayer->isValid());
4834 asTransaction([&](Transaction& t) {
4835 t.setColor(colorLayer, half3{0, 0, 0});
4836 t.show(colorLayer);
4837 });
4838 {
4839 mCapture = screenshot();
4840 // Top left of background must now be visible
4841 mCapture->expectBGColor(0, 0);
4842 // Foreground Surface bounds must be color layer
4843 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4844 // Color layer should not extend past foreground bounds
4845 mCapture->expectBGColor(129, 129);
4846 }
4847}
4848
4849// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4850// a crop which will be used to crop the color layer.
4851TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004852 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4853 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004854 ASSERT_TRUE(cropLayer->isValid());
4855 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004856 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4857 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004858 ASSERT_TRUE(colorLayer->isValid());
4859 asTransaction([&](Transaction& t) {
4860 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4861 t.setColor(colorLayer, half3{0, 0, 0});
4862 t.show(cropLayer);
4863 t.show(colorLayer);
4864 });
4865 {
4866 mCapture = screenshot();
4867 // Top left of background must now be visible
4868 mCapture->expectBGColor(0, 0);
4869 // Top left of foreground must now be visible
4870 mCapture->expectFGColor(64, 64);
4871 // 5 pixels from the foreground we should see the child surface
4872 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4873 // 10 pixels from the foreground we should be back to the foreground surface
4874 mCapture->expectFGColor(74, 74);
4875 }
4876}
4877
4878// Verify for boundless layer with no children, their transforms have no effect.
4879TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4880 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004881 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4882 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004883 ASSERT_TRUE(colorLayer->isValid());
4884 asTransaction([&](Transaction& t) {
4885 t.setPosition(colorLayer, 320, 320);
4886 t.setMatrix(colorLayer, 2, 0, 0, 2);
4887 t.setColor(colorLayer, half3{0, 0, 0});
4888 t.show(colorLayer);
4889 });
4890 {
4891 mCapture = screenshot();
4892 // Top left of background must now be visible
4893 mCapture->expectBGColor(0, 0);
4894 // Foreground Surface bounds must be color layer
4895 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4896 // Color layer should not extend past foreground bounds
4897 mCapture->expectBGColor(129, 129);
4898 }
4899}
4900
4901// Verify for boundless layer with children, their transforms have an effect.
4902TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4903 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004904 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4905 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004906 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4907 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004908 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4909 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004910 ASSERT_TRUE(boundlessLayerDownShift->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, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004914 ASSERT_TRUE(colorLayer->isValid());
4915 asTransaction([&](Transaction& t) {
4916 t.setPosition(boundlessLayerRightShift, 32, 0);
4917 t.show(boundlessLayerRightShift);
4918 t.setPosition(boundlessLayerDownShift, 0, 32);
4919 t.show(boundlessLayerDownShift);
4920 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4921 t.setColor(colorLayer, half3{0, 0, 0});
4922 t.show(colorLayer);
4923 });
4924 {
4925 mCapture = screenshot();
4926 // Top left of background must now be visible
4927 mCapture->expectBGColor(0, 0);
4928 // Top left of foreground must now be visible
4929 mCapture->expectFGColor(64, 64);
4930 // Foreground Surface bounds must be color layer
4931 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4932 // Color layer should not extend past foreground bounds
4933 mCapture->expectBGColor(129, 129);
4934 }
4935}
4936
4937// Verify child layers do not get clipped if they temporarily move into the negative
4938// coordinate space as the result of an intermediate transformation.
4939TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4940 sp<SurfaceControl> boundlessLayer =
4941 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4942 0 /* flags */, mFGSurfaceControl.get());
4943 ASSERT_TRUE(boundlessLayer != nullptr);
4944 ASSERT_TRUE(boundlessLayer->isValid());
4945 sp<SurfaceControl> colorLayer =
4946 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4947 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4948 ASSERT_TRUE(colorLayer != nullptr);
4949 ASSERT_TRUE(colorLayer->isValid());
4950 asTransaction([&](Transaction& t) {
4951 // shift child layer off bounds. If this layer was not boundless, we will
4952 // expect the child layer to be cropped.
4953 t.setPosition(boundlessLayer, 32, 32);
4954 t.show(boundlessLayer);
4955 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4956 // undo shift by parent
4957 t.setPosition(colorLayer, -32, -32);
4958 t.setColor(colorLayer, half3{0, 0, 0});
4959 t.show(colorLayer);
4960 });
4961 {
4962 mCapture = screenshot();
4963 // Top left of background must now be visible
4964 mCapture->expectBGColor(0, 0);
4965 // Foreground Surface bounds must be color layer
4966 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4967 // Color layer should not extend past foreground bounds
4968 mCapture->expectBGColor(129, 129);
4969 }
4970}
4971
4972// Verify for boundless root layers with children, their transforms have an effect.
4973TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004974 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4975 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004976 ASSERT_TRUE(rootBoundlessLayer->isValid());
4977 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004978 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4979 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4980
Vishnu Nair60356342018-11-13 13:00:45 -08004981 ASSERT_TRUE(colorLayer->isValid());
4982 asTransaction([&](Transaction& t) {
4983 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4984 t.setPosition(rootBoundlessLayer, 32, 32);
4985 t.show(rootBoundlessLayer);
4986 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4987 t.setColor(colorLayer, half3{0, 0, 0});
4988 t.show(colorLayer);
4989 t.hide(mFGSurfaceControl);
4990 });
4991 {
4992 mCapture = screenshot();
4993 // Top left of background must now be visible
4994 mCapture->expectBGColor(0, 0);
4995 // Top left of foreground must now be visible
4996 mCapture->expectBGColor(31, 31);
4997 // Foreground Surface bounds must be color layer
4998 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
4999 // Color layer should not extend past foreground bounds
5000 mCapture->expectBGColor(97, 97);
5001 }
5002}
Robert Carr503c7042017-09-27 15:06:08 -07005003
chaviwa76b2712017-09-20 12:02:26 -07005004class ScreenCaptureTest : public LayerUpdateTest {
5005protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005006 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005007};
5008
5009TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5010 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005011 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005012 mCapture->expectBGColor(0, 0);
5013 // Doesn't capture FG layer which is at 64, 64
5014 mCapture->expectBGColor(64, 64);
5015}
5016
5017TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5018 auto fgHandle = mFGSurfaceControl->getHandle();
5019
Vishnu Nair88a11f22018-11-28 18:30:57 -08005020 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5021 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005022 fillSurfaceRGBA8(child, 200, 200, 200);
5023
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005024 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005025
5026 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005027 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005028 mCapture->expectFGColor(10, 10);
5029 mCapture->expectChildColor(0, 0);
5030}
5031
Robert Carr578038f2018-03-09 12:25:24 -08005032TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5033 auto fgHandle = mFGSurfaceControl->getHandle();
5034
Vishnu Nair88a11f22018-11-28 18:30:57 -08005035 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5036 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005037 fillSurfaceRGBA8(child, 200, 200, 200);
5038
5039 SurfaceComposerClient::Transaction().show(child).apply(true);
5040
5041 // Captures mFGSurfaceControl's child
5042 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5043 mCapture->checkPixel(10, 10, 0, 0, 0);
5044 mCapture->expectChildColor(0, 0);
5045}
5046
chaviw50da5042018-04-09 13:49:37 -07005047TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005048 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5049 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005050
5051 fillSurfaceRGBA8(child, 200, 200, 200);
5052
5053 SurfaceComposerClient::Transaction().show(child).apply(true);
5054
5055 auto childHandle = child->getHandle();
5056
5057 // Captures child
5058 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5059 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5060 // Area outside of child's bounds is transparent.
5061 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5062}
5063
chaviw4b129c22018-04-09 16:19:43 -07005064TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5065 auto fgHandle = mFGSurfaceControl->getHandle();
5066
Vishnu Nair88a11f22018-11-28 18:30:57 -08005067 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5068 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5069 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005070 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005071 fillSurfaceRGBA8(child, 200, 200, 200);
5072 fillSurfaceRGBA8(relative, 100, 100, 100);
5073
5074 SurfaceComposerClient::Transaction()
5075 .show(child)
5076 // Set relative layer above fg layer so should be shown above when computing all layers.
5077 .setRelativeLayer(relative, fgHandle, 1)
5078 .show(relative)
5079 .apply(true);
5080
5081 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5082 ScreenCapture::captureLayers(&mCapture, fgHandle);
5083 mCapture->expectFGColor(10, 10);
5084 mCapture->expectChildColor(0, 0);
5085}
5086
5087TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5088 auto fgHandle = mFGSurfaceControl->getHandle();
5089
Vishnu Nair88a11f22018-11-28 18:30:57 -08005090 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5091 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5092 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5093 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005094 fillSurfaceRGBA8(child, 200, 200, 200);
5095 fillSurfaceRGBA8(relative, 100, 100, 100);
5096
5097 SurfaceComposerClient::Transaction()
5098 .show(child)
5099 // Set relative layer below fg layer but relative to child layer so it should be shown
5100 // above child layer.
5101 .setLayer(relative, -1)
5102 .setRelativeLayer(relative, child->getHandle(), 1)
5103 .show(relative)
5104 .apply(true);
5105
5106 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5107 // relative value should be taken into account, placing it above child layer.
5108 ScreenCapture::captureLayers(&mCapture, fgHandle);
5109 mCapture->expectFGColor(10, 10);
5110 // Relative layer is showing on top of child layer
5111 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5112}
Robert Carr578038f2018-03-09 12:25:24 -08005113
5114// In the following tests we verify successful skipping of a parent layer,
5115// so we use the same verification logic and only change how we mutate
5116// the parent layer to verify that various properties are ignored.
5117class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5118public:
5119 void SetUp() override {
5120 LayerUpdateTest::SetUp();
5121
Vishnu Nair88a11f22018-11-28 18:30:57 -08005122 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5123 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005124 fillSurfaceRGBA8(mChild, 200, 200, 200);
5125
5126 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5127 }
5128
Vishnu Nair333a9572019-02-15 16:05:56 -08005129 void verify(std::function<void()> verifyStartingState) {
5130 // Verify starting state before a screenshot is taken.
5131 verifyStartingState();
5132
5133 // Verify child layer does not inherit any of the properties of its
5134 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005135 auto fgHandle = mFGSurfaceControl->getHandle();
5136 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5137 mCapture->checkPixel(10, 10, 0, 0, 0);
5138 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005139
5140 // Verify all assumptions are still true after the screenshot is taken.
5141 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005142 }
5143
5144 std::unique_ptr<ScreenCapture> mCapture;
5145 sp<SurfaceControl> mChild;
5146};
5147
Vishnu Nair333a9572019-02-15 16:05:56 -08005148// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005149TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5150
5151 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5152
5153 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005154
5155 // Before and after reparenting, verify child is properly hidden
5156 // when rendering full-screen.
5157 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005158}
5159
5160TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005161 SurfaceComposerClient::Transaction()
5162 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5163 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005164
5165 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005166
5167 // Before and after reparenting, verify child is cropped by parent.
5168 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005169}
5170
Vishnu Nair333a9572019-02-15 16:05:56 -08005171// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005172TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005173 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005174
5175 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005176
Vishnu Nair333a9572019-02-15 16:05:56 -08005177 // Before and after reparenting, verify child is properly scaled.
5178 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005179}
5180
5181
chaviwa76b2712017-09-20 12:02:26 -07005182TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5183 auto fgHandle = mFGSurfaceControl->getHandle();
5184
Vishnu Nair88a11f22018-11-28 18:30:57 -08005185 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5186 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005187 fillSurfaceRGBA8(child, 200, 200, 200);
5188
Vishnu Nair88a11f22018-11-28 18:30:57 -08005189 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5190 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005191
5192 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5193 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005194 .show(child)
5195 .setPosition(grandchild, 5, 5)
5196 .show(grandchild)
5197 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005198
5199 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005200 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005201 mCapture->expectFGColor(10, 10);
5202 mCapture->expectChildColor(0, 0);
5203 mCapture->checkPixel(5, 5, 50, 50, 50);
5204}
5205
5206TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005207 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5208 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005209 fillSurfaceRGBA8(child, 200, 200, 200);
5210 auto childHandle = child->getHandle();
5211
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005212 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005213
5214 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005215 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005216 mCapture->expectChildColor(0, 0);
5217 mCapture->expectChildColor(9, 9);
5218}
5219
5220TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005221 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5222 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005223 fillSurfaceRGBA8(child, 200, 200, 200);
5224 auto childHandle = child->getHandle();
5225
Vishnu Nair88a11f22018-11-28 18:30:57 -08005226 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5227 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005228 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5229
5230 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005231 .show(child)
5232 .setPosition(grandchild, 5, 5)
5233 .show(grandchild)
5234 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005235
5236 auto grandchildHandle = grandchild->getHandle();
5237
5238 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005239 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005240 mCapture->checkPixel(0, 0, 50, 50, 50);
5241 mCapture->checkPixel(4, 4, 50, 50, 50);
5242}
5243
chaviw7206d492017-11-10 16:16:12 -08005244TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005245 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005246 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5247 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005248
Marissa Wall61c58622018-07-18 10:12:20 -07005249 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5250 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005251
5252 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005253 .setLayer(redLayer, INT32_MAX - 1)
5254 .show(redLayer)
5255 .show(blueLayer)
5256 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005257
5258 auto redLayerHandle = redLayer->getHandle();
5259
5260 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005261 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5262 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5263 // red area below the blue area
5264 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5265 // red area to the right of the blue area
5266 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005267
Marissa Wall861616d2018-10-22 12:52:23 -07005268 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005269 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005270 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5271 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005272 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005273 mCapture->checkPixel(30, 30, 0, 0, 0);
5274}
5275
5276TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005277 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005278 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5279 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005280
Marissa Wall61c58622018-07-18 10:12:20 -07005281 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5282 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005283
5284 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005285 .setLayer(redLayer, INT32_MAX - 1)
5286 .show(redLayer)
5287 .show(blueLayer)
5288 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005289
5290 auto redLayerHandle = redLayer->getHandle();
5291
5292 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005293 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5294 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5295 // red area below the blue area
5296 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5297 // red area to the right of the blue area
5298 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005299
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005300 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005301 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005302 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5303 // red area below the blue area
5304 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5305 // red area to the right of the blue area
5306 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005307 mCapture->checkPixel(30, 30, 0, 0, 0);
5308}
5309
5310TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005311 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005312
Marissa Wall61c58622018-07-18 10:12:20 -07005313 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005314
5315 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005316 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005317 SurfaceComposerClient::Transaction().apply(true);
5318
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005319 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005320
5321 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005322 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5323 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005324}
5325
chaviw8e3fe5d2018-02-22 10:55:42 -08005326
5327class DereferenceSurfaceControlTest : public LayerTransactionTest {
5328protected:
5329 void SetUp() override {
5330 LayerTransactionTest::SetUp();
5331 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005332 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005333 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005334 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005335 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5336 {
5337 SCOPED_TRACE("before anything");
5338 auto shot = screenshot();
5339 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5340 }
5341 }
5342 void TearDown() override {
5343 LayerTransactionTest::TearDown();
5344 bgLayer = 0;
5345 fgLayer = 0;
5346 }
5347
5348 sp<SurfaceControl> bgLayer;
5349 sp<SurfaceControl> fgLayer;
5350};
5351
5352TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5353 fgLayer = nullptr;
5354 {
5355 SCOPED_TRACE("after setting null");
5356 auto shot = screenshot();
5357 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5358 }
5359}
5360
5361TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5362 auto transaction = Transaction().show(fgLayer);
5363 fgLayer = nullptr;
5364 {
5365 SCOPED_TRACE("after setting null");
5366 auto shot = screenshot();
5367 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5368 }
5369}
5370
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005371} // namespace android