blob: 1704424952185fecbc311bea6a03c1f1293fb4ac [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) {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700198 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700199 sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Robert Carr4cdc58f2017-08-23 14:22:20 -0700200 SurfaceComposerClient::Transaction().apply(true);
201
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000202 sp<GraphicBuffer> outBuffer;
Chia-I Wu718daf82017-10-20 11:57:17 -0700203 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -0700204 sf->captureScreen(display, &outBuffer, Rect(), 0, 0, false));
205 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000206 }
207
208 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
209 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
210 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
211 SurfaceComposerClient::Transaction().apply(true);
212
213 sp<GraphicBuffer> outBuffer;
214 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
215 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700216 }
217
Robert Carr578038f2018-03-09 12:25:24 -0800218 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
219 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
220 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
221 SurfaceComposerClient::Transaction().apply(true);
222
223 sp<GraphicBuffer> outBuffer;
224 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
225 *sc = std::make_unique<ScreenCapture>(outBuffer);
226 }
227
Chia-I Wu718daf82017-10-20 11:57:17 -0700228 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000229 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
230 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700231 }
232
233 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000234 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700235 const bool leftBorder = rect.left > 0;
236 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000237 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
238 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700239
240 if (topBorder) {
241 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
242 if (leftBorder) {
243 top.left -= 1;
244 }
245 if (rightBorder) {
246 top.right += 1;
247 }
248 expectColor(top, color, tolerance);
249 }
250 if (leftBorder) {
251 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
252 expectColor(left, color, tolerance);
253 }
254 if (rightBorder) {
255 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
256 expectColor(right, color, tolerance);
257 }
258 if (bottomBorder) {
259 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
260 if (leftBorder) {
261 bottom.left -= 1;
262 }
263 if (rightBorder) {
264 bottom.right += 1;
265 }
266 expectColor(bottom, color, tolerance);
267 }
268 }
269
Chia-I Wu93853fe2017-11-02 08:30:27 -0700270 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
271 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
272 uint8_t tolerance = 0) {
273 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
274
275 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
276 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
277 // avoid checking borders due to unspecified filtering behavior
278 const int32_t offsetX = filtered ? 2 : 0;
279 const int32_t offsetY = filtered ? 2 : 0;
280 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
281 tolerance);
282 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
283 tolerance);
284 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
285 tolerance);
286 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
287 bottomRight, tolerance);
288 }
289
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700290 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000291 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
292 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700293 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
294 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700295 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
296 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700297 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700298 }
299 }
300
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700301 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700302
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700303 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700304
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700305 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700306
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800307 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000308 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700309 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700310
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000311 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700312
313private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000314 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800315 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700316};
317
Chia-I Wu718daf82017-10-20 11:57:17 -0700318class LayerTransactionTest : public ::testing::Test {
319protected:
320 void SetUp() override {
321 mClient = new SurfaceComposerClient;
322 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
323
324 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700325
326 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
327 sp<IBinder> binder = sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
Ady Abraham37965d42018-11-01 13:43:32 -0700328 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700329 }
330
chaviw0e3479f2018-09-10 16:49:30 -0700331 virtual void TearDown() {
332 mBlackBgSurface = 0;
333 mClient->dispose();
334 mClient = 0;
335 }
336
Marissa Wallfda30bb2018-10-12 11:34:28 -0700337 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
338 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800339 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
340 auto layer =
341 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700342
Vishnu Nair60356342018-11-13 13:00:45 -0800343 Transaction t;
344 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800345
346 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700347 if (error != NO_ERROR) {
348 ADD_FAILURE() << "failed to initialize SurfaceControl";
349 layer.clear();
350 }
351
352 return layer;
353 }
354
Vishnu Nair88a11f22018-11-28 18:30:57 -0800355 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
356 const char* name, uint32_t width, uint32_t height,
357 PixelFormat format, uint32_t flags,
358 SurfaceControl* parent = nullptr) {
359 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
360 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
361 return layer;
362 }
363
Marissa Wallfda30bb2018-10-12 11:34:28 -0700364 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800365 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
366 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700367 }
368
Marissa Wall61c58622018-07-18 10:12:20 -0700369 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700370 // wait for previous transactions (such as setSize) to complete
371 Transaction().apply(true);
372
373 ANativeWindow_Buffer buffer = {};
374 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
375
376 return buffer;
377 }
378
Marissa Wall61c58622018-07-18 10:12:20 -0700379 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700380 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
381
382 // wait for the newly posted buffer to be latched
383 waitForLayerBuffers();
384 }
385
Marissa Wall61c58622018-07-18 10:12:20 -0700386 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
387 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700388 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700389 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
390 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
391 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700392 }
393
Marissa Wall61c58622018-07-18 10:12:20 -0700394 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
395 int32_t bufferWidth, int32_t bufferHeight) {
396 sp<GraphicBuffer> buffer =
397 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
398 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
399 BufferUsage::COMPOSER_OVERLAY,
400 "test");
401 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700402 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700403 }
404
405 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
406 int32_t bufferWidth, int32_t bufferHeight) {
407 switch (mLayerType) {
408 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
409 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
410 break;
411 case ISurfaceComposerClient::eFXSurfaceBufferState:
412 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
413 break;
414 default:
415 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
416 }
417 }
418
419 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
420 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700421 const Color& topRight, const Color& bottomLeft,
422 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700423 switch (mLayerType) {
424 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
425 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
426 bottomLeft, bottomRight);
427 break;
428 case ISurfaceComposerClient::eFXSurfaceBufferState:
429 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
430 bottomLeft, bottomRight);
431 break;
432 default:
433 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
434 }
435 }
436
437 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
438 int32_t bufferHeight, const Color& topLeft,
439 const Color& topRight, const Color& bottomLeft,
440 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700441 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700442 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
443 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700444
Marissa Wall61c58622018-07-18 10:12:20 -0700445 const int32_t halfW = bufferWidth / 2;
446 const int32_t halfH = bufferHeight / 2;
447 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
448 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
449 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
450 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
451 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700452
Marissa Wall61c58622018-07-18 10:12:20 -0700453 postBufferQueueLayerBuffer(layer);
454 }
455
456 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
457 int32_t bufferHeight, const Color& topLeft,
458 const Color& topRight, const Color& bottomLeft,
459 const Color& bottomRight) {
460 sp<GraphicBuffer> buffer =
461 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
462 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
463 BufferUsage::COMPOSER_OVERLAY,
464 "test");
465
466 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
467
468 const int32_t halfW = bufferWidth / 2;
469 const int32_t halfH = bufferHeight / 2;
470 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
471 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
472 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
473 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
474
475 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700476 }
477
chaviw0e3479f2018-09-10 16:49:30 -0700478 std::unique_ptr<ScreenCapture> screenshot() {
479 std::unique_ptr<ScreenCapture> screenshot;
480 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700481 return screenshot;
482 }
483
Marissa Wall713b63f2018-10-17 15:42:43 -0700484 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
485 static BufferGenerator bufferGenerator;
486 return bufferGenerator.get(outBuffer, outFence);
487 }
488
Chia-I Wu718daf82017-10-20 11:57:17 -0700489 sp<SurfaceComposerClient> mClient;
490
491 sp<IBinder> mDisplay;
492 uint32_t mDisplayWidth;
493 uint32_t mDisplayHeight;
494 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700495 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700496
497 // leave room for ~256 layers
498 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
499
chaviw0e3479f2018-09-10 16:49:30 -0700500 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700501 bool mColorManagementUsed;
502
Chia-I Wu718daf82017-10-20 11:57:17 -0700503private:
504 void SetUpDisplay() {
505 mDisplay = mClient->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
506 ASSERT_NE(nullptr, mDisplay.get()) << "failed to get built-in display";
507
508 // get display width/height
509 DisplayInfo info;
510 SurfaceComposerClient::getDisplayInfo(mDisplay, &info);
511 mDisplayWidth = info.w;
512 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700513 mDisplayRect =
514 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700515
516 // After a new buffer is queued, SurfaceFlinger is notified and will
517 // latch the new buffer on next vsync. Let's heuristically wait for 3
518 // vsyncs.
519 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
520
521 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700522
Vishnu Nair88a11f22018-11-28 18:30:57 -0800523 mBlackBgSurface =
524 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
525 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700526
Chia-I Wu718daf82017-10-20 11:57:17 -0700527 // set layer stack (b/68888219)
528 Transaction t;
529 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800530 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700531 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
532 t.setColor(mBlackBgSurface, half3{0, 0, 0});
533 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700534 t.apply();
535 }
536
chaviw0e3479f2018-09-10 16:49:30 -0700537 void waitForLayerBuffers() {
538 // Request an empty transaction to get applied synchronously to ensure the buffer is
539 // latched.
540 Transaction().apply(true);
541 usleep(mBufferPostDelay);
542 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700543
544 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800545
546 friend class LayerRenderPathTestHarness;
547};
548enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
549
550class LayerRenderPathTestHarness {
551public:
552 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
553 : mDelegate(delegate), mRenderPath(renderPath) {}
554
555 std::unique_ptr<ScreenCapture> getScreenCapture() {
556 switch (mRenderPath) {
557 case RenderPath::SCREENSHOT:
558 return mDelegate->screenshot();
559 case RenderPath::VIRTUAL_DISPLAY:
560
561 sp<IBinder> mainDisplay =
562 SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
563 DisplayInfo mainDisplayInfo;
564 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
565
566 sp<IBinder> vDisplay;
567 sp<IGraphicBufferProducer> producer;
568 sp<IGraphicBufferConsumer> consumer;
569 sp<BufferItemConsumer> itemConsumer;
570 BufferQueue::createBufferQueue(&producer, &consumer);
571
572 consumer->setConsumerName(String8("Virtual disp consumer"));
573 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
574
575 itemConsumer = new BufferItemConsumer(consumer,
576 // Sample usage bits from screenrecord
577 GRALLOC_USAGE_HW_VIDEO_ENCODER |
578 GRALLOC_USAGE_SW_READ_OFTEN);
579
580 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
581 false /*secure*/);
582
583 SurfaceComposerClient::Transaction t;
584 t.setDisplaySurface(vDisplay, producer);
585 t.setDisplayLayerStack(vDisplay, 0);
586 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
587 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
588 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
589 t.apply();
590 SurfaceComposerClient::Transaction().apply(true);
591 BufferItem item;
592 itemConsumer->acquireBuffer(&item, 0, true);
593 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
594 itemConsumer->releaseBuffer(item);
595 SurfaceComposerClient::destroyDisplay(vDisplay);
596 return sc;
597 }
598 }
599
600protected:
601 LayerTransactionTest* mDelegate;
602 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700603};
604
Alec Mouri80863a62019-01-17 15:19:35 -0800605class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700606public:
Alec Mouri80863a62019-01-17 15:19:35 -0800607 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700608
609 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800610 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700611 // if the flags already have a layer type specified, return an error
612 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
613 return nullptr;
614 }
chaviwf66724d2018-11-28 16:35:21 -0800615 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700616 }
617
618 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
619 int32_t bufferHeight) {
620 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
621 bufferWidth, bufferHeight));
622 }
623
624 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
625 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
626 const Color& bottomLeft, const Color& bottomRight) {
627 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
628 bufferWidth, bufferHeight,
629 topLeft, topRight,
630 bottomLeft, bottomRight));
631 }
632
633protected:
634 uint32_t mLayerType;
635};
636
Alec Mouri80863a62019-01-17 15:19:35 -0800637class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
638 public ::testing::WithParamInterface<uint32_t> {
639public:
640 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
641};
642
643class LayerTypeAndRenderTypeTransactionTest
644 : public LayerTypeTransactionHarness,
645 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
646public:
647 LayerTypeAndRenderTypeTransactionTest()
648 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
649 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
650
651 std::unique_ptr<ScreenCapture> getScreenCapture() {
652 return mRenderPathHarness.getScreenCapture();
653 }
654
655protected:
656 LayerRenderPathTestHarness mRenderPathHarness;
657};
658
659// Environment for starting up binder threads. This is required for testing
660// virtual displays, as BufferQueue parameters may be queried over binder.
661class BinderEnvironment : public ::testing::Environment {
662public:
663 void SetUp() override { ProcessState::self()->startThreadPool(); }
664};
665
666::testing::Environment* const binderEnv =
667 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
668
669class LayerRenderTypeTransactionTest : public LayerTransactionTest,
670 public ::testing::WithParamInterface<RenderPath> {
671public:
672 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
673
674 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
675 void setRelativeZBasicHelper(uint32_t layerType);
676 void setRelativeZGroupHelper(uint32_t layerType);
677 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800678 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
679 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800680
681protected:
682 LayerRenderPathTestHarness mHarness;
683};
684
685INSTANTIATE_TEST_CASE_P(
686 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
687 ::testing::Combine(
688 ::testing::Values(
689 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
690 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
691 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
692
693INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
694 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
695
Marissa Wall61c58622018-07-18 10:12:20 -0700696INSTANTIATE_TEST_CASE_P(
697 LayerTypeTransactionTests, LayerTypeTransactionTest,
698 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
699 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
700
Alec Mouri80863a62019-01-17 15:19:35 -0800701TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700702 sp<SurfaceControl> layer;
703 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700704 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700705
706 {
707 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700708 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800709 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700710 shot->expectColor(rect, Color::RED);
711 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700712 }
713
714 Transaction().setPosition(layer, 5, 10).apply();
715 {
716 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700717 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800718 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700719 shot->expectColor(rect, Color::RED);
720 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700721 }
722}
723
Alec Mouri80863a62019-01-17 15:19:35 -0800724TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700725 sp<SurfaceControl> layer;
726 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700727 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700728
729 // GLES requires only 4 bits of subpixel precision during rasterization
730 // XXX GLES composition does not match HWC composition due to precision
731 // loss (b/69315223)
732 const float epsilon = 1.0f / 16.0f;
733 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
734 {
735 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800736 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700737 }
738
739 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
740 {
741 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800742 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700743 }
744}
745
Alec Mouri80863a62019-01-17 15:19:35 -0800746TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700747 sp<SurfaceControl> layer;
748 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700749 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700750
751 Transaction().setPosition(layer, -32, -32).apply();
752 {
753 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800754 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700755 }
756
757 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
758 {
759 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762}
763
Alec Mouri80863a62019-01-17 15:19:35 -0800764TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700765 sp<SurfaceControl> layer;
766 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700767 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700768
769 // partially out of bounds
770 Transaction().setPosition(layer, -30, -30).apply();
771 {
772 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800773 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700774 }
775
776 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
777 {
778 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800779 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
780 mDisplayHeight),
781 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700782 }
783}
784
Alec Mouri80863a62019-01-17 15:19:35 -0800785TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700786 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700787 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
788 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700789
790 // setPosition is applied immediately by default, with or without resize
791 // pending
792 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
793 {
794 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800795 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700796 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700797 shot->expectColor(rect, Color::RED);
798 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700799 }
800
Marissa Wall861616d2018-10-22 12:52:23 -0700801 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 {
803 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800804 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700805 }
806}
807
Alec Mouri80863a62019-01-17 15:19:35 -0800808TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700809 sp<SurfaceControl> layer;
810 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700811 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700812
813 // request setPosition to be applied with the next resize
814 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
815 {
816 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800817 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700818 }
819
820 Transaction().setPosition(layer, 15, 20).apply();
821 {
822 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800823 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700824 }
825
826 Transaction().setSize(layer, 64, 64).apply();
827 {
828 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800829 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700830 }
831
832 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700833 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 {
835 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800836 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700837 }
838}
839
Alec Mouri80863a62019-01-17 15:19:35 -0800840TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700841 sp<SurfaceControl> layer;
842 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700843 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700844
845 // setPosition is not immediate even with SCALE_TO_WINDOW override
846 Transaction()
847 .setPosition(layer, 5, 10)
848 .setSize(layer, 64, 64)
849 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
850 .setGeometryAppliesWithResize(layer)
851 .apply();
852 {
853 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800854 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 }
856
Marissa Wall61c58622018-07-18 10:12:20 -0700857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 {
859 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862}
863
Alec Mouri80863a62019-01-17 15:19:35 -0800864TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700865 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700866 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700868
869 Transaction().setSize(layer, 64, 64).apply();
870 {
871 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800872 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700873 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700874 shot->expectColor(rect, Color::RED);
875 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700876 }
877
Marissa Wall861616d2018-10-22 12:52:23 -0700878 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700879 {
880 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800881 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700882 const Rect rect(0, 0, 64, 64);
883 shot->expectColor(rect, Color::RED);
884 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700885 }
886}
887
Alec Mouri80863a62019-01-17 15:19:35 -0800888TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 // cannot test robustness against invalid sizes (zero or really huge)
890}
891
Alec Mouri80863a62019-01-17 15:19:35 -0800892TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700893 sp<SurfaceControl> layer;
894 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700895 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700896
897 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
898 Transaction()
899 .setSize(layer, 64, 64)
900 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
901 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800902 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903}
904
Alec Mouri80863a62019-01-17 15:19:35 -0800905TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700906 sp<SurfaceControl> layerR;
907 sp<SurfaceControl> layerG;
908 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700909 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700910 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700911 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700912
913 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
914 {
915 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800916 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700917 }
918
919 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
920 {
921 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800922 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700923 }
924}
925
Alec Mouri80863a62019-01-17 15:19:35 -0800926TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700927 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800928 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700929 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800930 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700931 sp<SurfaceControl> layerR;
932 sp<SurfaceControl> layerG;
933 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700934 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700935 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700936 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700937
chaviw0e3479f2018-09-10 16:49:30 -0700938 Transaction()
939 .reparent(layerR, parent->getHandle())
940 .reparent(layerG, parent->getHandle())
941 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700942 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
943 {
944 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800945 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700946 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 }
948
949 Transaction().setLayer(layerR, -3).apply();
950 {
951 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800952 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700953 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700954 }
955}
956
Alec Mouri80863a62019-01-17 15:19:35 -0800957void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700958 sp<SurfaceControl> layerR;
959 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700960 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
961 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
962 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
963 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700964
Marissa Wall861616d2018-10-22 12:52:23 -0700965 switch (layerType) {
966 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
967 Transaction()
968 .setPosition(layerG, 16, 16)
969 .setRelativeLayer(layerG, layerR->getHandle(), 1)
970 .apply();
971 break;
972 case ISurfaceComposerClient::eFXSurfaceBufferState:
973 Transaction()
974 .setFrame(layerR, Rect(0, 0, 32, 32))
975 .setFrame(layerG, Rect(16, 16, 48, 48))
976 .setRelativeLayer(layerG, layerR->getHandle(), 1)
977 .apply();
978 break;
979 default:
980 ASSERT_FALSE(true) << "Unsupported layer type";
981 }
Chia-I Wu49313302017-10-31 10:14:40 -0700982 {
983 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800984 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700985 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
986 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
987 }
988
989 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
990 {
991 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800992 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700993 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
994 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
995 }
996}
997
Alec Mouri80863a62019-01-17 15:19:35 -0800998TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700999 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1000}
1001
Alec Mouri80863a62019-01-17 15:19:35 -08001002TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001003 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1004}
1005
Marissa Wall61c58622018-07-18 10:12:20 -07001006TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001007 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001008 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001009 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001010 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001011 sp<SurfaceControl> layerR;
1012 sp<SurfaceControl> layerG;
1013 sp<SurfaceControl> layerB;
1014 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001015 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001016 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001017 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001018 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001019 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001020
chaviw0e3479f2018-09-10 16:49:30 -07001021 Transaction()
1022 .reparent(layerB, parent->getHandle())
1023 .apply();
1024
Chia-I Wuec2d9852017-11-21 09:21:01 -08001025 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1026 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1027
chaviw0e3479f2018-09-10 16:49:30 -07001028 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001030 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001031 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001032 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1033}
1034
Alec Mouri80863a62019-01-17 15:19:35 -08001035void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001036 sp<SurfaceControl> layerR;
1037 sp<SurfaceControl> layerG;
1038 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001039 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1040 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1041 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1042 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1043 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1044 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001045
1046 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001047 switch (layerType) {
1048 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1049 Transaction()
1050 .setPosition(layerG, 8, 8)
1051 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1052 .setPosition(layerB, 16, 16)
1053 .setLayer(layerB, mLayerZBase + 2)
1054 .apply();
1055 break;
1056 case ISurfaceComposerClient::eFXSurfaceBufferState:
1057 Transaction()
1058 .setFrame(layerR, Rect(0, 0, 32, 32))
1059 .setFrame(layerG, Rect(8, 8, 40, 40))
1060 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1061 .setFrame(layerB, Rect(16, 16, 48, 48))
1062 .setLayer(layerB, mLayerZBase + 2)
1063 .apply();
1064 break;
1065 default:
1066 ASSERT_FALSE(true) << "Unsupported layer type";
1067 }
1068
Chia-I Wu49313302017-10-31 10:14:40 -07001069 {
1070 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001071 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001072 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1073 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1074 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1075 }
1076
1077 // layerR = 4, layerG = layerR + 3, layerB = 2
1078 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1079 {
1080 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001081 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001082 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1083 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1084 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1085 }
1086
1087 // layerR = 4, layerG = layerR - 3, layerB = 2
1088 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1089 {
1090 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001091 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001092 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1093 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1094 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1095 }
1096
1097 // restore to absolute z
1098 // layerR = 4, layerG = 0, layerB = 2
1099 Transaction().setLayer(layerG, mLayerZBase).apply();
1100 {
1101 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001102 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001103 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1104 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1105 }
1106
1107 // layerR should not affect layerG anymore
1108 // layerR = 1, layerG = 0, layerB = 2
1109 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1110 {
1111 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001112 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001113 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1114 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1115 }
1116}
1117
Alec Mouri80863a62019-01-17 15:19:35 -08001118TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001119 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1120}
1121
Alec Mouri80863a62019-01-17 15:19:35 -08001122TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001123 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1124}
1125
Alec Mouri80863a62019-01-17 15:19:35 -08001126TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001127 sp<SurfaceControl> layerR;
1128 sp<SurfaceControl> layerG;
1129
1130 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001131 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001132 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001133 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001134
1135 Transaction()
1136 .setPosition(layerG, 16, 16)
1137 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1138 .apply();
1139
Robert Carr6fb1a7e2018-12-11 12:07:25 -08001140 layerG->clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001141 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001142 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001143}
1144
Alec Mouri80863a62019-01-17 15:19:35 -08001145TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001146 sp<SurfaceControl> layer;
1147 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001148 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001149
1150 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1151 {
1152 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001153 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001154 }
1155
1156 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1157 {
1158 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001159 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001160 }
1161}
1162
Alec Mouri80863a62019-01-17 15:19:35 -08001163TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001164 const Color translucentRed = {100, 0, 0, 100};
1165 sp<SurfaceControl> layerR;
1166 sp<SurfaceControl> layerG;
1167 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001168 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001169 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001170 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001171
1172 Transaction()
1173 .setLayer(layerR, mLayerZBase + 1)
1174 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1175 .apply();
1176 {
1177 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001178 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001179 }
1180
1181 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1182 {
1183 SCOPED_TRACE("layerR translucent");
1184 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001185 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001186 }
1187}
1188
Marissa Wall61c58622018-07-18 10:12:20 -07001189TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001190 sp<SurfaceControl> layer;
1191 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001192 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001193
1194 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001195 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001196 Transaction()
1197 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1198 .apply(true);
1199 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001200 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001201
1202 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1203 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001204 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001205}
1206
Alec Mouri80863a62019-01-17 15:19:35 -08001207TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001208 const Rect top(0, 0, 32, 16);
1209 const Rect bottom(0, 16, 32, 32);
1210 sp<SurfaceControl> layer;
1211 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1212
1213 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001214 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1215 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1216 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001217 // setTransparentRegionHint always applies to the following buffer
1218 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001219 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001220 {
1221 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001222 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001223 shot->expectColor(top, Color::BLACK);
1224 shot->expectColor(bottom, Color::RED);
1225 }
1226
1227 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1228 {
1229 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001230 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001231 shot->expectColor(top, Color::BLACK);
1232 shot->expectColor(bottom, Color::RED);
1233 }
1234
Marissa Wall61c58622018-07-18 10:12:20 -07001235 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1236 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1237 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1238 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001239 {
1240 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001241 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001242 shot->expectColor(top, Color::RED);
1243 shot->expectColor(bottom, Color::BLACK);
1244 }
1245}
1246
Alec Mouri80863a62019-01-17 15:19:35 -08001247TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001248 const Rect top(0, 0, 32, 16);
1249 const Rect bottom(0, 16, 32, 32);
1250 sp<SurfaceControl> layer;
1251 ASSERT_NO_FATAL_FAILURE(
1252 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1253
1254 sp<GraphicBuffer> buffer =
1255 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1256 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1257 BufferUsage::COMPOSER_OVERLAY,
1258 "test");
1259
1260 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1261 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1262 Transaction()
1263 .setTransparentRegionHint(layer, Region(top))
1264 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001265 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001266 .apply();
1267 {
1268 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001269 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001270 shot->expectColor(top, Color::BLACK);
1271 shot->expectColor(bottom, Color::RED);
1272 }
1273
1274 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1275 {
1276 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001277 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001278 shot->expectColor(top, Color::BLACK);
1279 shot->expectColor(bottom, Color::BLACK);
1280 }
1281
1282 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1283 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1284 BufferUsage::COMPOSER_OVERLAY,
1285 "test");
1286
1287 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1288 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001289 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001290 {
1291 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001292 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001293 shot->expectColor(top, Color::RED);
1294 shot->expectColor(bottom, Color::BLACK);
1295 }
1296}
1297
Alec Mouri80863a62019-01-17 15:19:35 -08001298TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001299 sp<SurfaceControl> layerTransparent;
1300 sp<SurfaceControl> layerR;
1301 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1302 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1303
1304 // check that transparent region hint is bound by the layer size
1305 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001306 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001307 .setPosition(layerR, 16, 16)
1308 .setLayer(layerR, mLayerZBase + 1)
1309 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001310 ASSERT_NO_FATAL_FAILURE(
1311 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1312 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001313 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001314}
1315
Alec Mouri80863a62019-01-17 15:19:35 -08001316TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001317 sp<SurfaceControl> layerTransparent;
1318 sp<SurfaceControl> layerR;
1319 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1320 ASSERT_NO_FATAL_FAILURE(
1321 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1322
1323 // check that transparent region hint is bound by the layer size
1324 Transaction()
1325 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1326 .setFrame(layerR, Rect(16, 16, 48, 48))
1327 .setLayer(layerR, mLayerZBase + 1)
1328 .apply();
1329 ASSERT_NO_FATAL_FAILURE(
1330 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1331 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001332 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001333}
1334
Alec Mouri80863a62019-01-17 15:19:35 -08001335void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001336 sp<SurfaceControl> layer1;
1337 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001338 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1339 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1340 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1341 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001342
Marissa Wall861616d2018-10-22 12:52:23 -07001343 switch (layerType) {
1344 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1345 Transaction()
1346 .setAlpha(layer1, 0.25f)
1347 .setAlpha(layer2, 0.75f)
1348 .setPosition(layer2, 16, 0)
1349 .setLayer(layer2, mLayerZBase + 1)
1350 .apply();
1351 break;
1352 case ISurfaceComposerClient::eFXSurfaceBufferState:
1353 Transaction()
1354 .setAlpha(layer1, 0.25f)
1355 .setAlpha(layer2, 0.75f)
1356 .setFrame(layer1, Rect(0, 0, 32, 32))
1357 .setFrame(layer2, Rect(16, 0, 48, 32))
1358 .setLayer(layer2, mLayerZBase + 1)
1359 .apply();
1360 break;
1361 default:
1362 ASSERT_FALSE(true) << "Unsupported layer type";
1363 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001364 {
Alec Mouri80863a62019-01-17 15:19:35 -08001365 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001366 uint8_t r = 16; // 64 * 0.25f
1367 uint8_t g = 48; // 64 * 0.75f
1368 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1369 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1370
1371 r /= 4; // r * (1.0f - 0.75f)
1372 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1373 }
1374}
1375
Alec Mouri80863a62019-01-17 15:19:35 -08001376TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001377 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1378}
1379
Alec Mouri80863a62019-01-17 15:19:35 -08001380TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001381 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1382}
1383
Alec Mouri80863a62019-01-17 15:19:35 -08001384TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001385 const Color color = {64, 0, 0, 255};
1386 sp<SurfaceControl> layer;
1387 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001388 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001389
1390 Transaction().setAlpha(layer, 2.0f).apply();
1391 {
1392 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001393 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001394 }
1395
1396 Transaction().setAlpha(layer, -1.0f).apply();
1397 {
1398 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001399 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001400 }
1401}
1402
Alec Mouri80863a62019-01-17 15:19:35 -08001403TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001404 sp<SurfaceControl> layer;
1405 const uint8_t size = 64;
1406 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001407 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001408 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1409 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1410
1411 Transaction()
1412 .setCornerRadius(layer, cornerRadius)
1413 .apply();
1414 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001415 const uint8_t bottom = size - 1;
1416 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001417 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001418 // Transparent corners
1419 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001420 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1421 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1422 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1423 }
1424}
1425
Alec Mouri80863a62019-01-17 15:19:35 -08001426TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001427 sp<SurfaceControl> parent;
1428 sp<SurfaceControl> child;
1429 const uint8_t size = 64;
1430 const uint8_t testArea = 4;
1431 const float cornerRadius = 20.0f;
1432 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1433 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1434 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1435 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1436
1437 Transaction()
1438 .setCornerRadius(parent, cornerRadius)
1439 .reparent(child, parent->getHandle())
1440 .setPosition(child, 0, size / 2)
1441 .apply();
1442 {
1443 const uint8_t bottom = size - 1;
1444 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001445 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001446 // Top edge of child should not have rounded corners because it's translated in the parent
1447 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1448 Color::GREEN);
1449 // But bottom edges should have been clipped according to parent bounds
1450 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1451 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001452 }
1453}
1454
Alec Mouri80863a62019-01-17 15:19:35 -08001455TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001456 sp<SurfaceControl> bufferLayer;
1457 sp<SurfaceControl> colorLayer;
1458 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001459 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001460 ASSERT_NO_FATAL_FAILURE(colorLayer =
1461 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1462 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001463
Vishnu Nair88a11f22018-11-28 18:30:57 -08001464 Transaction()
1465 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1466 .setLayer(colorLayer, mLayerZBase + 1)
1467 .apply();
1468
Chia-I Wue4ef6102017-11-01 15:16:35 -07001469 {
1470 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001471 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001472 }
1473
1474 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1475 const Color expected = {15, 51, 85, 255};
1476 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1477 // channel) should be less than one
1478 const uint8_t tolerance = 1;
1479 Transaction().setColor(colorLayer, color).apply();
1480 {
1481 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001482 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001483 }
1484}
1485
Valerie Haudd0b7572019-01-29 14:59:27 -08001486// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1487// BLUE: prior background color
1488// GREEN: final background color
1489// BLACK: no color or fill
1490void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1491 bool bufferFill, float alpha,
1492 Color finalColor) {
1493 sp<SurfaceControl> layer;
1494 int32_t width = 500;
1495 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001496
Valerie Haudd0b7572019-01-29 14:59:27 -08001497 Color fillColor = Color::RED;
1498 Color priorBgColor = Color::BLUE;
1499 Color expectedColor = Color::BLACK;
1500 switch (layerType) {
1501 case ISurfaceComposerClient::eFXSurfaceColor:
1502 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1503 Transaction()
1504 .setCrop_legacy(layer, Rect(0, 0, width, height))
1505 .setColor(layer, half3(1.0f, 0, 0))
1506 .apply();
1507 expectedColor = fillColor;
1508 break;
1509 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1510 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1511 if (bufferFill) {
1512 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1513 expectedColor = fillColor;
1514 }
1515 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1516 break;
1517 case ISurfaceComposerClient::eFXSurfaceBufferState:
1518 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1519 if (bufferFill) {
1520 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1521 expectedColor = fillColor;
1522 }
1523 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1524 break;
1525 default:
1526 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1527 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001528 }
1529
Valerie Haudd0b7572019-01-29 14:59:27 -08001530 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1531 Transaction()
1532 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1533 .apply();
1534 if (!bufferFill) {
1535 expectedColor = priorBgColor;
1536 }
1537 }
1538
1539 {
1540 SCOPED_TRACE("default before setting background color layer");
1541 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1542 }
Valerie Haua72e2812019-01-23 13:40:39 -08001543 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001544 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001545 .apply();
1546
1547 {
Valerie Haua72e2812019-01-23 13:40:39 -08001548 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001549 shot->expectColor(Rect(0, 0, width, height), finalColor);
1550 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001551 }
1552}
1553
Valerie Haudd0b7572019-01-29 14:59:27 -08001554TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1555 bool priorColor = false;
1556 bool bufferFill = false;
1557 float alpha = 1.0f;
1558 Color finalColor = Color::RED;
1559 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1560 priorColor, bufferFill, alpha, finalColor));
1561}
Valerie Haua72e2812019-01-23 13:40:39 -08001562
Valerie Haudd0b7572019-01-29 14:59:27 -08001563TEST_P(LayerRenderTypeTransactionTest,
1564 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1565 bool priorColor = false;
1566 bool bufferFill = true;
1567 float alpha = 1.0f;
1568 Color finalColor = Color::RED;
1569 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1570 priorColor, bufferFill, alpha, finalColor));
1571}
Valerie Haua72e2812019-01-23 13:40:39 -08001572
Valerie Haudd0b7572019-01-29 14:59:27 -08001573TEST_P(LayerRenderTypeTransactionTest,
1574 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1575 bool priorColor = false;
1576 bool bufferFill = false;
1577 float alpha = 1.0f;
1578 Color finalColor = Color::GREEN;
1579 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1580 priorColor, bufferFill, alpha, finalColor));
1581}
Valerie Haua72e2812019-01-23 13:40:39 -08001582
Valerie Haudd0b7572019-01-29 14:59:27 -08001583TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1584 bool priorColor = true;
1585 bool bufferFill = true;
1586 float alpha = 1.0f;
1587 Color finalColor = Color::RED;
1588 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1589 priorColor, bufferFill, alpha, finalColor));
1590}
1591
1592TEST_P(LayerRenderTypeTransactionTest,
1593 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1594 bool priorColor = true;
1595 bool bufferFill = false;
1596 float alpha = 1.0f;
1597 Color finalColor = Color::GREEN;
1598 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1599 priorColor, bufferFill, alpha, finalColor));
1600}
1601TEST_P(LayerRenderTypeTransactionTest,
1602 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1603 bool priorColor = false;
1604 bool bufferFill = false;
1605 float alpha = 0;
1606 Color finalColor = Color::BLACK;
1607 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1608 priorColor, bufferFill, alpha, finalColor));
1609}
1610
1611TEST_P(LayerRenderTypeTransactionTest,
1612 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1613 bool priorColor = true;
1614 bool bufferFill = false;
1615 float alpha = 0;
1616 Color finalColor = Color::BLACK;
1617 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1618 priorColor, bufferFill, alpha, finalColor));
1619}
1620
1621TEST_P(LayerRenderTypeTransactionTest,
1622 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1623 bool priorColor = false;
1624 bool bufferFill = true;
1625 float alpha = 1.0f;
1626 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001627 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001628 priorColor, bufferFill, alpha, finalColor));
1629}
1630
1631TEST_P(LayerRenderTypeTransactionTest,
1632 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1633 bool priorColor = false;
1634 bool bufferFill = false;
1635 float alpha = 1.0f;
1636 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001637 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001638 priorColor, bufferFill, alpha, finalColor));
1639}
1640
1641TEST_P(LayerRenderTypeTransactionTest,
1642 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1643 bool priorColor = true;
1644 bool bufferFill = false;
1645 float alpha = 1.0f;
1646 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001647 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001648 priorColor, bufferFill, alpha, finalColor));
1649}
1650
1651TEST_P(LayerRenderTypeTransactionTest,
1652 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1653 bool priorColor = false;
1654 bool bufferFill = false;
1655 float alpha = 0;
1656 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001657 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001658 priorColor, bufferFill, alpha, finalColor));
1659}
1660
1661TEST_P(LayerRenderTypeTransactionTest,
1662 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1663 bool priorColor = true;
1664 bool bufferFill = false;
1665 float alpha = 0;
1666 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001667 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001668 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001669}
1670
Alec Mouri80863a62019-01-17 15:19:35 -08001671TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001672 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001673 ASSERT_NO_FATAL_FAILURE(colorLayer =
1674 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1675 ISurfaceComposerClient::eFXSurfaceColor));
1676 Transaction()
1677 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1678 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1679 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001680
Alec Mouri80863a62019-01-17 15:19:35 -08001681 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001682}
1683
Alec Mouri80863a62019-01-17 15:19:35 -08001684TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001685 sp<SurfaceControl> bufferLayer;
1686 sp<SurfaceControl> colorLayer;
1687 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001688 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001689 ASSERT_NO_FATAL_FAILURE(colorLayer =
1690 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1691 ISurfaceComposerClient::eFXSurfaceColor));
1692 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001693
1694 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1695 const float alpha = 0.25f;
1696 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1697 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1698 // channel) should be less than one
1699 const uint8_t tolerance = 1;
1700 Transaction()
1701 .setColor(colorLayer, color)
1702 .setAlpha(colorLayer, alpha)
1703 .setLayer(colorLayer, mLayerZBase + 1)
1704 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001705 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1706 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001707}
1708
Alec Mouri80863a62019-01-17 15:19:35 -08001709TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001710 sp<SurfaceControl> bufferLayer;
1711 sp<SurfaceControl> parentLayer;
1712 sp<SurfaceControl> colorLayer;
1713 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1714 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001715 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001716 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1717 0 /* buffer height */,
1718 ISurfaceComposerClient::eFXSurfaceColor));
1719 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001720 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1721 const float alpha = 0.25f;
1722 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1723 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1724 // channel) should be less than one
1725 const uint8_t tolerance = 1;
1726 Transaction()
1727 .reparent(colorLayer, parentLayer->getHandle())
1728 .setColor(colorLayer, color)
1729 .setAlpha(parentLayer, alpha)
1730 .setLayer(parentLayer, mLayerZBase + 1)
1731 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001732 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1733 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001734}
1735
Alec Mouri80863a62019-01-17 15:19:35 -08001736TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001737 sp<SurfaceControl> bufferLayer;
1738 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001739 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001740
1741 // color is ignored
1742 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001743 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001744}
1745
Alec Mouri80863a62019-01-17 15:19:35 -08001746TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001747 sp<SurfaceControl> layer;
1748 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001749 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001750
1751 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1752 {
1753 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001754 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001755 }
1756
1757 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1758 {
1759 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001760 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001761 }
1762}
1763
Alec Mouri80863a62019-01-17 15:19:35 -08001764TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001765 sp<SurfaceControl> layer;
1766 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001767 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1768 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001769
1770 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1771 {
1772 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001773 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1774 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001775 }
1776
1777 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1778 {
1779 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001780 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1781 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001782 }
1783
1784 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1785 {
1786 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001787 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1788 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001789 }
1790
1791 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1792 {
1793 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001794 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1795 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001796 }
1797
1798 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1799 {
1800 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001801 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1802 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001803 }
1804}
1805
Alec Mouri80863a62019-01-17 15:19:35 -08001806TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001807 sp<SurfaceControl> layer;
1808 ASSERT_NO_FATAL_FAILURE(
1809 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1810 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1811 Color::BLUE, Color::WHITE));
1812
1813 Transaction()
1814 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1815 .setFrame(layer, Rect(0, 0, 32, 32))
1816 .apply();
1817 {
1818 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001819 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1820 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001821 }
1822
1823 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1824 {
1825 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001826 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1827 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001828 }
1829
1830 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1831 {
1832 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001833 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1834 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001835 }
1836
1837 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1838 {
1839 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001840 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1841 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001842 }
1843
1844 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1845 {
1846 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001847 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1848 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001849 }
1850}
1851
Alec Mouri80863a62019-01-17 15:19:35 -08001852TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001853 sp<SurfaceControl> layer;
1854 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001855 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1856 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001857
1858 const float rot = M_SQRT1_2; // 45 degrees
1859 const float trans = M_SQRT2 * 16.0f;
1860 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1861
Alec Mouri80863a62019-01-17 15:19:35 -08001862 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001863 // check a 8x8 region inside each color
1864 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1865 const int32_t halfL = 4;
1866 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1867 };
1868 const int32_t unit = int32_t(trans / 2);
1869 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1870 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1871 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1872 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1873}
1874
Alec Mouri80863a62019-01-17 15:19:35 -08001875TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001876 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001877 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1878 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001879
1880 // setMatrix is applied after any pending resize, unlike setPosition
1881 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1882 {
1883 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001884 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001885 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001886 shot->expectColor(rect, Color::RED);
1887 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001888 }
1889
Marissa Wall861616d2018-10-22 12:52:23 -07001890 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001891 {
1892 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001893 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001894 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001895 }
1896}
1897
Alec Mouri80863a62019-01-17 15:19:35 -08001898TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001899 sp<SurfaceControl> layer;
1900 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001901 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001902
1903 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1904 Transaction()
1905 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1906 .setSize(layer, 64, 64)
1907 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1908 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001909 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001910}
1911
Alec Mouri80863a62019-01-17 15:19:35 -08001912TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001913 sp<SurfaceControl> layer;
1914 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001915 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1916 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001917
1918 // XXX SCALE_CROP is not respected; calling setSize and
1919 // setOverrideScalingMode in separate transactions does not work
1920 // (b/69315456)
1921 Transaction()
1922 .setSize(layer, 64, 16)
1923 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1924 .apply();
1925 {
1926 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001927 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1928 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001929 }
1930}
1931
Dan Stoza000dd012018-08-01 13:31:52 -07001932TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1933 sp<SurfaceControl> layer;
1934 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1935
1936 sp<IBinder> handle = layer->getHandle();
1937 ASSERT_TRUE(handle != nullptr);
1938
1939 FrameStats frameStats;
1940 mClient->getLayerFrameStats(handle, &frameStats);
1941
1942 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1943}
1944
Alec Mouri80863a62019-01-17 15:19:35 -08001945TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001946 sp<SurfaceControl> layer;
1947 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001948 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001949 const Rect crop(8, 8, 24, 24);
1950
Marissa Wallf58c14b2018-07-24 10:50:43 -07001951 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001952 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001953 shot->expectColor(crop, Color::RED);
1954 shot->expectBorder(crop, Color::BLACK);
1955}
1956
Alec Mouri80863a62019-01-17 15:19:35 -08001957TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001958 sp<SurfaceControl> layer;
1959 ASSERT_NO_FATAL_FAILURE(
1960 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1961 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1962 const Rect crop(8, 8, 24, 24);
1963
1964 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001965 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001966 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1967 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001968}
1969
Alec Mouri80863a62019-01-17 15:19:35 -08001970TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001971 sp<SurfaceControl> layer;
1972 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001973 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001974
1975 {
1976 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001977 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001978 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001979 }
1980
1981 {
1982 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001983 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001984 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001985 }
1986}
1987
Alec Mouri80863a62019-01-17 15:19:35 -08001988TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001989 sp<SurfaceControl> layer;
1990 ASSERT_NO_FATAL_FAILURE(
1991 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1992 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1993
1994 {
1995 SCOPED_TRACE("empty rect");
1996 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001997 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001998 }
1999
2000 {
2001 SCOPED_TRACE("negative rect");
2002 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002003 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002004 }
2005}
2006
Alec Mouri80863a62019-01-17 15:19:35 -08002007TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002008 sp<SurfaceControl> layer;
2009 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002010 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002011
Marissa Wallf58c14b2018-07-24 10:50:43 -07002012 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002013 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002014 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2015 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2016}
2017
Alec Mouri80863a62019-01-17 15:19:35 -08002018TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002019 sp<SurfaceControl> layer;
2020 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2021 ISurfaceComposerClient::eFXSurfaceBufferState));
2022 sp<GraphicBuffer> buffer =
2023 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2024 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2025 BufferUsage::COMPOSER_OVERLAY,
2026 "test");
2027 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2028 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2029 Color::RED);
2030
2031 Transaction().setBuffer(layer, buffer).apply();
2032
2033 // Partially out of bounds in the negative (upper left) direction
2034 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2035 {
2036 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002037 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002038 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2039 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2040 }
2041
2042 // Partially out of bounds in the positive (lower right) direction
2043 Transaction()
2044 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2045 .apply();
2046 {
2047 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002048 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002049 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2050 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2051 }
2052
2053 // Fully out of buffer space bounds
2054 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2055 {
2056 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002057 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002058 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2059 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2060 Color::RED);
2061 }
2062}
2063
Alec Mouri80863a62019-01-17 15:19:35 -08002064TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002065 sp<SurfaceControl> layer;
2066 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002067 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002068
2069 const Point position(32, 32);
2070 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002071 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002072 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002073 shot->expectColor(crop + position, Color::RED);
2074 shot->expectBorder(crop + position, Color::BLACK);
2075}
2076
Alec Mouri80863a62019-01-17 15:19:35 -08002077TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002078 sp<SurfaceControl> layer;
2079 ASSERT_NO_FATAL_FAILURE(
2080 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2081 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2082
Marissa Wall861616d2018-10-22 12:52:23 -07002083 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002084 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002085 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002086 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002087 shot->expectColor(frame, Color::RED);
2088 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002089}
2090
Alec Mouri80863a62019-01-17 15:19:35 -08002091TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002092 sp<SurfaceControl> layer;
2093 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002094 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002095
Marissa Wall861616d2018-10-22 12:52:23 -07002096 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002097 Transaction()
2098 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002099 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002100 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002101 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002102 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2103 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2104}
2105
Alec Mouri80863a62019-01-17 15:19:35 -08002106TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002107 sp<SurfaceControl> layer;
2108 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002109 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002110
Marissa Wallf58c14b2018-07-24 10:50:43 -07002111 // setCrop_legacy is applied immediately by default, with or without resize pending
2112 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002113 {
2114 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002115 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002116 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2117 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2118 }
2119
Marissa Wall61c58622018-07-18 10:12:20 -07002120 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002121 {
2122 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002123 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002124 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2125 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2126 }
2127}
2128
Alec Mouri80863a62019-01-17 15:19:35 -08002129TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002130 sp<SurfaceControl> layer;
2131 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002132 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002133
Marissa Wallf58c14b2018-07-24 10:50:43 -07002134 // request setCrop_legacy to be applied with the next resize
2135 Transaction()
2136 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2137 .setGeometryAppliesWithResize(layer)
2138 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002139 {
2140 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002141 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002142 }
2143
Marissa Wallf58c14b2018-07-24 10:50:43 -07002144 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002145 {
2146 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002147 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002148 }
2149
2150 Transaction().setSize(layer, 16, 16).apply();
2151 {
2152 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002153 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002154 }
2155
2156 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002157 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002158 {
2159 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002160 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002161 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2162 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2163 }
2164}
2165
Alec Mouri80863a62019-01-17 15:19:35 -08002166TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002167 sp<SurfaceControl> layer;
2168 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002169 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002170
Marissa Wallf58c14b2018-07-24 10:50:43 -07002171 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002172 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002173 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002174 .setSize(layer, 16, 16)
2175 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2176 .setGeometryAppliesWithResize(layer)
2177 .apply();
2178 {
2179 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002180 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002181 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2182 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2183 }
2184
2185 // XXX crop is never latched without other geometry change (b/69315677)
2186 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002187 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002188 Transaction().setPosition(layer, 0, 0).apply();
2189 {
2190 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002191 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002192 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2193 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2194 }
2195}
2196
Alec Mouri80863a62019-01-17 15:19:35 -08002197TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002198 sp<SurfaceControl> layer;
2199 ASSERT_NO_FATAL_FAILURE(
2200 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2201 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2202 const Rect frame(8, 8, 24, 24);
2203
2204 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002205 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002206 shot->expectColor(frame, Color::RED);
2207 shot->expectBorder(frame, Color::BLACK);
2208}
2209
Alec Mouri80863a62019-01-17 15:19:35 -08002210TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002211 sp<SurfaceControl> layer;
2212 ASSERT_NO_FATAL_FAILURE(
2213 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2214 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2215
Marissa Wall61c58622018-07-18 10:12:20 -07002216 {
Marissa Wall861616d2018-10-22 12:52:23 -07002217 SCOPED_TRACE("empty rect");
2218 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002219 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002220 }
2221
Marissa Wall61c58622018-07-18 10:12:20 -07002222 {
Marissa Wall861616d2018-10-22 12:52:23 -07002223 SCOPED_TRACE("negative rect");
2224 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002225 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002226 }
2227}
2228
Alec Mouri80863a62019-01-17 15:19:35 -08002229TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002230 sp<SurfaceControl> layer;
2231 ASSERT_NO_FATAL_FAILURE(
2232 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2233 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2234
2235 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002236 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002237 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2238 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2239}
2240
Alec Mouri80863a62019-01-17 15:19:35 -08002241TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002242 sp<SurfaceControl> parent, child;
2243 ASSERT_NO_FATAL_FAILURE(
2244 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2245 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2246 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2247
2248 ASSERT_NO_FATAL_FAILURE(
2249 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2250 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2251
2252 Transaction().reparent(child, parent->getHandle()).apply();
2253
2254 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002255 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002256 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2257 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2258}
2259
Alec Mouri80863a62019-01-17 15:19:35 -08002260TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002261 sp<SurfaceControl> parent, child;
2262 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2263 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2264
2265 ASSERT_NO_FATAL_FAILURE(
2266 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2267 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2268
2269 Transaction().reparent(child, parent->getHandle()).apply();
2270
2271 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002272 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002273 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2274 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2275}
2276
Alec Mouri80863a62019-01-17 15:19:35 -08002277TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002278 sp<SurfaceControl> layer;
2279 ASSERT_NO_FATAL_FAILURE(
2280 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2281 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2282 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2283
2284 std::this_thread::sleep_for(500ms);
2285
2286 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2287
Alec Mouri80863a62019-01-17 15:19:35 -08002288 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002289 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2290 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2291}
2292
Alec Mouri80863a62019-01-17 15:19:35 -08002293TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002294 sp<SurfaceControl> parent, child;
2295 ASSERT_NO_FATAL_FAILURE(
2296 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2297 ASSERT_NO_FATAL_FAILURE(
2298 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2299 Transaction().reparent(child, parent->getHandle()).apply();
2300
2301 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2302 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2303
2304 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2305 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2306
Alec Mouri80863a62019-01-17 15:19:35 -08002307 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002308 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2309 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2310 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2311}
2312
Alec Mouri80863a62019-01-17 15:19:35 -08002313TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002314 sp<SurfaceControl> layer;
2315 ASSERT_NO_FATAL_FAILURE(
2316 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2317
2318 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2319
Alec Mouri80863a62019-01-17 15:19:35 -08002320 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002321 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2322 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2323}
2324
Alec Mouri80863a62019-01-17 15:19:35 -08002325TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002326 sp<SurfaceControl> layer;
2327 ASSERT_NO_FATAL_FAILURE(
2328 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2329
2330 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2331
2332 {
2333 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002334 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002335 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2336 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2337 }
2338
2339 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2340
2341 {
2342 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002343 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002344 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2345 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2346 }
2347
2348 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2349
2350 {
2351 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002352 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002353 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2354 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2355 }
2356}
2357
Alec Mouri80863a62019-01-17 15:19:35 -08002358TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002359 sp<SurfaceControl> layer1;
2360 ASSERT_NO_FATAL_FAILURE(
2361 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2362
2363 sp<SurfaceControl> layer2;
2364 ASSERT_NO_FATAL_FAILURE(
2365 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2366
2367 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2368
Marissa Wall861616d2018-10-22 12:52:23 -07002369 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002370 {
2371 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002372 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002373 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2374 }
2375
2376 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2377
Marissa Wall861616d2018-10-22 12:52:23 -07002378 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002379 {
2380 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002381 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002382 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2383 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2384 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2385 }
2386
2387 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2388 {
2389 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002390 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002391 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2392 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2393 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2394 }
2395
2396 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2397
2398 {
2399 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002400 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002401 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2402 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2403 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2404 }
2405}
2406
Valerie Haua6b15a12019-02-05 14:16:30 -08002407TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002408 sp<SurfaceControl> layer;
2409 ASSERT_NO_FATAL_FAILURE(
2410 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2411
2412 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2413
2414 std::array<sp<GraphicBuffer>, 10> buffers;
2415
2416 size_t idx = 0;
2417 for (auto& buffer : buffers) {
2418 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2419 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2420 BufferUsage::COMPOSER_OVERLAY,
2421 "test");
2422 Color color = colors[idx % colors.size()];
2423 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2424 idx++;
2425 }
2426
2427 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2428 // cache is working.
2429 idx = 0;
2430 for (auto& buffer : buffers) {
2431 for (int i = 0; i < 2; i++) {
2432 Transaction().setBuffer(layer, buffer).apply();
2433
2434 Color color = colors[idx % colors.size()];
2435 auto shot = screenshot();
2436 shot->expectColor(Rect(0, 0, 32, 32), color);
2437 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2438 }
2439 idx++;
2440 }
2441}
2442
Valerie Haua6b15a12019-02-05 14:16:30 -08002443TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002444 sp<SurfaceControl> layer;
2445 ASSERT_NO_FATAL_FAILURE(
2446 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2447
2448 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2449
2450 std::array<sp<GraphicBuffer>, 70> buffers;
2451
2452 size_t idx = 0;
2453 for (auto& buffer : buffers) {
2454 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2455 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2456 BufferUsage::COMPOSER_OVERLAY,
2457 "test");
2458 Color color = colors[idx % colors.size()];
2459 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2460 idx++;
2461 }
2462
2463 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2464 // cache is working.
2465 idx = 0;
2466 for (auto& buffer : buffers) {
2467 for (int i = 0; i < 2; i++) {
2468 Transaction().setBuffer(layer, buffer).apply();
2469
2470 Color color = colors[idx % colors.size()];
2471 auto shot = screenshot();
2472 shot->expectColor(Rect(0, 0, 32, 32), color);
2473 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2474 }
2475 idx++;
2476 }
2477}
2478
Valerie Haua6b15a12019-02-05 14:16:30 -08002479TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002480 sp<SurfaceControl> layer;
2481 ASSERT_NO_FATAL_FAILURE(
2482 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2483
2484 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2485
2486 std::array<sp<GraphicBuffer>, 65> buffers;
2487
2488 size_t idx = 0;
2489 for (auto& buffer : buffers) {
2490 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2491 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2492 BufferUsage::COMPOSER_OVERLAY,
2493 "test");
2494 Color color = colors[idx % colors.size()];
2495 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2496 idx++;
2497 }
2498
2499 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2500 // cache is working.
2501 idx = 0;
2502 for (auto& buffer : buffers) {
2503 for (int i = 0; i < 2; i++) {
2504 Transaction().setBuffer(layer, buffer).apply();
2505
2506 Color color = colors[idx % colors.size()];
2507 auto shot = screenshot();
2508 shot->expectColor(Rect(0, 0, 32, 32), color);
2509 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2510 }
2511 if (idx == 0) {
2512 buffers[0].clear();
2513 }
2514 idx++;
2515 }
2516}
2517
Alec Mouri80863a62019-01-17 15:19:35 -08002518TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002519 sp<SurfaceControl> layer;
2520 ASSERT_NO_FATAL_FAILURE(
2521 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2522
2523 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2524 Color::BLUE, Color::WHITE));
2525
Marissa Wall861616d2018-10-22 12:52:23 -07002526 Transaction()
2527 .setFrame(layer, Rect(0, 0, 32, 32))
2528 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2529 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002530
Alec Mouri80863a62019-01-17 15:19:35 -08002531 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2532 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002533}
2534
Alec Mouri80863a62019-01-17 15:19:35 -08002535TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002536 sp<SurfaceControl> layer;
2537 ASSERT_NO_FATAL_FAILURE(
2538 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2539
2540 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2541 Color::BLUE, Color::WHITE));
2542
Marissa Wall861616d2018-10-22 12:52:23 -07002543 Transaction()
2544 .setFrame(layer, Rect(0, 0, 32, 32))
2545 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2546 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002547
Alec Mouri80863a62019-01-17 15:19:35 -08002548 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2549 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002550}
2551
Alec Mouri80863a62019-01-17 15:19:35 -08002552TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002553 sp<SurfaceControl> layer;
2554 ASSERT_NO_FATAL_FAILURE(
2555 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2556
2557 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2558 Color::BLUE, Color::WHITE));
2559
Marissa Wall861616d2018-10-22 12:52:23 -07002560 Transaction()
2561 .setFrame(layer, Rect(0, 0, 32, 32))
2562 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2563 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002564
Alec Mouri80863a62019-01-17 15:19:35 -08002565 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2566 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002567}
2568
2569TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2570 sp<SurfaceControl> layer;
2571 ASSERT_NO_FATAL_FAILURE(
2572 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2573
2574 Transaction().setTransformToDisplayInverse(layer, false).apply();
2575
2576 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2577
2578 Transaction().setTransformToDisplayInverse(layer, true).apply();
2579}
2580
Alec Mouri80863a62019-01-17 15:19:35 -08002581TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002582 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002583 Transaction transaction;
2584 ASSERT_NO_FATAL_FAILURE(
2585 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2586
2587 sp<GraphicBuffer> buffer =
2588 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2589 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2590 BufferUsage::COMPOSER_OVERLAY,
2591 "test");
2592 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2593
2594 sp<Fence> fence;
2595 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2596 GTEST_SUCCEED() << "test not supported";
2597 return;
2598 }
2599
2600 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2601
2602 status_t status = fence->wait(1000);
2603 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2604 std::this_thread::sleep_for(200ms);
2605
Alec Mouri80863a62019-01-17 15:19:35 -08002606 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002607 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2608 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2609}
2610
Alec Mouri80863a62019-01-17 15:19:35 -08002611TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002612 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002613 ASSERT_NO_FATAL_FAILURE(
2614 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2615
2616 sp<GraphicBuffer> buffer =
2617 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2618 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2619 BufferUsage::COMPOSER_OVERLAY,
2620 "test");
2621 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2622
Marissa Wallfda30bb2018-10-12 11:34:28 -07002623 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002624
2625 Transaction()
2626 .setBuffer(layer, buffer)
2627 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002628 .apply();
2629
Alec Mouri80863a62019-01-17 15:19:35 -08002630 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002631 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2632 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2633}
2634
Alec Mouri80863a62019-01-17 15:19:35 -08002635TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002636 sp<SurfaceControl> layer;
2637 ASSERT_NO_FATAL_FAILURE(
2638 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2639
2640 sp<GraphicBuffer> buffer =
2641 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2642 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2643 BufferUsage::COMPOSER_OVERLAY,
2644 "test");
2645 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2646
2647 Transaction()
2648 .setBuffer(layer, buffer)
2649 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002650 .apply();
2651
Alec Mouri80863a62019-01-17 15:19:35 -08002652 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002653 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2654 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2655}
2656
Alec Mouri80863a62019-01-17 15:19:35 -08002657TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002658 sp<SurfaceControl> layer;
2659 ASSERT_NO_FATAL_FAILURE(
2660 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2661
2662 sp<GraphicBuffer> buffer =
2663 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2664 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2665 BufferUsage::COMPOSER_OVERLAY,
2666 "test");
2667 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2668
2669 HdrMetadata hdrMetadata;
2670 hdrMetadata.validTypes = 0;
2671 Transaction()
2672 .setBuffer(layer, buffer)
2673 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002674 .apply();
2675
Alec Mouri80863a62019-01-17 15:19:35 -08002676 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002677 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2678 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2679}
2680
Alec Mouri80863a62019-01-17 15:19:35 -08002681TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002682 sp<SurfaceControl> layer;
2683 ASSERT_NO_FATAL_FAILURE(
2684 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2685
2686 sp<GraphicBuffer> buffer =
2687 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2688 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2689 BufferUsage::COMPOSER_OVERLAY,
2690 "test");
2691 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2692
2693 Region region;
2694 region.set(32, 32);
2695 Transaction()
2696 .setBuffer(layer, buffer)
2697 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002698 .apply();
2699
Alec Mouri80863a62019-01-17 15:19:35 -08002700 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002701 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2702 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2703}
2704
Alec Mouri80863a62019-01-17 15:19:35 -08002705TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002706 sp<SurfaceControl> layer;
2707 ASSERT_NO_FATAL_FAILURE(
2708 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2709
2710 sp<GraphicBuffer> buffer =
2711 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2712 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2713 BufferUsage::COMPOSER_OVERLAY,
2714 "test");
2715 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2716
2717 Transaction()
2718 .setBuffer(layer, buffer)
2719 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002720 .apply();
2721
Alec Mouri80863a62019-01-17 15:19:35 -08002722 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002723 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2724 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2725}
2726
2727TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2728 sp<SurfaceControl> layer;
2729 ASSERT_NO_FATAL_FAILURE(
2730 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2731
2732 // verify this doesn't cause a crash
2733 Transaction().setSidebandStream(layer, nullptr).apply();
2734}
2735
Robert Carr54cf5b12019-01-25 14:02:28 -08002736TEST_F(LayerTransactionTest, ReparentToSelf) {
2737 sp<SurfaceControl> layer;
2738 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2739 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2740 Transaction().reparent(layer, layer->getHandle()).apply();
2741
2742 {
2743 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2744 // to still be functioning.
2745 SCOPED_TRACE("after reparent to self");
2746 const Rect rect(0, 0, 32, 32);
2747 auto shot = screenshot();
2748 shot->expectColor(rect, Color::RED);
2749 shot->expectBorder(rect, Color::BLACK);
2750 }
2751}
2752
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002753class ColorTransformHelper {
2754public:
2755 static void DegammaColorSingle(half& s) {
2756 if (s <= 0.03928f)
2757 s = s / 12.92f;
2758 else
2759 s = pow((s + 0.055f) / 1.055f, 2.4f);
2760 }
2761
2762 static void DegammaColor(half3& color) {
2763 DegammaColorSingle(color.r);
2764 DegammaColorSingle(color.g);
2765 DegammaColorSingle(color.b);
2766 }
2767
2768 static void GammaColorSingle(half& s) {
2769 if (s <= 0.0031308f) {
2770 s = s * 12.92f;
2771 } else {
2772 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2773 }
2774 }
2775
2776 static void GammaColor(half3& color) {
2777 GammaColorSingle(color.r);
2778 GammaColorSingle(color.g);
2779 GammaColorSingle(color.b);
2780 }
2781
2782 static void applyMatrix(half3& color, const mat3& mat) {
2783 half3 ret = half3(0);
2784
2785 for (int i = 0; i < 3; i++) {
2786 for (int j = 0; j < 3; j++) {
2787 ret[i] = ret[i] + color[j] * mat[j][i];
2788 }
2789 }
2790 color = ret;
2791 }
2792};
2793
Alec Mouri80863a62019-01-17 15:19:35 -08002794TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002795 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002796 ASSERT_NO_FATAL_FAILURE(colorLayer =
2797 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2798 ISurfaceComposerClient::eFXSurfaceColor));
2799 Transaction()
2800 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2801 .setLayer(colorLayer, mLayerZBase + 1)
2802 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002803 {
2804 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002805 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002806 }
2807
2808 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002809 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002810 mat3 matrix;
2811 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2812 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2813 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002814
2815 // degamma before applying the matrix
2816 if (mColorManagementUsed) {
2817 ColorTransformHelper::DegammaColor(expected);
2818 }
2819
2820 ColorTransformHelper::applyMatrix(expected, matrix);
2821
2822 if (mColorManagementUsed) {
2823 ColorTransformHelper::GammaColor(expected);
2824 }
2825
2826 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2827 uint8_t(expected.b * 255), 255};
2828
2829 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2830 // channel) should be less than one
2831 const uint8_t tolerance = 1;
2832
Peiyong Lind3788632018-09-18 16:01:31 -07002833 Transaction().setColor(colorLayer, color)
2834 .setColorTransform(colorLayer, matrix, vec3()).apply();
2835 {
2836 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002837 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002838 }
2839}
2840
Alec Mouri80863a62019-01-17 15:19:35 -08002841TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002842 sp<SurfaceControl> parentLayer;
2843 sp<SurfaceControl> colorLayer;
2844 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2845 0 /* buffer height */,
2846 ISurfaceComposerClient::eFXSurfaceContainer));
2847 ASSERT_NO_FATAL_FAILURE(
2848 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2849 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2850
2851 Transaction()
2852 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2853 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2854 .setLayer(parentLayer, mLayerZBase + 1)
2855 .apply();
2856 {
2857 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002858 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002859 }
2860
2861 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2862 half3 expected = color;
2863 mat3 matrix;
2864 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2865 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2866 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2867
2868 // degamma before applying the matrix
2869 if (mColorManagementUsed) {
2870 ColorTransformHelper::DegammaColor(expected);
2871 }
2872
2873 ColorTransformHelper::applyMatrix(expected, matrix);
2874
2875 if (mColorManagementUsed) {
2876 ColorTransformHelper::GammaColor(expected);
2877 }
2878
2879 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2880 uint8_t(expected.b * 255), 255};
2881
2882 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2883 // channel) should be less than one
2884 const uint8_t tolerance = 1;
2885
2886 Transaction()
2887 .setColor(colorLayer, color)
2888 .setColorTransform(parentLayer, matrix, vec3())
2889 .apply();
2890 {
2891 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002892 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002893 }
2894}
2895
Alec Mouri80863a62019-01-17 15:19:35 -08002896TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002897 sp<SurfaceControl> parentLayer;
2898 sp<SurfaceControl> colorLayer;
2899 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2900 0 /* buffer height */,
2901 ISurfaceComposerClient::eFXSurfaceContainer));
2902 ASSERT_NO_FATAL_FAILURE(
2903 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2904 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2905
2906 Transaction()
2907 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2908 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2909 .setLayer(parentLayer, mLayerZBase + 1)
2910 .apply();
2911 {
2912 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002913 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002914 }
2915
2916 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2917 half3 expected = color;
2918 mat3 matrixChild;
2919 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2920 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2921 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2922 mat3 matrixParent;
2923 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2924 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2925 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2926
2927 // degamma before applying the matrix
2928 if (mColorManagementUsed) {
2929 ColorTransformHelper::DegammaColor(expected);
2930 }
2931
2932 ColorTransformHelper::applyMatrix(expected, matrixChild);
2933 ColorTransformHelper::applyMatrix(expected, matrixParent);
2934
2935 if (mColorManagementUsed) {
2936 ColorTransformHelper::GammaColor(expected);
2937 }
2938
2939 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2940 uint8_t(expected.b * 255), 255};
2941
2942 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2943 // channel) should be less than one
2944 const uint8_t tolerance = 1;
2945
2946 Transaction()
2947 .setColor(colorLayer, color)
2948 .setColorTransform(parentLayer, matrixParent, vec3())
2949 .setColorTransform(colorLayer, matrixChild, vec3())
2950 .apply();
2951 {
2952 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002953 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002954 }
2955}
2956
Marissa Wall80d94ad2019-01-18 16:04:36 -08002957struct CallbackData {
2958 CallbackData() = default;
2959 CallbackData(nsecs_t time, const sp<Fence>& fence,
2960 const std::vector<SurfaceControlStats>& stats)
2961 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
2962
2963 nsecs_t latchTime;
2964 sp<Fence> presentFence;
2965 std::vector<SurfaceControlStats> surfaceControlStats;
2966};
2967
Marissa Wallfda30bb2018-10-12 11:34:28 -07002968class ExpectedResult {
2969public:
2970 enum Transaction {
2971 NOT_PRESENTED = 0,
2972 PRESENTED,
2973 };
2974
2975 enum Buffer {
2976 NOT_ACQUIRED = 0,
2977 ACQUIRED,
2978 };
2979
2980 enum PreviousBuffer {
2981 NOT_RELEASED = 0,
2982 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08002983 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002984 };
2985
2986 void reset() {
2987 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
2988 mExpectedSurfaceResults.clear();
2989 }
2990
2991 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07002992 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002993 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
2994 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08002995 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07002996 std::forward_as_tuple(bufferResult, previousBufferResult));
2997 }
2998
2999 void addSurfaces(ExpectedResult::Transaction transactionResult,
3000 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003001 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003002 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3003 for (const auto& layer : layers) {
3004 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3005 }
3006 }
3007
Marissa Wall17b4e452018-12-26 16:32:34 -08003008 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3009 mExpectedPresentTime = expectedPresentTime;
3010 }
3011
Marissa Wall80d94ad2019-01-18 16:04:36 -08003012 void verifyCallbackData(const CallbackData& callbackData) const {
3013 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003014 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3015 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003016 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003017 if (mExpectedPresentTime >= 0) {
3018 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3019 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3020 // if the panel is running at 30 hz, at the worst case, our expected time just
3021 // misses vsync and we have to wait another 33.3ms
3022 ASSERT_LE(presentFence->getSignalTime(),
3023 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3024 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003025 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003026 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003027 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3028 }
3029
Marissa Wall80d94ad2019-01-18 16:04:36 -08003030 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003031 << "wrong number of surfaces";
3032
Marissa Wall80d94ad2019-01-18 16:04:36 -08003033 for (const auto& stats : surfaceControlStats) {
3034 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3035
Marissa Wallfda30bb2018-10-12 11:34:28 -07003036 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3037 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3038 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003039 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003040 }
3041 }
3042
3043private:
3044 class ExpectedSurfaceResult {
3045 public:
3046 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3047 ExpectedResult::PreviousBuffer previousBufferResult)
3048 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3049
Marissa Wall80d94ad2019-01-18 16:04:36 -08003050 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3051 nsecs_t latchTime) const {
3052 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003053
3054 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3055 << "bad acquire time";
3056 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003057
3058 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3059 ASSERT_NE(previousReleaseFence, nullptr)
3060 << "failed to set release prev buffer fence";
3061 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3062 ASSERT_EQ(previousReleaseFence, nullptr)
3063 << "should not have set released prev buffer fence";
3064 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003065 }
3066
3067 private:
3068 ExpectedResult::Buffer mBufferResult;
3069 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3070 };
3071
Marissa Wall80d94ad2019-01-18 16:04:36 -08003072 struct SCHash {
3073 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3074 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003075 }
3076 };
3077 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003078 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003079 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003080};
3081
3082class CallbackHelper {
3083public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003084 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3085 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003086 if (!callbackContext) {
3087 ALOGE("failed to get callback context");
3088 }
3089 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3090 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003091 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003092 helper->mConditionVariable.notify_all();
3093 }
3094
Marissa Wall80d94ad2019-01-18 16:04:36 -08003095 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003096 std::unique_lock lock(mMutex);
3097
Marissa Wall80d94ad2019-01-18 16:04:36 -08003098 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003099 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3100 std::cv_status::timeout)
3101 << "did not receive callback";
3102 }
3103
Marissa Wall80d94ad2019-01-18 16:04:36 -08003104 *outData = std::move(mCallbackDataQueue.front());
3105 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003106 }
3107
3108 void verifyFinalState() {
3109 // Wait to see if there are extra callbacks
3110 std::this_thread::sleep_for(500ms);
3111
3112 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003113 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3114 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003115 }
3116
3117 void* getContext() { return static_cast<void*>(this); }
3118
3119 std::mutex mMutex;
3120 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003121 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003122};
3123
3124class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003125public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003126 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003127 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003128 }
3129
Marissa Wall713b63f2018-10-17 15:42:43 -07003130 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003131 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3132 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003133 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003134 sp<GraphicBuffer> buffer;
3135 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003136 if (setBuffer) {
3137 int err = getBuffer(&buffer, &fence);
3138 if (err != NO_ERROR) {
3139 return err;
3140 }
3141
3142 transaction.setBuffer(layer, buffer);
3143 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003144 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003145
Valerie Hauaa194562019-02-05 16:21:38 -08003146 if (setBackgroundColor) {
3147 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3148 ui::Dataspace::UNKNOWN);
3149 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003150 }
3151
3152 transaction.addTransactionCompletedCallback(callbackHelper->function,
3153 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003154 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003155 }
3156
Marissa Wall861616d2018-10-22 12:52:23 -07003157 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3158 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003159 CallbackData callbackData;
3160 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3161 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003162
3163 if (finalState) {
3164 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3165 }
3166 }
3167
Marissa Wall861616d2018-10-22 12:52:23 -07003168 static void waitForCallbacks(CallbackHelper& helper,
3169 const std::vector<ExpectedResult>& expectedResults,
3170 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003171 for (const auto& expectedResult : expectedResults) {
3172 waitForCallback(helper, expectedResult);
3173 }
3174 if (finalState) {
3175 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3176 }
3177 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003178};
3179
Valerie Hauaa194562019-02-05 16:21:38 -08003180TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003181 sp<SurfaceControl> layer;
3182 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3183
3184 Transaction transaction;
3185 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003186 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003187 if (err) {
3188 GTEST_SUCCEED() << "test not supported";
3189 return;
3190 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003191
3192 transaction.apply();
3193
3194 ExpectedResult expected;
3195 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3196 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3197}
3198
Valerie Hauaa194562019-02-05 16:21:38 -08003199TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003200 sp<SurfaceControl> layer;
3201 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3202
3203 Transaction transaction;
3204 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003205 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003206 if (err) {
3207 GTEST_SUCCEED() << "test not supported";
3208 return;
3209 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003210
Marissa Wall861616d2018-10-22 12:52:23 -07003211 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003212
3213 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003214 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3215 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003216 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3217}
3218
Valerie Hauaa194562019-02-05 16:21:38 -08003219TEST_F(LayerCallbackTest, BufferNoColor) {
3220 sp<SurfaceControl> layer;
3221 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3222
3223 Transaction transaction;
3224 CallbackHelper callback;
3225 int err = fillTransaction(transaction, &callback, layer, true, false);
3226 if (err) {
3227 GTEST_SUCCEED() << "test not supported";
3228 return;
3229 }
3230
3231 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3232
3233 ExpectedResult expected;
3234 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3235 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3236}
3237
3238TEST_F(LayerCallbackTest, NoBufferColor) {
3239 sp<SurfaceControl> layer;
3240 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3241
3242 Transaction transaction;
3243 CallbackHelper callback;
3244 int err = fillTransaction(transaction, &callback, layer, false, true);
3245 if (err) {
3246 GTEST_SUCCEED() << "test not supported";
3247 return;
3248 }
3249
3250 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3251
3252 ExpectedResult expected;
3253 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3254 ExpectedResult::Buffer::NOT_ACQUIRED);
3255 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3256}
3257
Marissa Wallfda30bb2018-10-12 11:34:28 -07003258TEST_F(LayerCallbackTest, NoStateChange) {
3259 Transaction transaction;
3260 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003261 int err = fillTransaction(transaction, &callback);
3262 if (err) {
3263 GTEST_SUCCEED() << "test not supported";
3264 return;
3265 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003266
3267 transaction.apply();
3268
3269 ExpectedResult expected;
3270 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3271}
3272
3273TEST_F(LayerCallbackTest, OffScreen) {
3274 sp<SurfaceControl> layer;
3275 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3276
3277 Transaction transaction;
3278 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003279 int err = fillTransaction(transaction, &callback, layer);
3280 if (err) {
3281 GTEST_SUCCEED() << "test not supported";
3282 return;
3283 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003284
Marissa Wall861616d2018-10-22 12:52:23 -07003285 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003286
3287 ExpectedResult expected;
3288 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3289 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3290}
3291
Valerie Hauaa194562019-02-05 16:21:38 -08003292TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003293 sp<SurfaceControl> layer1, layer2;
3294 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3295 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3296
3297 Transaction transaction1, transaction2;
3298 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003299 int err = fillTransaction(transaction1, &callback1, layer1);
3300 if (err) {
3301 GTEST_SUCCEED() << "test not supported";
3302 return;
3303 }
3304 err = fillTransaction(transaction2, &callback2, layer2);
3305 if (err) {
3306 GTEST_SUCCEED() << "test not supported";
3307 return;
3308 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003309
Marissa Wall861616d2018-10-22 12:52:23 -07003310 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3311 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003312
3313 ExpectedResult expected;
3314 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3315 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3316 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3317}
3318
Valerie Hauaa194562019-02-05 16:21:38 -08003319TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3320 sp<SurfaceControl> layer1, layer2;
3321 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3322 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3323
3324 Transaction transaction1, transaction2;
3325 CallbackHelper callback1, callback2;
3326 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3327 if (err) {
3328 GTEST_SUCCEED() << "test not supported";
3329 return;
3330 }
3331 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3332 if (err) {
3333 GTEST_SUCCEED() << "test not supported";
3334 return;
3335 }
3336
3337 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3338 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3339
3340 ExpectedResult expected;
3341 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3342 ExpectedResult::Buffer::NOT_ACQUIRED);
3343 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3344 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3345}
3346
3347TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3348 sp<SurfaceControl> layer1, layer2;
3349 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3350 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3351
3352 Transaction transaction1, transaction2;
3353 CallbackHelper callback1, callback2;
3354 int err = fillTransaction(transaction1, &callback1, layer1);
3355 if (err) {
3356 GTEST_SUCCEED() << "test not supported";
3357 return;
3358 }
3359 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3360 if (err) {
3361 GTEST_SUCCEED() << "test not supported";
3362 return;
3363 }
3364
3365 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3366 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3367
3368 ExpectedResult expected;
3369 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3370 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3371 ExpectedResult::Buffer::NOT_ACQUIRED);
3372 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3373 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3374}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003375TEST_F(LayerCallbackTest, Merge_SameCallback) {
3376 sp<SurfaceControl> layer1, layer2;
3377 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3378 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3379
3380 Transaction transaction1, transaction2;
3381 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003382 int err = fillTransaction(transaction1, &callback, layer1);
3383 if (err) {
3384 GTEST_SUCCEED() << "test not supported";
3385 return;
3386 }
3387 err = fillTransaction(transaction2, &callback, layer2);
3388 if (err) {
3389 GTEST_SUCCEED() << "test not supported";
3390 return;
3391 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003392
3393 transaction2.merge(std::move(transaction1)).apply();
3394
3395 ExpectedResult expected;
3396 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3397 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3398 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3399}
3400
3401TEST_F(LayerCallbackTest, Merge_SameLayer) {
3402 sp<SurfaceControl> layer;
3403 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3404
3405 Transaction transaction1, transaction2;
3406 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003407 int err = fillTransaction(transaction1, &callback1, layer);
3408 if (err) {
3409 GTEST_SUCCEED() << "test not supported";
3410 return;
3411 }
3412 err = fillTransaction(transaction2, &callback2, layer);
3413 if (err) {
3414 GTEST_SUCCEED() << "test not supported";
3415 return;
3416 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003417
3418 transaction2.merge(std::move(transaction1)).apply();
3419
3420 ExpectedResult expected;
3421 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3422 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3423 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3424}
3425
Marissa Wallfda30bb2018-10-12 11:34:28 -07003426TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3427 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3428 client2(new SurfaceComposerClient);
3429
3430 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3431 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3432
3433 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003434 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003435 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003436 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003437 ISurfaceComposerClient::eFXSurfaceBufferState));
3438
3439 Transaction transaction1, transaction2;
3440 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003441 int err = fillTransaction(transaction1, &callback1, layer1);
3442 if (err) {
3443 GTEST_SUCCEED() << "test not supported";
3444 return;
3445 }
3446 err = fillTransaction(transaction2, &callback2, layer2);
3447 if (err) {
3448 GTEST_SUCCEED() << "test not supported";
3449 return;
3450 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003451
Marissa Wall861616d2018-10-22 12:52:23 -07003452 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3453 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003454
3455 ExpectedResult expected;
3456 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3457 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3458 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3459}
3460
3461TEST_F(LayerCallbackTest, MultipleTransactions) {
3462 sp<SurfaceControl> layer;
3463 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3464
3465 Transaction transaction;
3466 CallbackHelper callback;
3467 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003468 int err = fillTransaction(transaction, &callback, layer);
3469 if (err) {
3470 GTEST_SUCCEED() << "test not supported";
3471 return;
3472 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003473
3474 transaction.apply();
3475
3476 ExpectedResult expected;
3477 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003478 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003479 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3480 : ExpectedResult::PreviousBuffer::RELEASED);
3481 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3482 }
3483 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3484}
3485
3486TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3487 sp<SurfaceControl> layer;
3488 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3489
3490 Transaction transaction;
3491 CallbackHelper callback;
3492 for (size_t i = 0; i < 10; i++) {
3493 ExpectedResult expected;
3494
3495 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003496 int err = fillTransaction(transaction, &callback, layer);
3497 if (err) {
3498 GTEST_SUCCEED() << "test not supported";
3499 return;
3500 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003501 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3502 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003503 int err = fillTransaction(transaction, &callback);
3504 if (err) {
3505 GTEST_SUCCEED() << "test not supported";
3506 return;
3507 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003508 }
3509
3510 transaction.apply();
3511
3512 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3513 }
3514 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3515}
3516
3517TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3518 sp<SurfaceControl> layer;
3519 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3520
3521 Transaction transaction;
3522 CallbackHelper callback;
3523 for (size_t i = 0; i < 10; i++) {
3524 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003525 int err = fillTransaction(transaction, &callback, layer);
3526 if (err) {
3527 GTEST_SUCCEED() << "test not supported";
3528 return;
3529 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003530 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003531 int err = fillTransaction(transaction, &callback);
3532 if (err) {
3533 GTEST_SUCCEED() << "test not supported";
3534 return;
3535 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003536 }
3537
Marissa Wall861616d2018-10-22 12:52:23 -07003538 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003539
3540 ExpectedResult expected;
3541 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3542 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003543 layer,
3544 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3545 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003546 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3547 }
3548 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3549}
3550
3551TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3552 sp<SurfaceControl> layer1, layer2;
3553 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3554 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3555
3556 Transaction transaction1, transaction2;
3557 CallbackHelper callback1, callback2;
3558 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003559 int err = fillTransaction(transaction1, &callback1, layer1);
3560 if (err) {
3561 GTEST_SUCCEED() << "test not supported";
3562 return;
3563 }
3564 err = fillTransaction(transaction2, &callback2, layer2);
3565 if (err) {
3566 GTEST_SUCCEED() << "test not supported";
3567 return;
3568 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003569
Marissa Wall861616d2018-10-22 12:52:23 -07003570 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3571 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003572
3573 ExpectedResult expected;
3574 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003575 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003576 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3577 : ExpectedResult::PreviousBuffer::RELEASED);
3578 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3579 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3580 }
3581 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3582 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3583}
3584
3585TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3586 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3587 client2(new SurfaceComposerClient);
3588 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3589 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3590
3591 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003592 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003593 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003594 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003595 ISurfaceComposerClient::eFXSurfaceBufferState));
3596
3597 Transaction transaction1, transaction2;
3598 CallbackHelper callback1, callback2;
3599 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003600 int err = fillTransaction(transaction1, &callback1, layer1);
3601 if (err) {
3602 GTEST_SUCCEED() << "test not supported";
3603 return;
3604 }
3605 err = fillTransaction(transaction2, &callback2, layer2);
3606 if (err) {
3607 GTEST_SUCCEED() << "test not supported";
3608 return;
3609 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003610
Marissa Wall861616d2018-10-22 12:52:23 -07003611 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3612 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003613
3614 ExpectedResult expected;
3615 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003616 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003617 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3618 : ExpectedResult::PreviousBuffer::RELEASED);
3619 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3620 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3621 }
3622 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3623 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3624}
3625
3626TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3627 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3628 client2(new SurfaceComposerClient);
3629 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3630 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3631
3632 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003633 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003634 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003635 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003636 ISurfaceComposerClient::eFXSurfaceBufferState));
3637
3638 Transaction transaction1, transaction2;
3639 CallbackHelper callback1, callback2;
3640
3641 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003642 int err = fillTransaction(transaction1, &callback1, layer1);
3643 if (err) {
3644 GTEST_SUCCEED() << "test not supported";
3645 return;
3646 }
3647 err = fillTransaction(transaction2, &callback2, layer2);
3648 if (err) {
3649 GTEST_SUCCEED() << "test not supported";
3650 return;
3651 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003652
Marissa Wall861616d2018-10-22 12:52:23 -07003653 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3654 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003655
3656 ExpectedResult expected;
3657 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3658 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3659 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3660 expected.reset();
3661
3662 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003663 err = fillTransaction(transaction1, &callback1);
3664 if (err) {
3665 GTEST_SUCCEED() << "test not supported";
3666 return;
3667 }
3668 err = fillTransaction(transaction2, &callback2);
3669 if (err) {
3670 GTEST_SUCCEED() << "test not supported";
3671 return;
3672 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003673
3674 transaction2.merge(std::move(transaction1)).apply();
3675
3676 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3677 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3678}
3679
3680TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3681 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3682 client2(new SurfaceComposerClient);
3683
3684 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3685 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3686
3687 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003688 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003689 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003690 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003691 ISurfaceComposerClient::eFXSurfaceBufferState));
3692
3693 Transaction transaction1, transaction2;
3694 CallbackHelper callback1, callback2;
3695
3696 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003697 int err = fillTransaction(transaction1, &callback1, layer1);
3698 if (err) {
3699 GTEST_SUCCEED() << "test not supported";
3700 return;
3701 }
3702 err = fillTransaction(transaction2, &callback2, layer2);
3703 if (err) {
3704 GTEST_SUCCEED() << "test not supported";
3705 return;
3706 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003707
Marissa Wall861616d2018-10-22 12:52:23 -07003708 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3709 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003710
3711 ExpectedResult expected;
3712 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3713 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3714 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3715 expected.reset();
3716
3717 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003718 err = fillTransaction(transaction1, &callback1);
3719 if (err) {
3720 GTEST_SUCCEED() << "test not supported";
3721 return;
3722 }
3723 err = fillTransaction(transaction2, &callback2);
3724 if (err) {
3725 GTEST_SUCCEED() << "test not supported";
3726 return;
3727 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003728
Marissa Wall861616d2018-10-22 12:52:23 -07003729 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003730
Marissa Wall713b63f2018-10-17 15:42:43 -07003731 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3732 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003733 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3734 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3735}
3736
3737TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3738 sp<SurfaceControl> layer;
3739 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3740
3741 Transaction transaction;
3742 CallbackHelper callback;
3743 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003744 for (auto& expected : expectedResults) {
3745 expected.reset();
3746 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003747 ExpectedResult::Buffer::ACQUIRED,
3748 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003749
Marissa Wall713b63f2018-10-17 15:42:43 -07003750 int err = fillTransaction(transaction, &callback, layer);
3751 if (err) {
3752 GTEST_SUCCEED() << "test not supported";
3753 return;
3754 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003755
3756 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003757 }
3758 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3759}
3760
3761TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3762 sp<SurfaceControl> layer;
3763 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3764
Marissa Wall713b63f2018-10-17 15:42:43 -07003765 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003766 Transaction transaction;
3767 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003768 int err = fillTransaction(transaction, &callback, layer);
3769 if (err) {
3770 GTEST_SUCCEED() << "test not supported";
3771 return;
3772 }
3773
3774 transaction.apply();
3775
3776 ExpectedResult expected;
3777 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3778 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3779
3780 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003781 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003782 for (auto& expected : expectedResults) {
3783 expected.reset();
3784
Marissa Wall713b63f2018-10-17 15:42:43 -07003785 err = fillTransaction(transaction, &callback);
3786 if (err) {
3787 GTEST_SUCCEED() << "test not supported";
3788 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003789 }
3790
3791 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003792 }
3793 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3794}
3795
3796TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3797 sp<SurfaceControl> layer;
3798 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3799
3800 // Normal call to set up test
3801 Transaction transaction;
3802 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003803 int err = fillTransaction(transaction, &callback, layer);
3804 if (err) {
3805 GTEST_SUCCEED() << "test not supported";
3806 return;
3807 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003808
Marissa Wall861616d2018-10-22 12:52:23 -07003809 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003810
3811 ExpectedResult expectedResult;
3812 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3813 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3814
3815 // Test
3816 std::vector<ExpectedResult> expectedResults(50);
3817 for (auto& expected : expectedResults) {
3818 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003819 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3820 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003821
Marissa Wall713b63f2018-10-17 15:42:43 -07003822 err = fillTransaction(transaction, &callback);
3823 if (err) {
3824 GTEST_SUCCEED() << "test not supported";
3825 return;
3826 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003827
Marissa Wall861616d2018-10-22 12:52:23 -07003828 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003829 }
3830 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3831}
3832
Marissa Wall17b4e452018-12-26 16:32:34 -08003833TEST_F(LayerCallbackTest, DesiredPresentTime) {
3834 sp<SurfaceControl> layer;
3835 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3836
3837 Transaction transaction;
3838 CallbackHelper callback;
3839 int err = fillTransaction(transaction, &callback, layer);
3840 if (err) {
3841 GTEST_SUCCEED() << "test not supported";
3842 return;
3843 }
3844
3845 // Try to present 100ms in the future
3846 nsecs_t time = systemTime() + (100 * 1e6);
3847
3848 transaction.setDesiredPresentTime(time);
3849 transaction.apply();
3850
3851 ExpectedResult expected;
3852 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3853 expected.addExpectedPresentTime(time);
3854 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3855}
3856
3857TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3858 sp<SurfaceControl> layer;
3859 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3860
3861 Transaction transaction;
3862 CallbackHelper callback1;
3863 int err = fillTransaction(transaction, &callback1, layer);
3864 if (err) {
3865 GTEST_SUCCEED() << "test not supported";
3866 return;
3867 }
3868
3869 // Try to present 100ms in the future
3870 nsecs_t time = systemTime() + (100 * 1e6);
3871
3872 transaction.setDesiredPresentTime(time);
3873 transaction.apply();
3874
3875 ExpectedResult expected1;
3876 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3877 expected1.addExpectedPresentTime(time);
3878
3879 CallbackHelper callback2;
3880 err = fillTransaction(transaction, &callback2, layer);
3881 if (err) {
3882 GTEST_SUCCEED() << "test not supported";
3883 return;
3884 }
3885
3886 // Try to present 33ms after the first frame
3887 time += (33.3 * 1e6);
3888
3889 transaction.setDesiredPresentTime(time);
3890 transaction.apply();
3891
3892 ExpectedResult expected2;
3893 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3894 ExpectedResult::Buffer::ACQUIRED,
3895 ExpectedResult::PreviousBuffer::RELEASED);
3896 expected2.addExpectedPresentTime(time);
3897
3898 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3899 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3900}
3901
3902TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3903 sp<SurfaceControl> layer;
3904 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3905
3906 Transaction transaction;
3907 CallbackHelper callback1;
3908 int err = fillTransaction(transaction, &callback1, layer);
3909 if (err) {
3910 GTEST_SUCCEED() << "test not supported";
3911 return;
3912 }
3913
3914 // Try to present 100ms in the future
3915 nsecs_t time = systemTime() + (100 * 1e6);
3916
3917 transaction.setDesiredPresentTime(time);
3918 transaction.apply();
3919
3920 ExpectedResult expected1;
3921 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3922 expected1.addExpectedPresentTime(time);
3923
3924 CallbackHelper callback2;
3925 err = fillTransaction(transaction, &callback2, layer);
3926 if (err) {
3927 GTEST_SUCCEED() << "test not supported";
3928 return;
3929 }
3930
3931 // Try to present 33ms before the previous frame
3932 time -= (33.3 * 1e6);
3933
3934 transaction.setDesiredPresentTime(time);
3935 transaction.apply();
3936
3937 ExpectedResult expected2;
3938 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3939 ExpectedResult::Buffer::ACQUIRED,
3940 ExpectedResult::PreviousBuffer::RELEASED);
3941
3942 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3943 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3944}
3945
3946TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3947 sp<SurfaceControl> layer;
3948 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3949
3950 Transaction transaction;
3951 CallbackHelper callback;
3952 int err = fillTransaction(transaction, &callback, layer);
3953 if (err) {
3954 GTEST_SUCCEED() << "test not supported";
3955 return;
3956 }
3957
3958 // Try to present 100ms in the past
3959 nsecs_t time = systemTime() - (100 * 1e6);
3960
3961 transaction.setDesiredPresentTime(time);
3962 transaction.apply();
3963
3964 ExpectedResult expected;
3965 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3966 expected.addExpectedPresentTime(systemTime());
3967 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3968}
3969
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003970class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003971protected:
3972 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003973 LayerTransactionTest::SetUp();
3974 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003975
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003976 sp<IBinder> display(
3977 SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003978 DisplayInfo info;
Jeff Brown9d4e3d22012-08-24 20:00:51 -07003979 SurfaceComposerClient::getDisplayInfo(display, &info);
Mathias Agopianc666cae2012-07-25 18:56:13 -07003980
3981 ssize_t displayWidth = info.w;
3982 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003983
3984 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003985 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3986 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003987 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003988 ASSERT_TRUE(mBGSurfaceControl->isValid());
3989 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3990
3991 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003992 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
3993
Peiyong Lin566a3b42018-01-09 18:22:43 -08003994 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003995 ASSERT_TRUE(mFGSurfaceControl->isValid());
3996
3997 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
3998
3999 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004000 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004001 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004002 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4003
4004 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4005
Robert Carr4cdc58f2017-08-23 14:22:20 -07004006 asTransaction([&](Transaction& t) {
4007 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004008
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004009 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004010
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004011 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4012 .setPosition(mFGSurfaceControl, 64, 64)
4013 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004014
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004015 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4016 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4017 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004018 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004019 }
4020
4021 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004022 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004023 mBGSurfaceControl = 0;
4024 mFGSurfaceControl = 0;
4025 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004026 }
4027
4028 void waitForPostedBuffers() {
4029 // Since the sync surface is in synchronous mode (i.e. double buffered)
4030 // posting three buffers to it should ensure that at least two
4031 // SurfaceFlinger::handlePageFlip calls have been made, which should
4032 // guaranteed that a buffer posted to another Surface has been retired.
4033 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4034 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4035 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4036 }
4037
Robert Carr4cdc58f2017-08-23 14:22:20 -07004038 void asTransaction(const std::function<void(Transaction&)>& exec) {
4039 Transaction t;
4040 exec(t);
4041 t.apply(true);
4042 }
4043
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004044 sp<SurfaceControl> mBGSurfaceControl;
4045 sp<SurfaceControl> mFGSurfaceControl;
4046
4047 // This surface is used to ensure that the buffers posted to
4048 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4049 sp<SurfaceControl> mSyncSurfaceControl;
4050};
4051
Robert Carr7f619b22017-11-06 12:56:35 -08004052TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004053
chaviw0e3479f2018-09-10 16:49:30 -07004054 std::unique_ptr<ScreenCapture> sc;
4055
4056 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004057 fillSurfaceRGBA8(relative, 10, 10, 10);
4058 waitForPostedBuffers();
4059
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004060 Transaction{}
4061 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004062 .setPosition(relative, 64, 64)
4063 .apply();
4064
4065 {
4066 // The relative should be on top of the FG control.
4067 ScreenCapture::captureScreen(&sc);
4068 sc->checkPixel(64, 64, 10, 10, 10);
4069 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004070 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004071
4072 {
4073 // Nothing should change at this point.
4074 ScreenCapture::captureScreen(&sc);
4075 sc->checkPixel(64, 64, 10, 10, 10);
4076 }
4077
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004078 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004079
4080 {
4081 // Ensure that the relative was actually hidden, rather than
4082 // being left in the detached but visible state.
4083 ScreenCapture::captureScreen(&sc);
4084 sc->expectFGColor(64, 64);
4085 }
4086}
4087
Robert Carr8d5227b2017-03-16 15:41:03 -07004088class GeometryLatchingTest : public LayerUpdateTest {
4089protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004090 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004091 SCOPED_TRACE(trace);
4092 ScreenCapture::captureScreen(&sc);
4093 // We find the leading edge of the FG surface.
4094 sc->expectFGColor(127, 127);
4095 sc->expectBGColor(128, 128);
4096 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004097
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004098 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004099
4100 void unlockFGBuffer() {
4101 sp<Surface> s = mFGSurfaceControl->getSurface();
4102 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4103 waitForPostedBuffers();
4104 }
4105
Robert Carr8d5227b2017-03-16 15:41:03 -07004106 void completeFGResize() {
4107 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4108 waitForPostedBuffers();
4109 }
4110 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004111 asTransaction([&](Transaction& t) {
4112 t.setSize(mFGSurfaceControl, 64, 64);
4113 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004114 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004115 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004116
4117 EXPECT_INITIAL_STATE("After restoring initial state");
4118 }
chaviw0e3479f2018-09-10 16:49:30 -07004119 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004120};
4121
Robert Carr8d5227b2017-03-16 15:41:03 -07004122class CropLatchingTest : public GeometryLatchingTest {
4123protected:
4124 void EXPECT_CROPPED_STATE(const char* trace) {
4125 SCOPED_TRACE(trace);
4126 ScreenCapture::captureScreen(&sc);
4127 // The edge should be moved back one pixel by our crop.
4128 sc->expectFGColor(126, 126);
4129 sc->expectBGColor(127, 127);
4130 sc->expectBGColor(128, 128);
4131 }
chaviw59f5c562017-06-28 16:39:06 -07004132
4133 void EXPECT_RESIZE_STATE(const char* trace) {
4134 SCOPED_TRACE(trace);
4135 ScreenCapture::captureScreen(&sc);
4136 // The FG is now resized too 128,128 at 64,64
4137 sc->expectFGColor(64, 64);
4138 sc->expectFGColor(191, 191);
4139 sc->expectBGColor(192, 192);
4140 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004141};
4142
Pablo Ceballos05289c22016-04-14 15:49:55 -07004143TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004144 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004145 {
4146 SCOPED_TRACE("before anything");
4147 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004148 sc->expectBGColor(32, 32);
4149 sc->expectFGColor(96, 96);
4150 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004151 }
4152
4153 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004154 asTransaction([&](Transaction& t) {
4155 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004156 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4157 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004158 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004159
Robert Carr4cdc58f2017-08-23 14:22:20 -07004160 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004161 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004162 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4163 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004164 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004165
4166 {
4167 SCOPED_TRACE("before any trigger");
4168 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004169 sc->expectBGColor(32, 32);
4170 sc->expectFGColor(96, 96);
4171 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004172 }
4173
4174 // should trigger the first deferred transaction, but not the second one
4175 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4176 {
4177 SCOPED_TRACE("after first trigger");
4178 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004179 sc->expectBGColor(32, 32);
4180 sc->checkPixel(96, 96, 162, 63, 96);
4181 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004182 }
4183
4184 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004185 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004186
4187 // trigger the second deferred transaction
4188 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4189 {
4190 SCOPED_TRACE("after second trigger");
4191 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004192 sc->expectBGColor(32, 32);
4193 sc->expectBGColor(96, 96);
4194 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004195 }
4196}
4197
Robert Carre392b552017-09-19 12:16:05 -07004198TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004199 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004200
4201 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004202 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4203 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4204 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4205 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004206 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004207 SurfaceComposerClient::Transaction{}
4208 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4209 .show(childNoBuffer)
4210 .show(childBuffer)
4211 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004212 {
4213 ScreenCapture::captureScreen(&sc);
4214 sc->expectChildColor(73, 73);
4215 sc->expectFGColor(74, 74);
4216 }
Vishnu Nair60356342018-11-13 13:00:45 -08004217 SurfaceComposerClient::Transaction{}
4218 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4219 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004220 {
4221 ScreenCapture::captureScreen(&sc);
4222 sc->expectChildColor(73, 73);
4223 sc->expectChildColor(74, 74);
4224 }
4225}
4226
Robert Carr2c5f6d22017-09-26 12:30:35 -07004227TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004228 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004229 {
4230 SCOPED_TRACE("before move");
4231 ScreenCapture::captureScreen(&sc);
4232 sc->expectBGColor(0, 12);
4233 sc->expectFGColor(75, 75);
4234 sc->expectBGColor(145, 145);
4235 }
4236
4237 Transaction t1, t2;
4238 t1.setPosition(mFGSurfaceControl, 128, 128);
4239 t2.setPosition(mFGSurfaceControl, 0, 0);
4240 // We expect that the position update from t2 now
4241 // overwrites the position update from t1.
4242 t1.merge(std::move(t2));
4243 t1.apply();
4244
4245 {
4246 ScreenCapture::captureScreen(&sc);
4247 sc->expectFGColor(1, 1);
4248 }
4249}
4250
Robert Carr1f0a16a2016-10-24 16:27:39 -07004251class ChildLayerTest : public LayerUpdateTest {
4252protected:
4253 void SetUp() override {
4254 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004255 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4256 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004257 fillSurfaceRGBA8(mChild, 200, 200, 200);
4258
4259 {
4260 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004261 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004262 mCapture->expectChildColor(64, 64);
4263 }
4264 }
4265 void TearDown() override {
4266 LayerUpdateTest::TearDown();
4267 mChild = 0;
4268 }
4269
4270 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004271 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004272};
4273
4274TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004275 asTransaction([&](Transaction& t) {
4276 t.show(mChild);
4277 t.setPosition(mChild, 10, 10);
4278 t.setPosition(mFGSurfaceControl, 64, 64);
4279 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004280
4281 {
chaviw0e3479f2018-09-10 16:49:30 -07004282 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004283 // Top left of foreground must now be visible
4284 mCapture->expectFGColor(64, 64);
4285 // But 10 pixels in we should see the child surface
4286 mCapture->expectChildColor(74, 74);
4287 // And 10 more pixels we should be back to the foreground surface
4288 mCapture->expectFGColor(84, 84);
4289 }
4290
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004291 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004292
4293 {
chaviw0e3479f2018-09-10 16:49:30 -07004294 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004295 // Top left of foreground should now be at 0, 0
4296 mCapture->expectFGColor(0, 0);
4297 // But 10 pixels in we should see the child surface
4298 mCapture->expectChildColor(10, 10);
4299 // And 10 more pixels we should be back to the foreground surface
4300 mCapture->expectFGColor(20, 20);
4301 }
4302}
4303
Robert Carr41b08b52017-06-01 16:11:34 -07004304TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004305 asTransaction([&](Transaction& t) {
4306 t.show(mChild);
4307 t.setPosition(mChild, 0, 0);
4308 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004309 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004310 });
Robert Carr41b08b52017-06-01 16:11:34 -07004311
4312 {
chaviw0e3479f2018-09-10 16:49:30 -07004313 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004314 mCapture->expectChildColor(0, 0);
4315 mCapture->expectChildColor(4, 4);
4316 mCapture->expectBGColor(5, 5);
4317 }
4318}
4319
Robert Carr1f0a16a2016-10-24 16:27:39 -07004320TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004321 asTransaction([&](Transaction& t) {
4322 t.show(mChild);
4323 t.setPosition(mFGSurfaceControl, 0, 0);
4324 t.setPosition(mChild, 63, 63);
4325 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004326
4327 {
chaviw0e3479f2018-09-10 16:49:30 -07004328 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004329 mCapture->expectFGColor(0, 0);
4330 // Last pixel in foreground should now be the child.
4331 mCapture->expectChildColor(63, 63);
4332 // But the child should be constrained and the next pixel
4333 // must be the background
4334 mCapture->expectBGColor(64, 64);
4335 }
4336}
4337
4338TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004339 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004340
4341 // Find the boundary between the parent and child
4342 {
chaviw0e3479f2018-09-10 16:49:30 -07004343 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004344 mCapture->expectChildColor(9, 9);
4345 mCapture->expectFGColor(10, 10);
4346 }
4347
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004348 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004349
4350 // The boundary should be twice as far from the origin now.
4351 // The pixels from the last test should all be child now
4352 {
chaviw0e3479f2018-09-10 16:49:30 -07004353 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004354 mCapture->expectChildColor(9, 9);
4355 mCapture->expectChildColor(10, 10);
4356 mCapture->expectChildColor(19, 19);
4357 mCapture->expectFGColor(20, 20);
4358 }
4359}
Robert Carr9524cb32017-02-13 11:32:32 -08004360
Robert Carr6452f122017-03-21 10:41:29 -07004361TEST_F(ChildLayerTest, ChildLayerAlpha) {
4362 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4363 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4364 fillSurfaceRGBA8(mChild, 0, 254, 0);
4365 waitForPostedBuffers();
4366
Robert Carr4cdc58f2017-08-23 14:22:20 -07004367 asTransaction([&](Transaction& t) {
4368 t.show(mChild);
4369 t.setPosition(mChild, 0, 0);
4370 t.setPosition(mFGSurfaceControl, 0, 0);
4371 });
Robert Carr6452f122017-03-21 10:41:29 -07004372
4373 {
chaviw0e3479f2018-09-10 16:49:30 -07004374 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004375 // Unblended child color
4376 mCapture->checkPixel(0, 0, 0, 254, 0);
4377 }
4378
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004379 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004380
4381 {
chaviw0e3479f2018-09-10 16:49:30 -07004382 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004383 // Child and BG blended.
4384 mCapture->checkPixel(0, 0, 127, 127, 0);
4385 }
4386
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004387 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004388
4389 {
chaviw0e3479f2018-09-10 16:49:30 -07004390 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004391 // Child and BG blended.
4392 mCapture->checkPixel(0, 0, 95, 64, 95);
4393 }
4394}
4395
Robert Carr9524cb32017-02-13 11:32:32 -08004396TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004397 asTransaction([&](Transaction& t) {
4398 t.show(mChild);
4399 t.setPosition(mChild, 10, 10);
4400 t.setPosition(mFGSurfaceControl, 64, 64);
4401 });
Robert Carr9524cb32017-02-13 11:32:32 -08004402
4403 {
chaviw0e3479f2018-09-10 16:49:30 -07004404 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004405 // Top left of foreground must now be visible
4406 mCapture->expectFGColor(64, 64);
4407 // But 10 pixels in we should see the child surface
4408 mCapture->expectChildColor(74, 74);
4409 // And 10 more pixels we should be back to the foreground surface
4410 mCapture->expectFGColor(84, 84);
4411 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004412
4413 asTransaction([&](Transaction& t) {
4414 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4415 });
4416
Robert Carr9524cb32017-02-13 11:32:32 -08004417 {
chaviw0e3479f2018-09-10 16:49:30 -07004418 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004419 mCapture->expectFGColor(64, 64);
4420 // In reparenting we should have exposed the entire foreground surface.
4421 mCapture->expectFGColor(74, 74);
4422 // And the child layer should now begin at 10, 10 (since the BG
4423 // layer is at (0, 0)).
4424 mCapture->expectBGColor(9, 9);
4425 mCapture->expectChildColor(10, 10);
4426 }
4427}
4428
Robert Carr2e102c92018-10-23 12:11:15 -07004429TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4430 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004431 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004432 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4433
4434 {
4435 SCOPED_TRACE("Grandchild visible");
4436 ScreenCapture::captureScreen(&mCapture);
4437 mCapture->checkPixel(64, 64, 111, 111, 111);
4438 }
4439
4440 mChild->clear();
4441
4442 {
4443 SCOPED_TRACE("After destroying child");
4444 ScreenCapture::captureScreen(&mCapture);
4445 mCapture->expectFGColor(64, 64);
4446 }
4447
4448 asTransaction([&](Transaction& t) {
4449 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4450 });
4451
4452 {
4453 SCOPED_TRACE("After reparenting grandchild");
4454 ScreenCapture::captureScreen(&mCapture);
4455 mCapture->checkPixel(64, 64, 111, 111, 111);
4456 }
4457}
4458
chaviw161410b02017-07-27 10:46:08 -07004459TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004460 asTransaction([&](Transaction& t) {
4461 t.show(mChild);
4462 t.setPosition(mChild, 10, 10);
4463 t.setPosition(mFGSurfaceControl, 64, 64);
4464 });
Robert Carr9524cb32017-02-13 11:32:32 -08004465
4466 {
chaviw0e3479f2018-09-10 16:49:30 -07004467 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004468 // Top left of foreground must now be visible
4469 mCapture->expectFGColor(64, 64);
4470 // But 10 pixels in we should see the child surface
4471 mCapture->expectChildColor(74, 74);
4472 // And 10 more pixels we should be back to the foreground surface
4473 mCapture->expectFGColor(84, 84);
4474 }
4475
chaviw0e3479f2018-09-10 16:49:30 -07004476
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004477 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004478
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004479 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004480
chaviw161410b02017-07-27 10:46:08 -07004481 // Since the child has the same client as the parent, it will not get
4482 // detached and will be hidden.
4483 {
chaviw0e3479f2018-09-10 16:49:30 -07004484 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004485 mCapture->expectFGColor(64, 64);
4486 mCapture->expectFGColor(74, 74);
4487 mCapture->expectFGColor(84, 84);
4488 }
4489}
4490
4491TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4492 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004493 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004494 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4495 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004496
chaviw161410b02017-07-27 10:46:08 -07004497 ASSERT_TRUE(mChildNewClient->isValid());
4498
4499 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4500
Robert Carr4cdc58f2017-08-23 14:22:20 -07004501 asTransaction([&](Transaction& t) {
4502 t.hide(mChild);
4503 t.show(mChildNewClient);
4504 t.setPosition(mChildNewClient, 10, 10);
4505 t.setPosition(mFGSurfaceControl, 64, 64);
4506 });
chaviw161410b02017-07-27 10:46:08 -07004507
4508 {
chaviw0e3479f2018-09-10 16:49:30 -07004509 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004510 // Top left of foreground must now be visible
4511 mCapture->expectFGColor(64, 64);
4512 // But 10 pixels in we should see the child surface
4513 mCapture->expectChildColor(74, 74);
4514 // And 10 more pixels we should be back to the foreground surface
4515 mCapture->expectFGColor(84, 84);
4516 }
4517
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004518 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004519
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004520 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004521
Robert Carr9524cb32017-02-13 11:32:32 -08004522 // Nothing should have changed.
4523 {
chaviw0e3479f2018-09-10 16:49:30 -07004524 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004525 mCapture->expectFGColor(64, 64);
4526 mCapture->expectChildColor(74, 74);
4527 mCapture->expectFGColor(84, 84);
4528 }
4529}
4530
chaviw5aedec92018-10-22 10:40:38 -07004531TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4532 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4533 sp<SurfaceControl> childNewClient =
4534 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4535 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4536
4537 ASSERT_TRUE(childNewClient != nullptr);
4538 ASSERT_TRUE(childNewClient->isValid());
4539
4540 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4541
4542 Transaction()
4543 .hide(mChild)
4544 .show(childNewClient)
4545 .setPosition(childNewClient, 10, 10)
4546 .setPosition(mFGSurfaceControl, 64, 64)
4547 .apply();
4548
4549 {
4550 mCapture = screenshot();
4551 // Top left of foreground must now be visible
4552 mCapture->expectFGColor(64, 64);
4553 // But 10 pixels in we should see the child surface
4554 mCapture->expectChildColor(74, 74);
4555 // And 10 more pixels we should be back to the foreground surface
4556 mCapture->expectFGColor(84, 84);
4557 }
4558
4559 Transaction().detachChildren(mFGSurfaceControl).apply();
4560 Transaction().hide(childNewClient).apply();
4561
4562 // Nothing should have changed.
4563 {
4564 mCapture = screenshot();
4565 mCapture->expectFGColor(64, 64);
4566 mCapture->expectChildColor(74, 74);
4567 mCapture->expectFGColor(84, 84);
4568 }
4569
4570 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4571 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4572 32);
4573 Transaction()
4574 .setLayer(newParentSurface, INT32_MAX - 1)
4575 .show(newParentSurface)
4576 .setPosition(newParentSurface, 20, 20)
4577 .reparent(childNewClient, newParentSurface->getHandle())
4578 .apply();
4579 {
4580 mCapture = screenshot();
4581 // Child is now hidden.
4582 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4583 }
4584}
4585
Robert Carr9b429f42017-04-17 14:56:57 -07004586TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004587 asTransaction([&](Transaction& t) {
4588 t.show(mChild);
4589 t.setPosition(mChild, 0, 0);
4590 t.setPosition(mFGSurfaceControl, 0, 0);
4591 });
Robert Carr9b429f42017-04-17 14:56:57 -07004592
4593 {
chaviw0e3479f2018-09-10 16:49:30 -07004594 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004595 // We've positioned the child in the top left.
4596 mCapture->expectChildColor(0, 0);
4597 // But it's only 10x10.
4598 mCapture->expectFGColor(10, 10);
4599 }
4600
Robert Carr4cdc58f2017-08-23 14:22:20 -07004601 asTransaction([&](Transaction& t) {
4602 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4603 // We cause scaling by 2.
4604 t.setSize(mFGSurfaceControl, 128, 128);
4605 });
Robert Carr9b429f42017-04-17 14:56:57 -07004606
4607 {
chaviw0e3479f2018-09-10 16:49:30 -07004608 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004609 // We've positioned the child in the top left.
4610 mCapture->expectChildColor(0, 0);
4611 mCapture->expectChildColor(10, 10);
4612 mCapture->expectChildColor(19, 19);
4613 // And now it should be scaled all the way to 20x20
4614 mCapture->expectFGColor(20, 20);
4615 }
4616}
4617
Robert Carr1725eee2017-04-26 18:32:15 -07004618// Regression test for b/37673612
4619TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004620 asTransaction([&](Transaction& t) {
4621 t.show(mChild);
4622 t.setPosition(mChild, 0, 0);
4623 t.setPosition(mFGSurfaceControl, 0, 0);
4624 });
Robert Carr1725eee2017-04-26 18:32:15 -07004625
4626 {
chaviw0e3479f2018-09-10 16:49:30 -07004627 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004628 // We've positioned the child in the top left.
4629 mCapture->expectChildColor(0, 0);
4630 // But it's only 10x10.
4631 mCapture->expectFGColor(10, 10);
4632 }
Robert Carr1725eee2017-04-26 18:32:15 -07004633 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4634 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004635 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004636 sp<Surface> s = mFGSurfaceControl->getSurface();
4637 auto anw = static_cast<ANativeWindow*>(s.get());
4638 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4639 native_window_set_buffers_dimensions(anw, 64, 128);
4640 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4641 waitForPostedBuffers();
4642
4643 {
4644 // The child should still be in the same place and not have any strange scaling as in
4645 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004646 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004647 mCapture->expectChildColor(0, 0);
4648 mCapture->expectFGColor(10, 10);
4649 }
4650}
4651
Dan Stoza412903f2017-04-27 13:42:17 -07004652TEST_F(ChildLayerTest, Bug36858924) {
4653 // Destroy the child layer
4654 mChild.clear();
4655
4656 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004657 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4658 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004659
4660 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004661 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004662 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4663 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004664 t.show(mChild);
4665 });
Dan Stoza412903f2017-04-27 13:42:17 -07004666
4667 // Render the foreground surface a few times
4668 //
4669 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4670 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4671 // never acquire/release the first buffer
4672 ALOGI("Filling 1");
4673 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4674 ALOGI("Filling 2");
4675 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4676 ALOGI("Filling 3");
4677 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4678 ALOGI("Filling 4");
4679 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4680}
4681
chaviwf1961f72017-09-18 16:41:07 -07004682TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004683 asTransaction([&](Transaction& t) {
4684 t.show(mChild);
4685 t.setPosition(mChild, 10, 10);
4686 t.setPosition(mFGSurfaceControl, 64, 64);
4687 });
chaviw06178942017-07-27 10:25:59 -07004688
4689 {
chaviw0e3479f2018-09-10 16:49:30 -07004690 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004691 // Top left of foreground must now be visible
4692 mCapture->expectFGColor(64, 64);
4693 // But 10 pixels in we should see the child surface
4694 mCapture->expectChildColor(74, 74);
4695 // And 10 more pixels we should be back to the foreground surface
4696 mCapture->expectFGColor(84, 84);
4697 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004698
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004699 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004700
chaviw06178942017-07-27 10:25:59 -07004701 {
chaviw0e3479f2018-09-10 16:49:30 -07004702 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004703 mCapture->expectFGColor(64, 64);
4704 // In reparenting we should have exposed the entire foreground surface.
4705 mCapture->expectFGColor(74, 74);
4706 // And the child layer should now begin at 10, 10 (since the BG
4707 // layer is at (0, 0)).
4708 mCapture->expectBGColor(9, 9);
4709 mCapture->expectChildColor(10, 10);
4710 }
4711}
4712
chaviwf1961f72017-09-18 16:41:07 -07004713TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004714 asTransaction([&](Transaction& t) {
4715 t.show(mChild);
4716 t.setPosition(mChild, 10, 10);
4717 t.setPosition(mFGSurfaceControl, 64, 64);
4718 });
chaviwf1961f72017-09-18 16:41:07 -07004719
4720 {
chaviw0e3479f2018-09-10 16:49:30 -07004721 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004722 // Top left of foreground must now be visible
4723 mCapture->expectFGColor(64, 64);
4724 // But 10 pixels in we should see the child surface
4725 mCapture->expectChildColor(74, 74);
4726 // And 10 more pixels we should be back to the foreground surface
4727 mCapture->expectFGColor(84, 84);
4728 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004729 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004730 {
chaviw0e3479f2018-09-10 16:49:30 -07004731 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004732 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004733 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004734 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004735 mCapture->expectFGColor(84, 84);
4736 }
4737}
4738
4739TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004740 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004741 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004742 ASSERT_TRUE(newSurface->isValid());
4743
4744 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004745 asTransaction([&](Transaction& t) {
4746 t.hide(mChild);
4747 t.show(newSurface);
4748 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004749 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004750 t.setPosition(mFGSurfaceControl, 64, 64);
4751 });
chaviwf1961f72017-09-18 16:41:07 -07004752
4753 {
chaviw0e3479f2018-09-10 16:49:30 -07004754 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004755 // Top left of foreground must now be visible
4756 mCapture->expectFGColor(64, 64);
4757 // At 10, 10 we should see the new surface
4758 mCapture->checkPixel(10, 10, 63, 195, 63);
4759 }
4760
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004761 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004762
4763 {
chaviw0e3479f2018-09-10 16:49:30 -07004764 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004765 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4766 // mFGSurface, putting it at 74, 74.
4767 mCapture->expectFGColor(64, 64);
4768 mCapture->checkPixel(74, 74, 63, 195, 63);
4769 mCapture->expectFGColor(84, 84);
4770 }
4771}
4772
chaviwc9674332017-08-28 12:32:18 -07004773TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004774 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4775 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004776 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4777
4778 {
chaviw0e3479f2018-09-10 16:49:30 -07004779 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004780 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4781 // which begins at 64, 64
4782 mCapture->checkPixel(64, 64, 50, 50, 50);
4783 }
4784}
4785
Robert Carr503c7042017-09-27 15:06:08 -07004786TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004787 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004788 fillSurfaceRGBA8(relative, 255, 255, 255);
4789
4790 Transaction t;
4791 t.setLayer(relative, INT32_MAX)
4792 .setRelativeLayer(mChild, relative->getHandle(), 1)
4793 .setPosition(mFGSurfaceControl, 0, 0)
4794 .apply(true);
4795
4796 // We expect that the child should have been elevated above our
4797 // INT_MAX layer even though it's not a child of it.
4798 {
chaviw0e3479f2018-09-10 16:49:30 -07004799 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004800 mCapture->expectChildColor(0, 0);
4801 mCapture->expectChildColor(9, 9);
4802 mCapture->checkPixel(10, 10, 255, 255, 255);
4803 }
4804}
Vishnu Nair60356342018-11-13 13:00:45 -08004805class BoundlessLayerTest : public LayerUpdateTest {
4806protected:
4807 std::unique_ptr<ScreenCapture> mCapture;
4808};
4809
4810// Verify setting a size on a buffer layer has no effect.
4811TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4812 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004813 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4814 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004815 ASSERT_TRUE(bufferLayer->isValid());
4816 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4817 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4818 {
4819 mCapture = screenshot();
4820 // Top left of background must now be visible
4821 mCapture->expectBGColor(0, 0);
4822 // Foreground Surface bounds must be color layer
4823 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4824 // Buffer layer should not extend past buffer bounds
4825 mCapture->expectFGColor(95, 95);
4826 }
4827}
4828
4829// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4830// which will crop the color layer.
4831TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4832 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004833 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4834 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004835 ASSERT_TRUE(colorLayer->isValid());
4836 asTransaction([&](Transaction& t) {
4837 t.setColor(colorLayer, half3{0, 0, 0});
4838 t.show(colorLayer);
4839 });
4840 {
4841 mCapture = screenshot();
4842 // Top left of background must now be visible
4843 mCapture->expectBGColor(0, 0);
4844 // Foreground Surface bounds must be color layer
4845 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4846 // Color layer should not extend past foreground bounds
4847 mCapture->expectBGColor(129, 129);
4848 }
4849}
4850
4851// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4852// a crop which will be used to crop the color layer.
4853TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004854 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4855 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004856 ASSERT_TRUE(cropLayer->isValid());
4857 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004858 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4859 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004860 ASSERT_TRUE(colorLayer->isValid());
4861 asTransaction([&](Transaction& t) {
4862 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4863 t.setColor(colorLayer, half3{0, 0, 0});
4864 t.show(cropLayer);
4865 t.show(colorLayer);
4866 });
4867 {
4868 mCapture = screenshot();
4869 // Top left of background must now be visible
4870 mCapture->expectBGColor(0, 0);
4871 // Top left of foreground must now be visible
4872 mCapture->expectFGColor(64, 64);
4873 // 5 pixels from the foreground we should see the child surface
4874 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4875 // 10 pixels from the foreground we should be back to the foreground surface
4876 mCapture->expectFGColor(74, 74);
4877 }
4878}
4879
4880// Verify for boundless layer with no children, their transforms have no effect.
4881TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4882 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004883 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4884 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004885 ASSERT_TRUE(colorLayer->isValid());
4886 asTransaction([&](Transaction& t) {
4887 t.setPosition(colorLayer, 320, 320);
4888 t.setMatrix(colorLayer, 2, 0, 0, 2);
4889 t.setColor(colorLayer, half3{0, 0, 0});
4890 t.show(colorLayer);
4891 });
4892 {
4893 mCapture = screenshot();
4894 // Top left of background must now be visible
4895 mCapture->expectBGColor(0, 0);
4896 // Foreground Surface bounds must be color layer
4897 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4898 // Color layer should not extend past foreground bounds
4899 mCapture->expectBGColor(129, 129);
4900 }
4901}
4902
4903// Verify for boundless layer with children, their transforms have an effect.
4904TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4905 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004906 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4907 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004908 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4909 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004910 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4911 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004912 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4913 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004914 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4915 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004916 ASSERT_TRUE(colorLayer->isValid());
4917 asTransaction([&](Transaction& t) {
4918 t.setPosition(boundlessLayerRightShift, 32, 0);
4919 t.show(boundlessLayerRightShift);
4920 t.setPosition(boundlessLayerDownShift, 0, 32);
4921 t.show(boundlessLayerDownShift);
4922 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4923 t.setColor(colorLayer, half3{0, 0, 0});
4924 t.show(colorLayer);
4925 });
4926 {
4927 mCapture = screenshot();
4928 // Top left of background must now be visible
4929 mCapture->expectBGColor(0, 0);
4930 // Top left of foreground must now be visible
4931 mCapture->expectFGColor(64, 64);
4932 // Foreground Surface bounds must be color layer
4933 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4934 // Color layer should not extend past foreground bounds
4935 mCapture->expectBGColor(129, 129);
4936 }
4937}
4938
4939// Verify child layers do not get clipped if they temporarily move into the negative
4940// coordinate space as the result of an intermediate transformation.
4941TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4942 sp<SurfaceControl> boundlessLayer =
4943 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4944 0 /* flags */, mFGSurfaceControl.get());
4945 ASSERT_TRUE(boundlessLayer != nullptr);
4946 ASSERT_TRUE(boundlessLayer->isValid());
4947 sp<SurfaceControl> colorLayer =
4948 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4949 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4950 ASSERT_TRUE(colorLayer != nullptr);
4951 ASSERT_TRUE(colorLayer->isValid());
4952 asTransaction([&](Transaction& t) {
4953 // shift child layer off bounds. If this layer was not boundless, we will
4954 // expect the child layer to be cropped.
4955 t.setPosition(boundlessLayer, 32, 32);
4956 t.show(boundlessLayer);
4957 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4958 // undo shift by parent
4959 t.setPosition(colorLayer, -32, -32);
4960 t.setColor(colorLayer, half3{0, 0, 0});
4961 t.show(colorLayer);
4962 });
4963 {
4964 mCapture = screenshot();
4965 // Top left of background must now be visible
4966 mCapture->expectBGColor(0, 0);
4967 // Foreground Surface bounds must be color layer
4968 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4969 // Color layer should not extend past foreground bounds
4970 mCapture->expectBGColor(129, 129);
4971 }
4972}
4973
4974// Verify for boundless root layers with children, their transforms have an effect.
4975TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004976 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4977 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004978 ASSERT_TRUE(rootBoundlessLayer->isValid());
4979 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004980 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4981 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4982
Vishnu Nair60356342018-11-13 13:00:45 -08004983 ASSERT_TRUE(colorLayer->isValid());
4984 asTransaction([&](Transaction& t) {
4985 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4986 t.setPosition(rootBoundlessLayer, 32, 32);
4987 t.show(rootBoundlessLayer);
4988 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4989 t.setColor(colorLayer, half3{0, 0, 0});
4990 t.show(colorLayer);
4991 t.hide(mFGSurfaceControl);
4992 });
4993 {
4994 mCapture = screenshot();
4995 // Top left of background must now be visible
4996 mCapture->expectBGColor(0, 0);
4997 // Top left of foreground must now be visible
4998 mCapture->expectBGColor(31, 31);
4999 // Foreground Surface bounds must be color layer
5000 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5001 // Color layer should not extend past foreground bounds
5002 mCapture->expectBGColor(97, 97);
5003 }
5004}
Robert Carr503c7042017-09-27 15:06:08 -07005005
chaviwa76b2712017-09-20 12:02:26 -07005006class ScreenCaptureTest : public LayerUpdateTest {
5007protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005008 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005009};
5010
5011TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5012 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005013 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005014 mCapture->expectBGColor(0, 0);
5015 // Doesn't capture FG layer which is at 64, 64
5016 mCapture->expectBGColor(64, 64);
5017}
5018
5019TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5020 auto fgHandle = mFGSurfaceControl->getHandle();
5021
Vishnu Nair88a11f22018-11-28 18:30:57 -08005022 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5023 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005024 fillSurfaceRGBA8(child, 200, 200, 200);
5025
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005026 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005027
5028 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005029 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005030 mCapture->expectFGColor(10, 10);
5031 mCapture->expectChildColor(0, 0);
5032}
5033
Robert Carr578038f2018-03-09 12:25:24 -08005034TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5035 auto fgHandle = mFGSurfaceControl->getHandle();
5036
Vishnu Nair88a11f22018-11-28 18:30:57 -08005037 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5038 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005039 fillSurfaceRGBA8(child, 200, 200, 200);
5040
5041 SurfaceComposerClient::Transaction().show(child).apply(true);
5042
5043 // Captures mFGSurfaceControl's child
5044 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5045 mCapture->checkPixel(10, 10, 0, 0, 0);
5046 mCapture->expectChildColor(0, 0);
5047}
5048
chaviw50da5042018-04-09 13:49:37 -07005049TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005050 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5051 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005052
5053 fillSurfaceRGBA8(child, 200, 200, 200);
5054
5055 SurfaceComposerClient::Transaction().show(child).apply(true);
5056
5057 auto childHandle = child->getHandle();
5058
5059 // Captures child
5060 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5061 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5062 // Area outside of child's bounds is transparent.
5063 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5064}
5065
chaviw4b129c22018-04-09 16:19:43 -07005066TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5067 auto fgHandle = mFGSurfaceControl->getHandle();
5068
Vishnu Nair88a11f22018-11-28 18:30:57 -08005069 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5070 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5071 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005072 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005073 fillSurfaceRGBA8(child, 200, 200, 200);
5074 fillSurfaceRGBA8(relative, 100, 100, 100);
5075
5076 SurfaceComposerClient::Transaction()
5077 .show(child)
5078 // Set relative layer above fg layer so should be shown above when computing all layers.
5079 .setRelativeLayer(relative, fgHandle, 1)
5080 .show(relative)
5081 .apply(true);
5082
5083 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5084 ScreenCapture::captureLayers(&mCapture, fgHandle);
5085 mCapture->expectFGColor(10, 10);
5086 mCapture->expectChildColor(0, 0);
5087}
5088
5089TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5090 auto fgHandle = mFGSurfaceControl->getHandle();
5091
Vishnu Nair88a11f22018-11-28 18:30:57 -08005092 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5093 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5094 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5095 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005096 fillSurfaceRGBA8(child, 200, 200, 200);
5097 fillSurfaceRGBA8(relative, 100, 100, 100);
5098
5099 SurfaceComposerClient::Transaction()
5100 .show(child)
5101 // Set relative layer below fg layer but relative to child layer so it should be shown
5102 // above child layer.
5103 .setLayer(relative, -1)
5104 .setRelativeLayer(relative, child->getHandle(), 1)
5105 .show(relative)
5106 .apply(true);
5107
5108 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5109 // relative value should be taken into account, placing it above child layer.
5110 ScreenCapture::captureLayers(&mCapture, fgHandle);
5111 mCapture->expectFGColor(10, 10);
5112 // Relative layer is showing on top of child layer
5113 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5114}
Robert Carr578038f2018-03-09 12:25:24 -08005115
5116// In the following tests we verify successful skipping of a parent layer,
5117// so we use the same verification logic and only change how we mutate
5118// the parent layer to verify that various properties are ignored.
5119class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5120public:
5121 void SetUp() override {
5122 LayerUpdateTest::SetUp();
5123
Vishnu Nair88a11f22018-11-28 18:30:57 -08005124 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5125 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005126 fillSurfaceRGBA8(mChild, 200, 200, 200);
5127
5128 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5129 }
5130
5131 void verify() {
5132 auto fgHandle = mFGSurfaceControl->getHandle();
5133 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5134 mCapture->checkPixel(10, 10, 0, 0, 0);
5135 mCapture->expectChildColor(0, 0);
5136 }
5137
5138 std::unique_ptr<ScreenCapture> mCapture;
5139 sp<SurfaceControl> mChild;
5140};
5141
5142TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5143
5144 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5145
5146 // Even though the parent is hidden we should still capture the child.
5147 verify();
5148}
5149
5150TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005151 SurfaceComposerClient::Transaction()
5152 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5153 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005154
5155 // Even though the parent is cropped out we should still capture the child.
5156 verify();
5157}
5158
5159TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
5160
5161 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2);
5162
5163 // We should not inherit the parent scaling.
5164 verify();
5165}
5166
Robert Carr15eae092018-03-23 13:43:53 -07005167TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) {
5168 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5169
5170 // Even though the parent is hidden we should still capture the child.
5171 verify();
5172
5173 // Verify everything was properly hidden when rendering the full-screen.
5174 screenshot()->expectBGColor(0,0);
5175}
5176
5177
chaviwa76b2712017-09-20 12:02:26 -07005178TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5179 auto fgHandle = mFGSurfaceControl->getHandle();
5180
Vishnu Nair88a11f22018-11-28 18:30:57 -08005181 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5182 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005183 fillSurfaceRGBA8(child, 200, 200, 200);
5184
Vishnu Nair88a11f22018-11-28 18:30:57 -08005185 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5186 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005187
5188 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5189 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005190 .show(child)
5191 .setPosition(grandchild, 5, 5)
5192 .show(grandchild)
5193 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005194
5195 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005196 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005197 mCapture->expectFGColor(10, 10);
5198 mCapture->expectChildColor(0, 0);
5199 mCapture->checkPixel(5, 5, 50, 50, 50);
5200}
5201
5202TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005203 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5204 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005205 fillSurfaceRGBA8(child, 200, 200, 200);
5206 auto childHandle = child->getHandle();
5207
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005208 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005209
5210 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005211 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005212 mCapture->expectChildColor(0, 0);
5213 mCapture->expectChildColor(9, 9);
5214}
5215
5216TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005217 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5218 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005219 fillSurfaceRGBA8(child, 200, 200, 200);
5220 auto childHandle = child->getHandle();
5221
Vishnu Nair88a11f22018-11-28 18:30:57 -08005222 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5223 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005224 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5225
5226 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005227 .show(child)
5228 .setPosition(grandchild, 5, 5)
5229 .show(grandchild)
5230 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005231
5232 auto grandchildHandle = grandchild->getHandle();
5233
5234 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005235 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005236 mCapture->checkPixel(0, 0, 50, 50, 50);
5237 mCapture->checkPixel(4, 4, 50, 50, 50);
5238}
5239
chaviw7206d492017-11-10 16:16:12 -08005240TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005241 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005242 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5243 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005244
Marissa Wall61c58622018-07-18 10:12:20 -07005245 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5246 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005247
5248 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005249 .setLayer(redLayer, INT32_MAX - 1)
5250 .show(redLayer)
5251 .show(blueLayer)
5252 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005253
5254 auto redLayerHandle = redLayer->getHandle();
5255
5256 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005257 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5258 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5259 // red area below the blue area
5260 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5261 // red area to the right of the blue area
5262 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005263
Marissa Wall861616d2018-10-22 12:52:23 -07005264 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005265 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005266 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5267 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005268 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005269 mCapture->checkPixel(30, 30, 0, 0, 0);
5270}
5271
5272TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005273 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005274 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5275 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005276
Marissa Wall61c58622018-07-18 10:12:20 -07005277 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5278 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005279
5280 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005281 .setLayer(redLayer, INT32_MAX - 1)
5282 .show(redLayer)
5283 .show(blueLayer)
5284 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005285
5286 auto redLayerHandle = redLayer->getHandle();
5287
5288 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005289 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5290 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5291 // red area below the blue area
5292 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5293 // red area to the right of the blue area
5294 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005295
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005296 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005297 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005298 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5299 // red area below the blue area
5300 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5301 // red area to the right of the blue area
5302 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005303 mCapture->checkPixel(30, 30, 0, 0, 0);
5304}
5305
5306TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005307 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005308
Marissa Wall61c58622018-07-18 10:12:20 -07005309 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005310
5311 auto redLayerHandle = redLayer->getHandle();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005312 redLayer->clear();
chaviw7206d492017-11-10 16:16:12 -08005313 SurfaceComposerClient::Transaction().apply(true);
5314
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005315 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005316
5317 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005318 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5319 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005320}
5321
chaviw8e3fe5d2018-02-22 10:55:42 -08005322
5323class DereferenceSurfaceControlTest : public LayerTransactionTest {
5324protected:
5325 void SetUp() override {
5326 LayerTransactionTest::SetUp();
5327 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005328 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005329 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005330 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005331 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5332 {
5333 SCOPED_TRACE("before anything");
5334 auto shot = screenshot();
5335 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5336 }
5337 }
5338 void TearDown() override {
5339 LayerTransactionTest::TearDown();
5340 bgLayer = 0;
5341 fgLayer = 0;
5342 }
5343
5344 sp<SurfaceControl> bgLayer;
5345 sp<SurfaceControl> fgLayer;
5346};
5347
5348TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5349 fgLayer = nullptr;
5350 {
5351 SCOPED_TRACE("after setting null");
5352 auto shot = screenshot();
5353 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5354 }
5355}
5356
5357TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5358 auto transaction = Transaction().show(fgLayer);
5359 fgLayer = nullptr;
5360 {
5361 SCOPED_TRACE("after setting null");
5362 auto shot = screenshot();
5363 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5364 }
5365}
5366
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005367} // namespace android