blob: 37703176662ce7ee0c362401db569d979ffd4398 [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
35#include <private/gui/ComposerService.h>
36
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070037#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070038#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070039#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070040#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070041
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070042#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070043#include <math/vec3.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044
Marissa Wall713b63f2018-10-17 15:42:43 -070045#include "BufferGenerator.h"
46
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070047namespace android {
48
Chia-I Wu718daf82017-10-20 11:57:17 -070049namespace {
50
51struct Color {
52 uint8_t r;
53 uint8_t g;
54 uint8_t b;
55 uint8_t a;
56
57 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070058 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070059 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070060 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070061 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070062 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070063};
64
65const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070066const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070067const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070068const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070069const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070070const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070073using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070074
Chia-I Wu718daf82017-10-20 11:57:17 -070075std::ostream& operator<<(std::ostream& os, const Color& color) {
76 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
77 return os;
78}
79
80// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070081void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
82 const Color& color) {
83 Rect r(0, 0, buffer.width, buffer.height);
84 if (!r.intersect(rect, &r)) {
85 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070086 }
87
Marissa Wall61c58622018-07-18 10:12:20 -070088 int32_t width = r.right - r.left;
89 int32_t height = r.bottom - r.top;
90
91 for (int32_t row = 0; row < height; row++) {
92 uint8_t* dst =
93 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
94 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070095 dst[0] = color.r;
96 dst[1] = color.g;
97 dst[2] = color.b;
98 dst[3] = color.a;
99 dst += 4;
100 }
101 }
102}
103
Marissa Wall61c58622018-07-18 10:12:20 -0700104// Fill a region with the specified color.
105void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
106 Rect r(0, 0, buffer->width, buffer->height);
107 if (!r.intersect(rect, &r)) {
108 return;
109 }
110
111 int32_t width = r.right - r.left;
112 int32_t height = r.bottom - r.top;
113
114 uint8_t* pixels;
115 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
116 reinterpret_cast<void**>(&pixels));
117
118 for (int32_t row = 0; row < height; row++) {
119 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
120 for (int32_t column = 0; column < width; column++) {
121 dst[0] = color.r;
122 dst[1] = color.g;
123 dst[2] = color.b;
124 dst[3] = color.a;
125 dst += 4;
126 }
127 }
128 buffer->unlock();
129}
130
Chia-I Wu718daf82017-10-20 11:57:17 -0700131// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000132void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700133 const Color& color, uint8_t tolerance) {
134 int32_t x = rect.left;
135 int32_t y = rect.top;
136 int32_t width = rect.right - rect.left;
137 int32_t height = rect.bottom - rect.top;
138
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000139 int32_t bufferWidth = int32_t(outBuffer->getWidth());
140 int32_t bufferHeight = int32_t(outBuffer->getHeight());
141 if (x + width > bufferWidth) {
142 x = std::min(x, bufferWidth);
143 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700144 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000145 if (y + height > bufferHeight) {
146 y = std::min(y, bufferHeight);
147 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
149
150 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
151 uint8_t tmp = a >= b ? a - b : b - a;
152 return tmp <= tolerance;
153 };
154 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000155 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700156 for (int32_t i = 0; i < width; i++) {
157 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
158 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
159 << "pixel @ (" << x + i << ", " << y + j << "): "
160 << "expected (" << color << "), "
161 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
162 src += 4;
163 }
164 }
165}
166
167} // anonymous namespace
168
Robert Carr4cdc58f2017-08-23 14:22:20 -0700169using Transaction = SurfaceComposerClient::Transaction;
170
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700171// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700172static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
173 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800174 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800176 ASSERT_TRUE(s != nullptr);
177 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700179 for (int y = 0; y < outBuffer.height; y++) {
180 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700181 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700182 pixel[0] = r;
183 pixel[1] = g;
184 pixel[2] = b;
185 pixel[3] = 255;
186 }
187 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700188 if (unlock) {
189 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
190 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700191}
192
193// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
194// individual pixel values for testing purposes.
195class ScreenCapture : public RefBase {
196public:
chaviw0e3479f2018-09-10 16:49:30 -0700197 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800198 const auto sf = ComposerService::getComposerService();
199 const auto token = sf->getInternalDisplayToken();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700200 SurfaceComposerClient::Transaction().apply(true);
201
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000202 sp<GraphicBuffer> outBuffer;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800203 ASSERT_EQ(NO_ERROR, sf->captureScreen(token, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700204 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000205 }
206
207 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
208 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
209 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
210 SurfaceComposerClient::Transaction().apply(true);
211
212 sp<GraphicBuffer> outBuffer;
213 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
214 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700215 }
216
Robert Carr578038f2018-03-09 12:25:24 -0800217 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
218 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
219 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
220 SurfaceComposerClient::Transaction().apply(true);
221
222 sp<GraphicBuffer> outBuffer;
223 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
224 *sc = std::make_unique<ScreenCapture>(outBuffer);
225 }
226
Chia-I Wu718daf82017-10-20 11:57:17 -0700227 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000228 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
229 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700230 }
231
232 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000233 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700234 const bool leftBorder = rect.left > 0;
235 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000236 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
237 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700238
239 if (topBorder) {
240 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
241 if (leftBorder) {
242 top.left -= 1;
243 }
244 if (rightBorder) {
245 top.right += 1;
246 }
247 expectColor(top, color, tolerance);
248 }
249 if (leftBorder) {
250 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
251 expectColor(left, color, tolerance);
252 }
253 if (rightBorder) {
254 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
255 expectColor(right, color, tolerance);
256 }
257 if (bottomBorder) {
258 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
259 if (leftBorder) {
260 bottom.left -= 1;
261 }
262 if (rightBorder) {
263 bottom.right += 1;
264 }
265 expectColor(bottom, color, tolerance);
266 }
267 }
268
Chia-I Wu93853fe2017-11-02 08:30:27 -0700269 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
270 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
271 uint8_t tolerance = 0) {
272 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
273
274 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
275 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
276 // avoid checking borders due to unspecified filtering behavior
277 const int32_t offsetX = filtered ? 2 : 0;
278 const int32_t offsetY = filtered ? 2 : 0;
279 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
280 tolerance);
281 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
282 tolerance);
283 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
284 tolerance);
285 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
286 bottomRight, tolerance);
287 }
288
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700289 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000290 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
291 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700292 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
293 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700294 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
295 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700296 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700297 }
298 }
299
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700300 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700301
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700302 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700303
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700304 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700305
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800306 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000307 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700308 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700309
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000310 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700311
312private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000313 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800314 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700315};
316
Chia-I Wu718daf82017-10-20 11:57:17 -0700317class LayerTransactionTest : public ::testing::Test {
318protected:
319 void SetUp() override {
320 mClient = new SurfaceComposerClient;
321 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
322
323 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700324
325 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700326 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700327 }
328
chaviw0e3479f2018-09-10 16:49:30 -0700329 virtual void TearDown() {
330 mBlackBgSurface = 0;
331 mClient->dispose();
332 mClient = 0;
333 }
334
Marissa Wallfda30bb2018-10-12 11:34:28 -0700335 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
336 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800337 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
338 auto layer =
339 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700340
Vishnu Nair60356342018-11-13 13:00:45 -0800341 Transaction t;
342 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800343
344 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700345 if (error != NO_ERROR) {
346 ADD_FAILURE() << "failed to initialize SurfaceControl";
347 layer.clear();
348 }
349
350 return layer;
351 }
352
Vishnu Nair88a11f22018-11-28 18:30:57 -0800353 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
354 const char* name, uint32_t width, uint32_t height,
355 PixelFormat format, uint32_t flags,
356 SurfaceControl* parent = nullptr) {
357 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
358 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
359 return layer;
360 }
361
Marissa Wallfda30bb2018-10-12 11:34:28 -0700362 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800363 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
364 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700365 }
366
Marissa Wall61c58622018-07-18 10:12:20 -0700367 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700368 // wait for previous transactions (such as setSize) to complete
369 Transaction().apply(true);
370
371 ANativeWindow_Buffer buffer = {};
372 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
373
374 return buffer;
375 }
376
Marissa Wall61c58622018-07-18 10:12:20 -0700377 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700378 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
379
380 // wait for the newly posted buffer to be latched
381 waitForLayerBuffers();
382 }
383
Marissa Wall61c58622018-07-18 10:12:20 -0700384 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
385 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700386 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700387 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
388 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
389 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700390 }
391
Marissa Wall61c58622018-07-18 10:12:20 -0700392 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
393 int32_t bufferWidth, int32_t bufferHeight) {
394 sp<GraphicBuffer> buffer =
395 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
396 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
397 BufferUsage::COMPOSER_OVERLAY,
398 "test");
399 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700400 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700401 }
402
403 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
404 int32_t bufferWidth, int32_t bufferHeight) {
405 switch (mLayerType) {
406 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
407 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
408 break;
409 case ISurfaceComposerClient::eFXSurfaceBufferState:
410 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
411 break;
412 default:
413 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
414 }
415 }
416
417 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
418 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700419 const Color& topRight, const Color& bottomLeft,
420 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700421 switch (mLayerType) {
422 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
423 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
424 bottomLeft, bottomRight);
425 break;
426 case ISurfaceComposerClient::eFXSurfaceBufferState:
427 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
428 bottomLeft, bottomRight);
429 break;
430 default:
431 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
432 }
433 }
434
435 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
436 int32_t bufferHeight, const Color& topLeft,
437 const Color& topRight, const Color& bottomLeft,
438 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700439 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700440 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
441 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700442
Marissa Wall61c58622018-07-18 10:12:20 -0700443 const int32_t halfW = bufferWidth / 2;
444 const int32_t halfH = bufferHeight / 2;
445 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
446 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
447 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
448 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
449 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700450
Marissa Wall61c58622018-07-18 10:12:20 -0700451 postBufferQueueLayerBuffer(layer);
452 }
453
454 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
455 int32_t bufferHeight, const Color& topLeft,
456 const Color& topRight, const Color& bottomLeft,
457 const Color& bottomRight) {
458 sp<GraphicBuffer> buffer =
459 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
460 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
461 BufferUsage::COMPOSER_OVERLAY,
462 "test");
463
464 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
465
466 const int32_t halfW = bufferWidth / 2;
467 const int32_t halfH = bufferHeight / 2;
468 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
469 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
470 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
471 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
472
473 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700474 }
475
chaviw0e3479f2018-09-10 16:49:30 -0700476 std::unique_ptr<ScreenCapture> screenshot() {
477 std::unique_ptr<ScreenCapture> screenshot;
478 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700479 return screenshot;
480 }
481
Marissa Wall713b63f2018-10-17 15:42:43 -0700482 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
483 static BufferGenerator bufferGenerator;
484 return bufferGenerator.get(outBuffer, outFence);
485 }
486
Chia-I Wu718daf82017-10-20 11:57:17 -0700487 sp<SurfaceComposerClient> mClient;
488
489 sp<IBinder> mDisplay;
490 uint32_t mDisplayWidth;
491 uint32_t mDisplayHeight;
492 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700493 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700494
495 // leave room for ~256 layers
496 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
497
chaviw0e3479f2018-09-10 16:49:30 -0700498 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700499 bool mColorManagementUsed;
500
Chia-I Wu718daf82017-10-20 11:57:17 -0700501private:
502 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800503 mDisplay = mClient->getInternalDisplayToken();
504 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700505
506 // get display width/height
507 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800508 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700509 mDisplayWidth = info.w;
510 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700511 mDisplayRect =
512 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700513
514 // After a new buffer is queued, SurfaceFlinger is notified and will
515 // latch the new buffer on next vsync. Let's heuristically wait for 3
516 // vsyncs.
517 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
518
519 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700520
Vishnu Nair88a11f22018-11-28 18:30:57 -0800521 mBlackBgSurface =
522 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
523 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700524
Chia-I Wu718daf82017-10-20 11:57:17 -0700525 // set layer stack (b/68888219)
526 Transaction t;
527 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800528 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700529 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
530 t.setColor(mBlackBgSurface, half3{0, 0, 0});
531 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700532 t.apply();
533 }
534
chaviw0e3479f2018-09-10 16:49:30 -0700535 void waitForLayerBuffers() {
536 // Request an empty transaction to get applied synchronously to ensure the buffer is
537 // latched.
538 Transaction().apply(true);
539 usleep(mBufferPostDelay);
540 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700541
542 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800543
544 friend class LayerRenderPathTestHarness;
545};
546enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
547
548class LayerRenderPathTestHarness {
549public:
550 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
551 : mDelegate(delegate), mRenderPath(renderPath) {}
552
553 std::unique_ptr<ScreenCapture> getScreenCapture() {
554 switch (mRenderPath) {
555 case RenderPath::SCREENSHOT:
556 return mDelegate->screenshot();
557 case RenderPath::VIRTUAL_DISPLAY:
558
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800559 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800560 DisplayInfo mainDisplayInfo;
561 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
562
563 sp<IBinder> vDisplay;
564 sp<IGraphicBufferProducer> producer;
565 sp<IGraphicBufferConsumer> consumer;
566 sp<BufferItemConsumer> itemConsumer;
567 BufferQueue::createBufferQueue(&producer, &consumer);
568
569 consumer->setConsumerName(String8("Virtual disp consumer"));
570 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
571
572 itemConsumer = new BufferItemConsumer(consumer,
573 // Sample usage bits from screenrecord
574 GRALLOC_USAGE_HW_VIDEO_ENCODER |
575 GRALLOC_USAGE_SW_READ_OFTEN);
576
577 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
578 false /*secure*/);
579
580 SurfaceComposerClient::Transaction t;
581 t.setDisplaySurface(vDisplay, producer);
582 t.setDisplayLayerStack(vDisplay, 0);
583 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
584 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
585 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
586 t.apply();
587 SurfaceComposerClient::Transaction().apply(true);
588 BufferItem item;
589 itemConsumer->acquireBuffer(&item, 0, true);
590 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
591 itemConsumer->releaseBuffer(item);
592 SurfaceComposerClient::destroyDisplay(vDisplay);
593 return sc;
594 }
595 }
596
597protected:
598 LayerTransactionTest* mDelegate;
599 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700600};
601
Alec Mouri80863a62019-01-17 15:19:35 -0800602class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700603public:
Alec Mouri80863a62019-01-17 15:19:35 -0800604 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700605
606 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800607 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700608 // if the flags already have a layer type specified, return an error
609 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
610 return nullptr;
611 }
chaviwf66724d2018-11-28 16:35:21 -0800612 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700613 }
614
615 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
616 int32_t bufferHeight) {
617 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
618 bufferWidth, bufferHeight));
619 }
620
621 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
622 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
623 const Color& bottomLeft, const Color& bottomRight) {
624 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
625 bufferWidth, bufferHeight,
626 topLeft, topRight,
627 bottomLeft, bottomRight));
628 }
629
630protected:
631 uint32_t mLayerType;
632};
633
Alec Mouri80863a62019-01-17 15:19:35 -0800634class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
635 public ::testing::WithParamInterface<uint32_t> {
636public:
637 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
638};
639
640class LayerTypeAndRenderTypeTransactionTest
641 : public LayerTypeTransactionHarness,
642 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
643public:
644 LayerTypeAndRenderTypeTransactionTest()
645 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
646 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
647
648 std::unique_ptr<ScreenCapture> getScreenCapture() {
649 return mRenderPathHarness.getScreenCapture();
650 }
651
652protected:
653 LayerRenderPathTestHarness mRenderPathHarness;
654};
655
656// Environment for starting up binder threads. This is required for testing
657// virtual displays, as BufferQueue parameters may be queried over binder.
658class BinderEnvironment : public ::testing::Environment {
659public:
660 void SetUp() override { ProcessState::self()->startThreadPool(); }
661};
662
663::testing::Environment* const binderEnv =
664 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
665
666class LayerRenderTypeTransactionTest : public LayerTransactionTest,
667 public ::testing::WithParamInterface<RenderPath> {
668public:
669 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
670
671 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
672 void setRelativeZBasicHelper(uint32_t layerType);
673 void setRelativeZGroupHelper(uint32_t layerType);
674 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800675 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
676 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800677
678protected:
679 LayerRenderPathTestHarness mHarness;
680};
681
682INSTANTIATE_TEST_CASE_P(
683 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
684 ::testing::Combine(
685 ::testing::Values(
686 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
687 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
688 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
689
690INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
691 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
692
Marissa Wall61c58622018-07-18 10:12:20 -0700693INSTANTIATE_TEST_CASE_P(
694 LayerTypeTransactionTests, LayerTypeTransactionTest,
695 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
696 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
697
Alec Mouri80863a62019-01-17 15:19:35 -0800698TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700699 sp<SurfaceControl> layer;
700 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700701 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700702
703 {
704 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700705 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800706 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700707 shot->expectColor(rect, Color::RED);
708 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700709 }
710
711 Transaction().setPosition(layer, 5, 10).apply();
712 {
713 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700714 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800715 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700716 shot->expectColor(rect, Color::RED);
717 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700718 }
719}
720
Alec Mouri80863a62019-01-17 15:19:35 -0800721TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700722 sp<SurfaceControl> layer;
723 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700724 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700725
726 // GLES requires only 4 bits of subpixel precision during rasterization
727 // XXX GLES composition does not match HWC composition due to precision
728 // loss (b/69315223)
729 const float epsilon = 1.0f / 16.0f;
730 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
731 {
732 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800733 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700734 }
735
736 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
737 {
738 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800739 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700740 }
741}
742
Alec Mouri80863a62019-01-17 15:19:35 -0800743TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700744 sp<SurfaceControl> layer;
745 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700746 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700747
748 Transaction().setPosition(layer, -32, -32).apply();
749 {
750 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800751 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700752 }
753
754 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
755 {
756 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800757 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700758 }
759}
760
Alec Mouri80863a62019-01-17 15:19:35 -0800761TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700762 sp<SurfaceControl> layer;
763 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700764 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700765
766 // partially out of bounds
767 Transaction().setPosition(layer, -30, -30).apply();
768 {
769 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800770 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 }
772
773 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
774 {
775 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800776 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
777 mDisplayHeight),
778 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700779 }
780}
781
Alec Mouri80863a62019-01-17 15:19:35 -0800782TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700783 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700784 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
785 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700786
787 // setPosition is applied immediately by default, with or without resize
788 // pending
789 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
790 {
791 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800792 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700793 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700794 shot->expectColor(rect, Color::RED);
795 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700796 }
797
Marissa Wall861616d2018-10-22 12:52:23 -0700798 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700799 {
800 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800801 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 }
803}
804
Alec Mouri80863a62019-01-17 15:19:35 -0800805TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700806 sp<SurfaceControl> layer;
807 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700808 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700809
810 // request setPosition to be applied with the next resize
811 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
812 {
813 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800814 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700815 }
816
817 Transaction().setPosition(layer, 15, 20).apply();
818 {
819 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800820 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700821 }
822
823 Transaction().setSize(layer, 64, 64).apply();
824 {
825 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800826 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700827 }
828
829 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700830 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700831 {
832 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800833 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 }
835}
836
Alec Mouri80863a62019-01-17 15:19:35 -0800837TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700838 sp<SurfaceControl> layer;
839 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700840 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700841
842 // setPosition is not immediate even with SCALE_TO_WINDOW override
843 Transaction()
844 .setPosition(layer, 5, 10)
845 .setSize(layer, 64, 64)
846 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
847 .setGeometryAppliesWithResize(layer)
848 .apply();
849 {
850 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800851 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700852 }
853
Marissa Wall61c58622018-07-18 10:12:20 -0700854 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 {
856 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800857 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 }
859}
860
Alec Mouri80863a62019-01-17 15:19:35 -0800861TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700862 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700863 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
864 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700865
866 Transaction().setSize(layer, 64, 64).apply();
867 {
868 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800869 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700870 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700871 shot->expectColor(rect, Color::RED);
872 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700873 }
874
Marissa Wall861616d2018-10-22 12:52:23 -0700875 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700876 {
877 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800878 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700879 const Rect rect(0, 0, 64, 64);
880 shot->expectColor(rect, Color::RED);
881 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700882 }
883}
884
Alec Mouri80863a62019-01-17 15:19:35 -0800885TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700886 // cannot test robustness against invalid sizes (zero or really huge)
887}
888
Alec Mouri80863a62019-01-17 15:19:35 -0800889TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700890 sp<SurfaceControl> layer;
891 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700892 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700893
894 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
895 Transaction()
896 .setSize(layer, 64, 64)
897 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
898 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800899 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700900}
901
Alec Mouri80863a62019-01-17 15:19:35 -0800902TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700903 sp<SurfaceControl> layerR;
904 sp<SurfaceControl> layerG;
905 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700906 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700907 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700908 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700909
910 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
911 {
912 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800913 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700914 }
915
916 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
917 {
918 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800919 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700920 }
921}
922
Alec Mouri80863a62019-01-17 15:19:35 -0800923TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700924 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800925 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700926 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800927 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700928 sp<SurfaceControl> layerR;
929 sp<SurfaceControl> layerG;
930 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700931 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700932 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700933 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700934
chaviw0e3479f2018-09-10 16:49:30 -0700935 Transaction()
936 .reparent(layerR, parent->getHandle())
937 .reparent(layerG, parent->getHandle())
938 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700939 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
940 {
941 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800942 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700943 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700944 }
945
946 Transaction().setLayer(layerR, -3).apply();
947 {
948 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800949 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700950 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700951 }
952}
953
Alec Mouri80863a62019-01-17 15:19:35 -0800954void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700955 sp<SurfaceControl> layerR;
956 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700957 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
958 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
959 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
960 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700961
Marissa Wall861616d2018-10-22 12:52:23 -0700962 switch (layerType) {
963 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
964 Transaction()
965 .setPosition(layerG, 16, 16)
966 .setRelativeLayer(layerG, layerR->getHandle(), 1)
967 .apply();
968 break;
969 case ISurfaceComposerClient::eFXSurfaceBufferState:
970 Transaction()
971 .setFrame(layerR, Rect(0, 0, 32, 32))
972 .setFrame(layerG, Rect(16, 16, 48, 48))
973 .setRelativeLayer(layerG, layerR->getHandle(), 1)
974 .apply();
975 break;
976 default:
977 ASSERT_FALSE(true) << "Unsupported layer type";
978 }
Chia-I Wu49313302017-10-31 10:14:40 -0700979 {
980 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800981 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700982 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
983 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
984 }
985
986 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
987 {
988 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800989 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700990 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
991 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
992 }
993}
994
Alec Mouri80863a62019-01-17 15:19:35 -0800995TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700996 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
997}
998
Alec Mouri80863a62019-01-17 15:19:35 -0800999TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001000 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1001}
1002
Marissa Wall61c58622018-07-18 10:12:20 -07001003TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001004 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001005 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001006 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001007 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001008 sp<SurfaceControl> layerR;
1009 sp<SurfaceControl> layerG;
1010 sp<SurfaceControl> layerB;
1011 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001012 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001013 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001014 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001015 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001016 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001017
chaviw0e3479f2018-09-10 16:49:30 -07001018 Transaction()
1019 .reparent(layerB, parent->getHandle())
1020 .apply();
1021
Chia-I Wuec2d9852017-11-21 09:21:01 -08001022 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1023 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1024
chaviw0e3479f2018-09-10 16:49:30 -07001025 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001026 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001027 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001028 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1030}
1031
Alec Mouri80863a62019-01-17 15:19:35 -08001032void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001033 sp<SurfaceControl> layerR;
1034 sp<SurfaceControl> layerG;
1035 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001036 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1037 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1038 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1039 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1040 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1041 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001042
1043 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001044 switch (layerType) {
1045 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1046 Transaction()
1047 .setPosition(layerG, 8, 8)
1048 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1049 .setPosition(layerB, 16, 16)
1050 .setLayer(layerB, mLayerZBase + 2)
1051 .apply();
1052 break;
1053 case ISurfaceComposerClient::eFXSurfaceBufferState:
1054 Transaction()
1055 .setFrame(layerR, Rect(0, 0, 32, 32))
1056 .setFrame(layerG, Rect(8, 8, 40, 40))
1057 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1058 .setFrame(layerB, Rect(16, 16, 48, 48))
1059 .setLayer(layerB, mLayerZBase + 2)
1060 .apply();
1061 break;
1062 default:
1063 ASSERT_FALSE(true) << "Unsupported layer type";
1064 }
1065
Chia-I Wu49313302017-10-31 10:14:40 -07001066 {
1067 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001068 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001069 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1070 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1071 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1072 }
1073
1074 // layerR = 4, layerG = layerR + 3, layerB = 2
1075 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1076 {
1077 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001078 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001079 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1080 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1081 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1082 }
1083
1084 // layerR = 4, layerG = layerR - 3, layerB = 2
1085 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1086 {
1087 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001088 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001089 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1090 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1091 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1092 }
1093
1094 // restore to absolute z
1095 // layerR = 4, layerG = 0, layerB = 2
1096 Transaction().setLayer(layerG, mLayerZBase).apply();
1097 {
1098 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001099 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001100 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1101 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1102 }
1103
1104 // layerR should not affect layerG anymore
1105 // layerR = 1, layerG = 0, layerB = 2
1106 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1107 {
1108 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001109 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001110 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1111 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1112 }
1113}
1114
Alec Mouri80863a62019-01-17 15:19:35 -08001115TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001116 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1117}
1118
Alec Mouri80863a62019-01-17 15:19:35 -08001119TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001120 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1121}
1122
Alec Mouri80863a62019-01-17 15:19:35 -08001123TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001124 sp<SurfaceControl> layerR;
1125 sp<SurfaceControl> layerG;
1126
1127 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001128 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001129 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001130 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001131
1132 Transaction()
1133 .setPosition(layerG, 16, 16)
1134 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1135 .apply();
1136
Robert Carr6fb1a7e2018-12-11 12:07:25 -08001137 layerG->clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001138 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001139 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001140}
1141
Alec Mouri80863a62019-01-17 15:19:35 -08001142TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001143 sp<SurfaceControl> layer;
1144 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001145 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001146
1147 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1148 {
1149 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001150 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001151 }
1152
1153 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1154 {
1155 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001156 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001157 }
1158}
1159
Alec Mouri80863a62019-01-17 15:19:35 -08001160TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001161 const Color translucentRed = {100, 0, 0, 100};
1162 sp<SurfaceControl> layerR;
1163 sp<SurfaceControl> layerG;
1164 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001165 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001166 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001167 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001168
1169 Transaction()
1170 .setLayer(layerR, mLayerZBase + 1)
1171 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1172 .apply();
1173 {
1174 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001175 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001176 }
1177
1178 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1179 {
1180 SCOPED_TRACE("layerR translucent");
1181 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001182 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001183 }
1184}
1185
Marissa Wall61c58622018-07-18 10:12:20 -07001186TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001187 sp<SurfaceControl> layer;
1188 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001189 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001190
1191 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001192 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001193 Transaction()
1194 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1195 .apply(true);
1196 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001197 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001198
1199 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1200 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001201 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001202}
1203
Alec Mouri80863a62019-01-17 15:19:35 -08001204TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001205 const Rect top(0, 0, 32, 16);
1206 const Rect bottom(0, 16, 32, 32);
1207 sp<SurfaceControl> layer;
1208 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1209
1210 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001211 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1212 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1213 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001214 // setTransparentRegionHint always applies to the following buffer
1215 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001216 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001217 {
1218 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001219 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001220 shot->expectColor(top, Color::BLACK);
1221 shot->expectColor(bottom, Color::RED);
1222 }
1223
1224 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1225 {
1226 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001227 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001228 shot->expectColor(top, Color::BLACK);
1229 shot->expectColor(bottom, Color::RED);
1230 }
1231
Marissa Wall61c58622018-07-18 10:12:20 -07001232 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1233 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1234 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1235 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001236 {
1237 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001238 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001239 shot->expectColor(top, Color::RED);
1240 shot->expectColor(bottom, Color::BLACK);
1241 }
1242}
1243
Alec Mouri80863a62019-01-17 15:19:35 -08001244TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001245 const Rect top(0, 0, 32, 16);
1246 const Rect bottom(0, 16, 32, 32);
1247 sp<SurfaceControl> layer;
1248 ASSERT_NO_FATAL_FAILURE(
1249 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1250
1251 sp<GraphicBuffer> buffer =
1252 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1253 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1254 BufferUsage::COMPOSER_OVERLAY,
1255 "test");
1256
1257 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1258 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1259 Transaction()
1260 .setTransparentRegionHint(layer, Region(top))
1261 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001262 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001263 .apply();
1264 {
1265 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001266 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001267 shot->expectColor(top, Color::BLACK);
1268 shot->expectColor(bottom, Color::RED);
1269 }
1270
1271 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1272 {
1273 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001274 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001275 shot->expectColor(top, Color::BLACK);
1276 shot->expectColor(bottom, Color::BLACK);
1277 }
1278
1279 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1280 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1281 BufferUsage::COMPOSER_OVERLAY,
1282 "test");
1283
1284 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1285 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001286 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001287 {
1288 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001289 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001290 shot->expectColor(top, Color::RED);
1291 shot->expectColor(bottom, Color::BLACK);
1292 }
1293}
1294
Alec Mouri80863a62019-01-17 15:19:35 -08001295TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001296 sp<SurfaceControl> layerTransparent;
1297 sp<SurfaceControl> layerR;
1298 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1299 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1300
1301 // check that transparent region hint is bound by the layer size
1302 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001303 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001304 .setPosition(layerR, 16, 16)
1305 .setLayer(layerR, mLayerZBase + 1)
1306 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001307 ASSERT_NO_FATAL_FAILURE(
1308 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1309 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001310 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001311}
1312
Alec Mouri80863a62019-01-17 15:19:35 -08001313TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001314 sp<SurfaceControl> layerTransparent;
1315 sp<SurfaceControl> layerR;
1316 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1317 ASSERT_NO_FATAL_FAILURE(
1318 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1319
1320 // check that transparent region hint is bound by the layer size
1321 Transaction()
1322 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1323 .setFrame(layerR, Rect(16, 16, 48, 48))
1324 .setLayer(layerR, mLayerZBase + 1)
1325 .apply();
1326 ASSERT_NO_FATAL_FAILURE(
1327 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1328 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001329 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001330}
1331
Alec Mouri80863a62019-01-17 15:19:35 -08001332void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001333 sp<SurfaceControl> layer1;
1334 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001335 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1336 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1337 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1338 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001339
Marissa Wall861616d2018-10-22 12:52:23 -07001340 switch (layerType) {
1341 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1342 Transaction()
1343 .setAlpha(layer1, 0.25f)
1344 .setAlpha(layer2, 0.75f)
1345 .setPosition(layer2, 16, 0)
1346 .setLayer(layer2, mLayerZBase + 1)
1347 .apply();
1348 break;
1349 case ISurfaceComposerClient::eFXSurfaceBufferState:
1350 Transaction()
1351 .setAlpha(layer1, 0.25f)
1352 .setAlpha(layer2, 0.75f)
1353 .setFrame(layer1, Rect(0, 0, 32, 32))
1354 .setFrame(layer2, Rect(16, 0, 48, 32))
1355 .setLayer(layer2, mLayerZBase + 1)
1356 .apply();
1357 break;
1358 default:
1359 ASSERT_FALSE(true) << "Unsupported layer type";
1360 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001361 {
Alec Mouri80863a62019-01-17 15:19:35 -08001362 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001363 uint8_t r = 16; // 64 * 0.25f
1364 uint8_t g = 48; // 64 * 0.75f
1365 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1366 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1367
1368 r /= 4; // r * (1.0f - 0.75f)
1369 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1370 }
1371}
1372
Alec Mouri80863a62019-01-17 15:19:35 -08001373TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001374 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1375}
1376
Alec Mouri80863a62019-01-17 15:19:35 -08001377TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001378 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1379}
1380
Alec Mouri80863a62019-01-17 15:19:35 -08001381TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001382 const Color color = {64, 0, 0, 255};
1383 sp<SurfaceControl> layer;
1384 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001385 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001386
1387 Transaction().setAlpha(layer, 2.0f).apply();
1388 {
1389 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001390 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001391 }
1392
1393 Transaction().setAlpha(layer, -1.0f).apply();
1394 {
1395 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001396 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001397 }
1398}
1399
Alec Mouri80863a62019-01-17 15:19:35 -08001400TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001401 sp<SurfaceControl> layer;
1402 const uint8_t size = 64;
1403 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001404 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001405 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1406 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1407
1408 Transaction()
1409 .setCornerRadius(layer, cornerRadius)
1410 .apply();
1411 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001412 const uint8_t bottom = size - 1;
1413 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001414 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001415 // Transparent corners
1416 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001417 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1418 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1419 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1420 }
1421}
1422
Alec Mouri80863a62019-01-17 15:19:35 -08001423TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001424 sp<SurfaceControl> parent;
1425 sp<SurfaceControl> child;
1426 const uint8_t size = 64;
1427 const uint8_t testArea = 4;
1428 const float cornerRadius = 20.0f;
1429 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1430 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1431 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1432 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1433
1434 Transaction()
1435 .setCornerRadius(parent, cornerRadius)
1436 .reparent(child, parent->getHandle())
1437 .setPosition(child, 0, size / 2)
1438 .apply();
1439 {
1440 const uint8_t bottom = size - 1;
1441 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001442 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001443 // Top edge of child should not have rounded corners because it's translated in the parent
1444 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1445 Color::GREEN);
1446 // But bottom edges should have been clipped according to parent bounds
1447 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1448 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001449 }
1450}
1451
Alec Mouri80863a62019-01-17 15:19:35 -08001452TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001453 sp<SurfaceControl> bufferLayer;
1454 sp<SurfaceControl> colorLayer;
1455 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001456 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001457 ASSERT_NO_FATAL_FAILURE(colorLayer =
1458 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1459 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001460
Vishnu Nair88a11f22018-11-28 18:30:57 -08001461 Transaction()
1462 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1463 .setLayer(colorLayer, mLayerZBase + 1)
1464 .apply();
1465
Chia-I Wue4ef6102017-11-01 15:16:35 -07001466 {
1467 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001468 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001469 }
1470
1471 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1472 const Color expected = {15, 51, 85, 255};
1473 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1474 // channel) should be less than one
1475 const uint8_t tolerance = 1;
1476 Transaction().setColor(colorLayer, color).apply();
1477 {
1478 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001479 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001480 }
1481}
1482
Valerie Haudd0b7572019-01-29 14:59:27 -08001483// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1484// BLUE: prior background color
1485// GREEN: final background color
1486// BLACK: no color or fill
1487void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1488 bool bufferFill, float alpha,
1489 Color finalColor) {
1490 sp<SurfaceControl> layer;
1491 int32_t width = 500;
1492 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001493
Valerie Haudd0b7572019-01-29 14:59:27 -08001494 Color fillColor = Color::RED;
1495 Color priorBgColor = Color::BLUE;
1496 Color expectedColor = Color::BLACK;
1497 switch (layerType) {
1498 case ISurfaceComposerClient::eFXSurfaceColor:
1499 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1500 Transaction()
1501 .setCrop_legacy(layer, Rect(0, 0, width, height))
1502 .setColor(layer, half3(1.0f, 0, 0))
1503 .apply();
1504 expectedColor = fillColor;
1505 break;
1506 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1507 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1508 if (bufferFill) {
1509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1510 expectedColor = fillColor;
1511 }
1512 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1513 break;
1514 case ISurfaceComposerClient::eFXSurfaceBufferState:
1515 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1516 if (bufferFill) {
1517 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1518 expectedColor = fillColor;
1519 }
1520 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1521 break;
1522 default:
1523 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1524 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001525 }
1526
Valerie Haudd0b7572019-01-29 14:59:27 -08001527 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1528 Transaction()
1529 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1530 .apply();
1531 if (!bufferFill) {
1532 expectedColor = priorBgColor;
1533 }
1534 }
1535
1536 {
1537 SCOPED_TRACE("default before setting background color layer");
1538 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1539 }
1540
Valerie Haua72e2812019-01-23 13:40:39 -08001541 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001542 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001543 .apply();
1544
1545 {
Valerie Haua72e2812019-01-23 13:40:39 -08001546 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001547 shot->expectColor(Rect(0, 0, width, height), finalColor);
1548 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001549 }
1550}
1551
Valerie Haudd0b7572019-01-29 14:59:27 -08001552TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1553 bool priorColor = false;
1554 bool bufferFill = false;
1555 float alpha = 1.0f;
1556 Color finalColor = Color::RED;
1557 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1558 priorColor, bufferFill, alpha, finalColor));
1559}
Valerie Haua72e2812019-01-23 13:40:39 -08001560
Valerie Haudd0b7572019-01-29 14:59:27 -08001561TEST_P(LayerRenderTypeTransactionTest,
1562 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1563 bool priorColor = false;
1564 bool bufferFill = true;
1565 float alpha = 1.0f;
1566 Color finalColor = Color::RED;
1567 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1568 priorColor, bufferFill, alpha, finalColor));
1569}
Valerie Haua72e2812019-01-23 13:40:39 -08001570
Valerie Haudd0b7572019-01-29 14:59:27 -08001571TEST_P(LayerRenderTypeTransactionTest,
1572 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1573 bool priorColor = false;
1574 bool bufferFill = false;
1575 float alpha = 1.0f;
1576 Color finalColor = Color::GREEN;
1577 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1578 priorColor, bufferFill, alpha, finalColor));
1579}
Valerie Haua72e2812019-01-23 13:40:39 -08001580
Valerie Haudd0b7572019-01-29 14:59:27 -08001581TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1582 bool priorColor = true;
1583 bool bufferFill = true;
1584 float alpha = 1.0f;
1585 Color finalColor = Color::RED;
1586 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1587 priorColor, bufferFill, alpha, finalColor));
1588}
1589
1590TEST_P(LayerRenderTypeTransactionTest,
1591 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1592 bool priorColor = true;
1593 bool bufferFill = false;
1594 float alpha = 1.0f;
1595 Color finalColor = Color::GREEN;
1596 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1597 priorColor, bufferFill, alpha, finalColor));
1598}
1599TEST_P(LayerRenderTypeTransactionTest,
1600 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1601 bool priorColor = false;
1602 bool bufferFill = false;
1603 float alpha = 0;
1604 Color finalColor = Color::BLACK;
1605 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1606 priorColor, bufferFill, alpha, finalColor));
1607}
1608
1609TEST_P(LayerRenderTypeTransactionTest,
1610 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1611 bool priorColor = true;
1612 bool bufferFill = false;
1613 float alpha = 0;
1614 Color finalColor = Color::BLACK;
1615 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1616 priorColor, bufferFill, alpha, finalColor));
1617}
1618
1619TEST_P(LayerRenderTypeTransactionTest,
1620 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1621 bool priorColor = false;
1622 bool bufferFill = true;
1623 float alpha = 1.0f;
1624 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001625 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001626 priorColor, bufferFill, alpha, finalColor));
1627}
1628
1629TEST_P(LayerRenderTypeTransactionTest,
1630 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1631 bool priorColor = false;
1632 bool bufferFill = false;
1633 float alpha = 1.0f;
1634 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001635 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001636 priorColor, bufferFill, alpha, finalColor));
1637}
1638
1639TEST_P(LayerRenderTypeTransactionTest,
1640 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1641 bool priorColor = true;
1642 bool bufferFill = false;
1643 float alpha = 1.0f;
1644 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001645 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001646 priorColor, bufferFill, alpha, finalColor));
1647}
1648
1649TEST_P(LayerRenderTypeTransactionTest,
1650 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1651 bool priorColor = false;
1652 bool bufferFill = false;
1653 float alpha = 0;
1654 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001655 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001656 priorColor, bufferFill, alpha, finalColor));
1657}
1658
1659TEST_P(LayerRenderTypeTransactionTest,
1660 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1661 bool priorColor = true;
1662 bool bufferFill = false;
1663 float alpha = 0;
1664 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001665 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001666 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001667}
1668
Alec Mouri80863a62019-01-17 15:19:35 -08001669TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001670 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001671 ASSERT_NO_FATAL_FAILURE(colorLayer =
1672 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1673 ISurfaceComposerClient::eFXSurfaceColor));
1674 Transaction()
1675 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1676 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1677 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001678
Alec Mouri80863a62019-01-17 15:19:35 -08001679 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001680}
1681
Alec Mouri80863a62019-01-17 15:19:35 -08001682TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001683 sp<SurfaceControl> bufferLayer;
1684 sp<SurfaceControl> colorLayer;
1685 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001686 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001687 ASSERT_NO_FATAL_FAILURE(colorLayer =
1688 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1689 ISurfaceComposerClient::eFXSurfaceColor));
1690 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001691
1692 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1693 const float alpha = 0.25f;
1694 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1695 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1696 // channel) should be less than one
1697 const uint8_t tolerance = 1;
1698 Transaction()
1699 .setColor(colorLayer, color)
1700 .setAlpha(colorLayer, alpha)
1701 .setLayer(colorLayer, mLayerZBase + 1)
1702 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001703 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1704 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001705}
1706
Alec Mouri80863a62019-01-17 15:19:35 -08001707TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001708 sp<SurfaceControl> bufferLayer;
1709 sp<SurfaceControl> parentLayer;
1710 sp<SurfaceControl> colorLayer;
1711 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1712 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001713 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001714 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1715 0 /* buffer height */,
1716 ISurfaceComposerClient::eFXSurfaceColor));
1717 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001718 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1719 const float alpha = 0.25f;
1720 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1721 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1722 // channel) should be less than one
1723 const uint8_t tolerance = 1;
1724 Transaction()
1725 .reparent(colorLayer, parentLayer->getHandle())
1726 .setColor(colorLayer, color)
1727 .setAlpha(parentLayer, alpha)
1728 .setLayer(parentLayer, mLayerZBase + 1)
1729 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001730 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1731 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001732}
1733
Alec Mouri80863a62019-01-17 15:19:35 -08001734TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001735 sp<SurfaceControl> bufferLayer;
1736 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001737 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001738
1739 // color is ignored
1740 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001741 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001742}
1743
Alec Mouri80863a62019-01-17 15:19:35 -08001744TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001745 sp<SurfaceControl> layer;
1746 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001747 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001748
1749 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1750 {
1751 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001752 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001753 }
1754
1755 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1756 {
1757 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001758 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001759 }
1760}
1761
Alec Mouri80863a62019-01-17 15:19:35 -08001762TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001763 sp<SurfaceControl> layer;
1764 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001765 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1766 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001767
1768 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1769 {
1770 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001771 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1772 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001773 }
1774
1775 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1776 {
1777 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001778 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1779 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001780 }
1781
1782 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1783 {
1784 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001785 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1786 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001787 }
1788
1789 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1790 {
1791 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001792 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1793 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001794 }
1795
1796 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1797 {
1798 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001799 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1800 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001801 }
1802}
1803
Alec Mouri80863a62019-01-17 15:19:35 -08001804TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001805 sp<SurfaceControl> layer;
1806 ASSERT_NO_FATAL_FAILURE(
1807 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1808 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1809 Color::BLUE, Color::WHITE));
1810
1811 Transaction()
1812 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1813 .setFrame(layer, Rect(0, 0, 32, 32))
1814 .apply();
1815 {
1816 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001817 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1818 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001819 }
1820
1821 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1822 {
1823 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001824 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1825 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001826 }
1827
1828 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1829 {
1830 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001831 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1832 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001833 }
1834
1835 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1836 {
1837 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001838 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1839 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001840 }
1841
1842 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1843 {
1844 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001845 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1846 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001847 }
1848}
1849
Alec Mouri80863a62019-01-17 15:19:35 -08001850TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001851 sp<SurfaceControl> layer;
1852 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001853 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1854 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001855
1856 const float rot = M_SQRT1_2; // 45 degrees
1857 const float trans = M_SQRT2 * 16.0f;
1858 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1859
Alec Mouri80863a62019-01-17 15:19:35 -08001860 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001861 // check a 8x8 region inside each color
1862 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1863 const int32_t halfL = 4;
1864 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1865 };
1866 const int32_t unit = int32_t(trans / 2);
1867 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1868 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1869 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1870 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1871}
1872
Alec Mouri80863a62019-01-17 15:19:35 -08001873TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001874 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001875 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1876 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001877
1878 // setMatrix is applied after any pending resize, unlike setPosition
1879 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1880 {
1881 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001882 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001883 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001884 shot->expectColor(rect, Color::RED);
1885 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001886 }
1887
Marissa Wall861616d2018-10-22 12:52:23 -07001888 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001889 {
1890 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001891 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001892 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001893 }
1894}
1895
Alec Mouri80863a62019-01-17 15:19:35 -08001896TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001897 sp<SurfaceControl> layer;
1898 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001899 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001900
1901 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1902 Transaction()
1903 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1904 .setSize(layer, 64, 64)
1905 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1906 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001907 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001908}
1909
Alec Mouri80863a62019-01-17 15:19:35 -08001910TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001911 sp<SurfaceControl> layer;
1912 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001913 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1914 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001915
1916 // XXX SCALE_CROP is not respected; calling setSize and
1917 // setOverrideScalingMode in separate transactions does not work
1918 // (b/69315456)
1919 Transaction()
1920 .setSize(layer, 64, 16)
1921 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1922 .apply();
1923 {
1924 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001925 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1926 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001927 }
1928}
1929
Dan Stoza000dd012018-08-01 13:31:52 -07001930TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1931 sp<SurfaceControl> layer;
1932 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1933
1934 sp<IBinder> handle = layer->getHandle();
1935 ASSERT_TRUE(handle != nullptr);
1936
1937 FrameStats frameStats;
1938 mClient->getLayerFrameStats(handle, &frameStats);
1939
1940 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1941}
1942
Alec Mouri80863a62019-01-17 15:19:35 -08001943TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001944 sp<SurfaceControl> layer;
1945 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001946 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001947 const Rect crop(8, 8, 24, 24);
1948
Marissa Wallf58c14b2018-07-24 10:50:43 -07001949 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001950 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001951 shot->expectColor(crop, Color::RED);
1952 shot->expectBorder(crop, Color::BLACK);
1953}
1954
Alec Mouri80863a62019-01-17 15:19:35 -08001955TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001956 sp<SurfaceControl> layer;
1957 ASSERT_NO_FATAL_FAILURE(
1958 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1959 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1960 const Rect crop(8, 8, 24, 24);
1961
1962 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001963 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001964 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1965 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001966}
1967
Alec Mouri80863a62019-01-17 15:19:35 -08001968TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001969 sp<SurfaceControl> layer;
1970 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001971 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001972
1973 {
1974 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001975 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001976 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001977 }
1978
1979 {
1980 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001981 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001982 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001983 }
1984}
1985
Alec Mouri80863a62019-01-17 15:19:35 -08001986TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001987 sp<SurfaceControl> layer;
1988 ASSERT_NO_FATAL_FAILURE(
1989 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1990 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1991
1992 {
1993 SCOPED_TRACE("empty rect");
1994 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001995 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001996 }
1997
1998 {
1999 SCOPED_TRACE("negative rect");
2000 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002001 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002002 }
2003}
2004
Alec Mouri80863a62019-01-17 15:19:35 -08002005TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002006 sp<SurfaceControl> layer;
2007 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002008 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002009
Marissa Wallf58c14b2018-07-24 10:50:43 -07002010 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002011 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002012 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2013 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2014}
2015
Alec Mouri80863a62019-01-17 15:19:35 -08002016TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002017 sp<SurfaceControl> layer;
2018 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2019 ISurfaceComposerClient::eFXSurfaceBufferState));
2020 sp<GraphicBuffer> buffer =
2021 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2022 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2023 BufferUsage::COMPOSER_OVERLAY,
2024 "test");
2025 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2026 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2027 Color::RED);
2028
2029 Transaction().setBuffer(layer, buffer).apply();
2030
2031 // Partially out of bounds in the negative (upper left) direction
2032 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2033 {
2034 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002035 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002036 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2037 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2038 }
2039
2040 // Partially out of bounds in the positive (lower right) direction
2041 Transaction()
2042 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2043 .apply();
2044 {
2045 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002046 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002047 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2048 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2049 }
2050
2051 // Fully out of buffer space bounds
2052 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2053 {
2054 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002055 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002056 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2057 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2058 Color::RED);
2059 }
2060}
2061
Alec Mouri80863a62019-01-17 15:19:35 -08002062TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002063 sp<SurfaceControl> layer;
2064 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002065 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002066
2067 const Point position(32, 32);
2068 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002069 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002070 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002071 shot->expectColor(crop + position, Color::RED);
2072 shot->expectBorder(crop + position, Color::BLACK);
2073}
2074
Alec Mouri80863a62019-01-17 15:19:35 -08002075TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002076 sp<SurfaceControl> layer;
2077 ASSERT_NO_FATAL_FAILURE(
2078 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2079 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2080
Marissa Wall861616d2018-10-22 12:52:23 -07002081 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002082 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002083 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002084 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002085 shot->expectColor(frame, Color::RED);
2086 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002087}
2088
Alec Mouri80863a62019-01-17 15:19:35 -08002089TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002090 sp<SurfaceControl> layer;
2091 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002092 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002093
Marissa Wall861616d2018-10-22 12:52:23 -07002094 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002095 Transaction()
2096 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002097 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002098 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002099 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002100 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2101 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2102}
2103
Alec Mouri80863a62019-01-17 15:19:35 -08002104TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002105 sp<SurfaceControl> layer;
2106 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002107 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002108
Marissa Wallf58c14b2018-07-24 10:50:43 -07002109 // setCrop_legacy is applied immediately by default, with or without resize pending
2110 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002111 {
2112 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002113 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002114 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2115 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2116 }
2117
Marissa Wall61c58622018-07-18 10:12:20 -07002118 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002119 {
2120 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002121 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002122 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2123 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2124 }
2125}
2126
Alec Mouri80863a62019-01-17 15:19:35 -08002127TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002128 sp<SurfaceControl> layer;
2129 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002130 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002131
Marissa Wallf58c14b2018-07-24 10:50:43 -07002132 // request setCrop_legacy to be applied with the next resize
2133 Transaction()
2134 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2135 .setGeometryAppliesWithResize(layer)
2136 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002137 {
2138 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002139 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002140 }
2141
Marissa Wallf58c14b2018-07-24 10:50:43 -07002142 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002143 {
2144 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002145 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002146 }
2147
2148 Transaction().setSize(layer, 16, 16).apply();
2149 {
2150 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002151 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002152 }
2153
2154 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002155 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002156 {
2157 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002158 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2160 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2161 }
2162}
2163
Alec Mouri80863a62019-01-17 15:19:35 -08002164TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002165 sp<SurfaceControl> layer;
2166 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002167 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002168
Marissa Wallf58c14b2018-07-24 10:50:43 -07002169 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002170 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002171 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002172 .setSize(layer, 16, 16)
2173 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2174 .setGeometryAppliesWithResize(layer)
2175 .apply();
2176 {
2177 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002178 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002179 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2180 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2181 }
2182
2183 // XXX crop is never latched without other geometry change (b/69315677)
2184 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002185 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002186 Transaction().setPosition(layer, 0, 0).apply();
2187 {
2188 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002189 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002190 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2191 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2192 }
2193}
2194
Alec Mouri80863a62019-01-17 15:19:35 -08002195TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002196 sp<SurfaceControl> layer;
2197 ASSERT_NO_FATAL_FAILURE(
2198 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2199 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2200 const Rect frame(8, 8, 24, 24);
2201
2202 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002203 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002204 shot->expectColor(frame, Color::RED);
2205 shot->expectBorder(frame, Color::BLACK);
2206}
2207
Alec Mouri80863a62019-01-17 15:19:35 -08002208TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002209 sp<SurfaceControl> layer;
2210 ASSERT_NO_FATAL_FAILURE(
2211 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2212 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2213
Marissa Wall61c58622018-07-18 10:12:20 -07002214 {
Marissa Wall861616d2018-10-22 12:52:23 -07002215 SCOPED_TRACE("empty rect");
2216 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002217 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002218 }
2219
Marissa Wall61c58622018-07-18 10:12:20 -07002220 {
Marissa Wall861616d2018-10-22 12:52:23 -07002221 SCOPED_TRACE("negative rect");
2222 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002223 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002224 }
2225}
2226
Alec Mouri80863a62019-01-17 15:19:35 -08002227TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002228 sp<SurfaceControl> layer;
2229 ASSERT_NO_FATAL_FAILURE(
2230 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2231 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2232
2233 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002234 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002235 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2236 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2237}
2238
Alec Mouri80863a62019-01-17 15:19:35 -08002239TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002240 sp<SurfaceControl> parent, child;
2241 ASSERT_NO_FATAL_FAILURE(
2242 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2243 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2244 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2245
2246 ASSERT_NO_FATAL_FAILURE(
2247 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2248 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2249
2250 Transaction().reparent(child, parent->getHandle()).apply();
2251
2252 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002253 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002254 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2255 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2256}
2257
Alec Mouri80863a62019-01-17 15:19:35 -08002258TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002259 sp<SurfaceControl> parent, child;
2260 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2261 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2262
2263 ASSERT_NO_FATAL_FAILURE(
2264 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2265 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2266
2267 Transaction().reparent(child, parent->getHandle()).apply();
2268
2269 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002270 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002271 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2272 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2273}
2274
Alec Mouri80863a62019-01-17 15:19:35 -08002275TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002276 sp<SurfaceControl> layer;
2277 ASSERT_NO_FATAL_FAILURE(
2278 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2279 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2280 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2281
2282 std::this_thread::sleep_for(500ms);
2283
2284 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2285
Alec Mouri80863a62019-01-17 15:19:35 -08002286 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002287 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2288 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2289}
2290
Alec Mouri80863a62019-01-17 15:19:35 -08002291TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002292 sp<SurfaceControl> parent, child;
2293 ASSERT_NO_FATAL_FAILURE(
2294 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2295 ASSERT_NO_FATAL_FAILURE(
2296 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2297 Transaction().reparent(child, parent->getHandle()).apply();
2298
2299 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2300 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2301
2302 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2303 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2304
Alec Mouri80863a62019-01-17 15:19:35 -08002305 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002306 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2307 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2308 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2309}
2310
Alec Mouri80863a62019-01-17 15:19:35 -08002311TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002312 sp<SurfaceControl> layer;
2313 ASSERT_NO_FATAL_FAILURE(
2314 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2315
2316 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2317
Alec Mouri80863a62019-01-17 15:19:35 -08002318 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002319 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2320 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2321}
2322
Alec Mouri80863a62019-01-17 15:19:35 -08002323TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002324 sp<SurfaceControl> layer;
2325 ASSERT_NO_FATAL_FAILURE(
2326 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2327
2328 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2329
2330 {
2331 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002332 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002333 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2334 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2335 }
2336
2337 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2338
2339 {
2340 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002341 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002342 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2343 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2344 }
2345
2346 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2347
2348 {
2349 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002350 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002351 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2352 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2353 }
2354}
2355
Alec Mouri80863a62019-01-17 15:19:35 -08002356TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002357 sp<SurfaceControl> layer1;
2358 ASSERT_NO_FATAL_FAILURE(
2359 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2360
2361 sp<SurfaceControl> layer2;
2362 ASSERT_NO_FATAL_FAILURE(
2363 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2364
2365 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2366
Marissa Wall861616d2018-10-22 12:52:23 -07002367 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002368 {
2369 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002370 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002371 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2372 }
2373
2374 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2375
Marissa Wall861616d2018-10-22 12:52:23 -07002376 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002377 {
2378 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002379 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002380 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2381 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2382 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2383 }
2384
2385 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2386 {
2387 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002388 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002389 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2390 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2391 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2392 }
2393
2394 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2395
2396 {
2397 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002398 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002399 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2400 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2401 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2402 }
2403}
2404
Valerie Haua6b15a12019-02-05 14:16:30 -08002405TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002406 sp<SurfaceControl> layer;
2407 ASSERT_NO_FATAL_FAILURE(
2408 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2409
2410 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2411
2412 std::array<sp<GraphicBuffer>, 10> buffers;
2413
2414 size_t idx = 0;
2415 for (auto& buffer : buffers) {
2416 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2417 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2418 BufferUsage::COMPOSER_OVERLAY,
2419 "test");
2420 Color color = colors[idx % colors.size()];
2421 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2422 idx++;
2423 }
2424
2425 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2426 // cache is working.
2427 idx = 0;
2428 for (auto& buffer : buffers) {
2429 for (int i = 0; i < 2; i++) {
2430 Transaction().setBuffer(layer, buffer).apply();
2431
2432 Color color = colors[idx % colors.size()];
2433 auto shot = screenshot();
2434 shot->expectColor(Rect(0, 0, 32, 32), color);
2435 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2436 }
2437 idx++;
2438 }
2439}
2440
Valerie Haua6b15a12019-02-05 14:16:30 -08002441TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002442 sp<SurfaceControl> layer;
2443 ASSERT_NO_FATAL_FAILURE(
2444 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2445
2446 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2447
2448 std::array<sp<GraphicBuffer>, 70> buffers;
2449
2450 size_t idx = 0;
2451 for (auto& buffer : buffers) {
2452 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2453 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2454 BufferUsage::COMPOSER_OVERLAY,
2455 "test");
2456 Color color = colors[idx % colors.size()];
2457 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2458 idx++;
2459 }
2460
2461 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2462 // cache is working.
2463 idx = 0;
2464 for (auto& buffer : buffers) {
2465 for (int i = 0; i < 2; i++) {
2466 Transaction().setBuffer(layer, buffer).apply();
2467
2468 Color color = colors[idx % colors.size()];
2469 auto shot = screenshot();
2470 shot->expectColor(Rect(0, 0, 32, 32), color);
2471 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2472 }
2473 idx++;
2474 }
2475}
2476
Valerie Haua6b15a12019-02-05 14:16:30 -08002477TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002478 sp<SurfaceControl> layer;
2479 ASSERT_NO_FATAL_FAILURE(
2480 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2481
2482 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2483
2484 std::array<sp<GraphicBuffer>, 65> buffers;
2485
2486 size_t idx = 0;
2487 for (auto& buffer : buffers) {
2488 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2489 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2490 BufferUsage::COMPOSER_OVERLAY,
2491 "test");
2492 Color color = colors[idx % colors.size()];
2493 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2494 idx++;
2495 }
2496
2497 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2498 // cache is working.
2499 idx = 0;
2500 for (auto& buffer : buffers) {
2501 for (int i = 0; i < 2; i++) {
2502 Transaction().setBuffer(layer, buffer).apply();
2503
2504 Color color = colors[idx % colors.size()];
2505 auto shot = screenshot();
2506 shot->expectColor(Rect(0, 0, 32, 32), color);
2507 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2508 }
2509 if (idx == 0) {
2510 buffers[0].clear();
2511 }
2512 idx++;
2513 }
2514}
2515
Alec Mouri80863a62019-01-17 15:19:35 -08002516TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002517 sp<SurfaceControl> layer;
2518 ASSERT_NO_FATAL_FAILURE(
2519 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2520
2521 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2522 Color::BLUE, Color::WHITE));
2523
Marissa Wall861616d2018-10-22 12:52:23 -07002524 Transaction()
2525 .setFrame(layer, Rect(0, 0, 32, 32))
2526 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2527 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002528
Alec Mouri80863a62019-01-17 15:19:35 -08002529 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2530 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002531}
2532
Alec Mouri80863a62019-01-17 15:19:35 -08002533TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002534 sp<SurfaceControl> layer;
2535 ASSERT_NO_FATAL_FAILURE(
2536 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2537
2538 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2539 Color::BLUE, Color::WHITE));
2540
Marissa Wall861616d2018-10-22 12:52:23 -07002541 Transaction()
2542 .setFrame(layer, Rect(0, 0, 32, 32))
2543 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2544 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002545
Alec Mouri80863a62019-01-17 15:19:35 -08002546 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2547 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002548}
2549
Alec Mouri80863a62019-01-17 15:19:35 -08002550TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002551 sp<SurfaceControl> layer;
2552 ASSERT_NO_FATAL_FAILURE(
2553 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2554
2555 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2556 Color::BLUE, Color::WHITE));
2557
Marissa Wall861616d2018-10-22 12:52:23 -07002558 Transaction()
2559 .setFrame(layer, Rect(0, 0, 32, 32))
2560 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2561 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002562
Alec Mouri80863a62019-01-17 15:19:35 -08002563 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2564 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002565}
2566
2567TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2568 sp<SurfaceControl> layer;
2569 ASSERT_NO_FATAL_FAILURE(
2570 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2571
2572 Transaction().setTransformToDisplayInverse(layer, false).apply();
2573
2574 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2575
2576 Transaction().setTransformToDisplayInverse(layer, true).apply();
2577}
2578
Alec Mouri80863a62019-01-17 15:19:35 -08002579TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002580 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002581 Transaction transaction;
2582 ASSERT_NO_FATAL_FAILURE(
2583 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2584
2585 sp<GraphicBuffer> buffer =
2586 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2587 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2588 BufferUsage::COMPOSER_OVERLAY,
2589 "test");
2590 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2591
2592 sp<Fence> fence;
2593 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2594 GTEST_SUCCEED() << "test not supported";
2595 return;
2596 }
2597
2598 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2599
2600 status_t status = fence->wait(1000);
2601 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2602 std::this_thread::sleep_for(200ms);
2603
Alec Mouri80863a62019-01-17 15:19:35 -08002604 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002605 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2606 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2607}
2608
Alec Mouri80863a62019-01-17 15:19:35 -08002609TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002610 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002611 ASSERT_NO_FATAL_FAILURE(
2612 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2613
2614 sp<GraphicBuffer> buffer =
2615 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2616 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2617 BufferUsage::COMPOSER_OVERLAY,
2618 "test");
2619 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2620
Marissa Wallfda30bb2018-10-12 11:34:28 -07002621 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002622
2623 Transaction()
2624 .setBuffer(layer, buffer)
2625 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002626 .apply();
2627
Alec Mouri80863a62019-01-17 15:19:35 -08002628 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002629 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2630 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2631}
2632
Alec Mouri80863a62019-01-17 15:19:35 -08002633TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002634 sp<SurfaceControl> layer;
2635 ASSERT_NO_FATAL_FAILURE(
2636 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2637
2638 sp<GraphicBuffer> buffer =
2639 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2640 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2641 BufferUsage::COMPOSER_OVERLAY,
2642 "test");
2643 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2644
2645 Transaction()
2646 .setBuffer(layer, buffer)
2647 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002648 .apply();
2649
Alec Mouri80863a62019-01-17 15:19:35 -08002650 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002651 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2652 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2653}
2654
Alec Mouri80863a62019-01-17 15:19:35 -08002655TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002656 sp<SurfaceControl> layer;
2657 ASSERT_NO_FATAL_FAILURE(
2658 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2659
2660 sp<GraphicBuffer> buffer =
2661 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2662 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2663 BufferUsage::COMPOSER_OVERLAY,
2664 "test");
2665 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2666
2667 HdrMetadata hdrMetadata;
2668 hdrMetadata.validTypes = 0;
2669 Transaction()
2670 .setBuffer(layer, buffer)
2671 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002672 .apply();
2673
Alec Mouri80863a62019-01-17 15:19:35 -08002674 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002675 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2676 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2677}
2678
Alec Mouri80863a62019-01-17 15:19:35 -08002679TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002680 sp<SurfaceControl> layer;
2681 ASSERT_NO_FATAL_FAILURE(
2682 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2683
2684 sp<GraphicBuffer> buffer =
2685 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2686 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2687 BufferUsage::COMPOSER_OVERLAY,
2688 "test");
2689 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2690
2691 Region region;
2692 region.set(32, 32);
2693 Transaction()
2694 .setBuffer(layer, buffer)
2695 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002696 .apply();
2697
Alec Mouri80863a62019-01-17 15:19:35 -08002698 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002699 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2700 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2701}
2702
Alec Mouri80863a62019-01-17 15:19:35 -08002703TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002704 sp<SurfaceControl> layer;
2705 ASSERT_NO_FATAL_FAILURE(
2706 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2707
2708 sp<GraphicBuffer> buffer =
2709 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2710 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2711 BufferUsage::COMPOSER_OVERLAY,
2712 "test");
2713 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2714
2715 Transaction()
2716 .setBuffer(layer, buffer)
2717 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002718 .apply();
2719
Alec Mouri80863a62019-01-17 15:19:35 -08002720 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002721 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2722 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2723}
2724
2725TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2726 sp<SurfaceControl> layer;
2727 ASSERT_NO_FATAL_FAILURE(
2728 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2729
2730 // verify this doesn't cause a crash
2731 Transaction().setSidebandStream(layer, nullptr).apply();
2732}
2733
Robert Carr54cf5b12019-01-25 14:02:28 -08002734TEST_F(LayerTransactionTest, ReparentToSelf) {
2735 sp<SurfaceControl> layer;
2736 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2737 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2738 Transaction().reparent(layer, layer->getHandle()).apply();
2739
2740 {
2741 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2742 // to still be functioning.
2743 SCOPED_TRACE("after reparent to self");
2744 const Rect rect(0, 0, 32, 32);
2745 auto shot = screenshot();
2746 shot->expectColor(rect, Color::RED);
2747 shot->expectBorder(rect, Color::BLACK);
2748 }
2749}
2750
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002751class ColorTransformHelper {
2752public:
2753 static void DegammaColorSingle(half& s) {
2754 if (s <= 0.03928f)
2755 s = s / 12.92f;
2756 else
2757 s = pow((s + 0.055f) / 1.055f, 2.4f);
2758 }
2759
2760 static void DegammaColor(half3& color) {
2761 DegammaColorSingle(color.r);
2762 DegammaColorSingle(color.g);
2763 DegammaColorSingle(color.b);
2764 }
2765
2766 static void GammaColorSingle(half& s) {
2767 if (s <= 0.0031308f) {
2768 s = s * 12.92f;
2769 } else {
2770 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2771 }
2772 }
2773
2774 static void GammaColor(half3& color) {
2775 GammaColorSingle(color.r);
2776 GammaColorSingle(color.g);
2777 GammaColorSingle(color.b);
2778 }
2779
2780 static void applyMatrix(half3& color, const mat3& mat) {
2781 half3 ret = half3(0);
2782
2783 for (int i = 0; i < 3; i++) {
2784 for (int j = 0; j < 3; j++) {
2785 ret[i] = ret[i] + color[j] * mat[j][i];
2786 }
2787 }
2788 color = ret;
2789 }
2790};
2791
Alec Mouri80863a62019-01-17 15:19:35 -08002792TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002793 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002794 ASSERT_NO_FATAL_FAILURE(colorLayer =
2795 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2796 ISurfaceComposerClient::eFXSurfaceColor));
2797 Transaction()
2798 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2799 .setLayer(colorLayer, mLayerZBase + 1)
2800 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002801 {
2802 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002803 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002804 }
2805
2806 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002807 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002808 mat3 matrix;
2809 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2810 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2811 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002812
2813 // degamma before applying the matrix
2814 if (mColorManagementUsed) {
2815 ColorTransformHelper::DegammaColor(expected);
2816 }
2817
2818 ColorTransformHelper::applyMatrix(expected, matrix);
2819
2820 if (mColorManagementUsed) {
2821 ColorTransformHelper::GammaColor(expected);
2822 }
2823
2824 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2825 uint8_t(expected.b * 255), 255};
2826
2827 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2828 // channel) should be less than one
2829 const uint8_t tolerance = 1;
2830
Peiyong Lind3788632018-09-18 16:01:31 -07002831 Transaction().setColor(colorLayer, color)
2832 .setColorTransform(colorLayer, matrix, vec3()).apply();
2833 {
2834 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002835 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002836 }
2837}
2838
Alec Mouri80863a62019-01-17 15:19:35 -08002839TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002840 sp<SurfaceControl> parentLayer;
2841 sp<SurfaceControl> colorLayer;
2842 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2843 0 /* buffer height */,
2844 ISurfaceComposerClient::eFXSurfaceContainer));
2845 ASSERT_NO_FATAL_FAILURE(
2846 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2847 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2848
2849 Transaction()
2850 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2851 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2852 .setLayer(parentLayer, mLayerZBase + 1)
2853 .apply();
2854 {
2855 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002856 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002857 }
2858
2859 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2860 half3 expected = color;
2861 mat3 matrix;
2862 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2863 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2864 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2865
2866 // degamma before applying the matrix
2867 if (mColorManagementUsed) {
2868 ColorTransformHelper::DegammaColor(expected);
2869 }
2870
2871 ColorTransformHelper::applyMatrix(expected, matrix);
2872
2873 if (mColorManagementUsed) {
2874 ColorTransformHelper::GammaColor(expected);
2875 }
2876
2877 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2878 uint8_t(expected.b * 255), 255};
2879
2880 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2881 // channel) should be less than one
2882 const uint8_t tolerance = 1;
2883
2884 Transaction()
2885 .setColor(colorLayer, color)
2886 .setColorTransform(parentLayer, matrix, vec3())
2887 .apply();
2888 {
2889 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002890 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002891 }
2892}
2893
Alec Mouri80863a62019-01-17 15:19:35 -08002894TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002895 sp<SurfaceControl> parentLayer;
2896 sp<SurfaceControl> colorLayer;
2897 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2898 0 /* buffer height */,
2899 ISurfaceComposerClient::eFXSurfaceContainer));
2900 ASSERT_NO_FATAL_FAILURE(
2901 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2902 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2903
2904 Transaction()
2905 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2906 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2907 .setLayer(parentLayer, mLayerZBase + 1)
2908 .apply();
2909 {
2910 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002911 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002912 }
2913
2914 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2915 half3 expected = color;
2916 mat3 matrixChild;
2917 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2918 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2919 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2920 mat3 matrixParent;
2921 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2922 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2923 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2924
2925 // degamma before applying the matrix
2926 if (mColorManagementUsed) {
2927 ColorTransformHelper::DegammaColor(expected);
2928 }
2929
2930 ColorTransformHelper::applyMatrix(expected, matrixChild);
2931 ColorTransformHelper::applyMatrix(expected, matrixParent);
2932
2933 if (mColorManagementUsed) {
2934 ColorTransformHelper::GammaColor(expected);
2935 }
2936
2937 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2938 uint8_t(expected.b * 255), 255};
2939
2940 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2941 // channel) should be less than one
2942 const uint8_t tolerance = 1;
2943
2944 Transaction()
2945 .setColor(colorLayer, color)
2946 .setColorTransform(parentLayer, matrixParent, vec3())
2947 .setColorTransform(colorLayer, matrixChild, vec3())
2948 .apply();
2949 {
2950 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002951 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002952 }
2953}
2954
Marissa Wall80d94ad2019-01-18 16:04:36 -08002955struct CallbackData {
2956 CallbackData() = default;
2957 CallbackData(nsecs_t time, const sp<Fence>& fence,
2958 const std::vector<SurfaceControlStats>& stats)
2959 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
2960
2961 nsecs_t latchTime;
2962 sp<Fence> presentFence;
2963 std::vector<SurfaceControlStats> surfaceControlStats;
2964};
2965
Marissa Wallfda30bb2018-10-12 11:34:28 -07002966class ExpectedResult {
2967public:
2968 enum Transaction {
2969 NOT_PRESENTED = 0,
2970 PRESENTED,
2971 };
2972
2973 enum Buffer {
2974 NOT_ACQUIRED = 0,
2975 ACQUIRED,
2976 };
2977
2978 enum PreviousBuffer {
2979 NOT_RELEASED = 0,
2980 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08002981 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002982 };
2983
2984 void reset() {
2985 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
2986 mExpectedSurfaceResults.clear();
2987 }
2988
2989 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07002990 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002991 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
2992 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08002993 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07002994 std::forward_as_tuple(bufferResult, previousBufferResult));
2995 }
2996
2997 void addSurfaces(ExpectedResult::Transaction transactionResult,
2998 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07002999 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003000 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3001 for (const auto& layer : layers) {
3002 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3003 }
3004 }
3005
Marissa Wall17b4e452018-12-26 16:32:34 -08003006 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3007 mExpectedPresentTime = expectedPresentTime;
3008 }
3009
Marissa Wall80d94ad2019-01-18 16:04:36 -08003010 void verifyCallbackData(const CallbackData& callbackData) const {
3011 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003012 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3013 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003014 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003015 if (mExpectedPresentTime >= 0) {
3016 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3017 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3018 // if the panel is running at 30 hz, at the worst case, our expected time just
3019 // misses vsync and we have to wait another 33.3ms
3020 ASSERT_LE(presentFence->getSignalTime(),
3021 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3022 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003023 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003024 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003025 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3026 }
3027
Marissa Wall80d94ad2019-01-18 16:04:36 -08003028 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003029 << "wrong number of surfaces";
3030
Marissa Wall80d94ad2019-01-18 16:04:36 -08003031 for (const auto& stats : surfaceControlStats) {
3032 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3033
Marissa Wallfda30bb2018-10-12 11:34:28 -07003034 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3035 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3036 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003037 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003038 }
3039 }
3040
3041private:
3042 class ExpectedSurfaceResult {
3043 public:
3044 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3045 ExpectedResult::PreviousBuffer previousBufferResult)
3046 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3047
Marissa Wall80d94ad2019-01-18 16:04:36 -08003048 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3049 nsecs_t latchTime) const {
3050 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003051
3052 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3053 << "bad acquire time";
3054 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003055
3056 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3057 ASSERT_NE(previousReleaseFence, nullptr)
3058 << "failed to set release prev buffer fence";
3059 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3060 ASSERT_EQ(previousReleaseFence, nullptr)
3061 << "should not have set released prev buffer fence";
3062 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003063 }
3064
3065 private:
3066 ExpectedResult::Buffer mBufferResult;
3067 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3068 };
3069
Marissa Wall80d94ad2019-01-18 16:04:36 -08003070 struct SCHash {
3071 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3072 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003073 }
3074 };
3075 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003076 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003077 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003078};
3079
3080class CallbackHelper {
3081public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003082 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3083 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003084 if (!callbackContext) {
3085 ALOGE("failed to get callback context");
3086 }
3087 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3088 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003089 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003090 helper->mConditionVariable.notify_all();
3091 }
3092
Marissa Wall80d94ad2019-01-18 16:04:36 -08003093 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003094 std::unique_lock lock(mMutex);
3095
Marissa Wall80d94ad2019-01-18 16:04:36 -08003096 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003097 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3098 std::cv_status::timeout)
3099 << "did not receive callback";
3100 }
3101
Marissa Wall80d94ad2019-01-18 16:04:36 -08003102 *outData = std::move(mCallbackDataQueue.front());
3103 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003104 }
3105
3106 void verifyFinalState() {
3107 // Wait to see if there are extra callbacks
3108 std::this_thread::sleep_for(500ms);
3109
3110 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003111 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3112 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003113 }
3114
3115 void* getContext() { return static_cast<void*>(this); }
3116
3117 std::mutex mMutex;
3118 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003119 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003120};
3121
3122class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003123public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003124 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003125 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003126 }
3127
Marissa Wall713b63f2018-10-17 15:42:43 -07003128 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
3129 const sp<SurfaceControl>& layer = nullptr) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003130 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003131 sp<GraphicBuffer> buffer;
3132 sp<Fence> fence;
3133 int err = getBuffer(&buffer, &fence);
3134 if (err != NO_ERROR) {
3135 return err;
3136 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003137
Marissa Wall861616d2018-10-22 12:52:23 -07003138 transaction.setBuffer(layer, buffer).setAcquireFence(layer, fence);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003139 }
3140
3141 transaction.addTransactionCompletedCallback(callbackHelper->function,
3142 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003143 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003144 }
3145
Marissa Wall861616d2018-10-22 12:52:23 -07003146 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3147 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003148 CallbackData callbackData;
3149 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3150 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003151
3152 if (finalState) {
3153 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3154 }
3155 }
3156
Marissa Wall861616d2018-10-22 12:52:23 -07003157 static void waitForCallbacks(CallbackHelper& helper,
3158 const std::vector<ExpectedResult>& expectedResults,
3159 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003160 for (const auto& expectedResult : expectedResults) {
3161 waitForCallback(helper, expectedResult);
3162 }
3163 if (finalState) {
3164 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3165 }
3166 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003167};
3168
3169TEST_F(LayerCallbackTest, Basic) {
3170 sp<SurfaceControl> layer;
3171 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3172
3173 Transaction transaction;
3174 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003175 int err = fillTransaction(transaction, &callback, layer);
3176 if (err) {
3177 GTEST_SUCCEED() << "test not supported";
3178 return;
3179 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180
3181 transaction.apply();
3182
3183 ExpectedResult expected;
3184 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3185 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3186}
3187
3188TEST_F(LayerCallbackTest, NoBuffer) {
3189 sp<SurfaceControl> layer;
3190 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3191
3192 Transaction transaction;
3193 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003194 int err = fillTransaction(transaction, &callback);
3195 if (err) {
3196 GTEST_SUCCEED() << "test not supported";
3197 return;
3198 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003199
Marissa Wall861616d2018-10-22 12:52:23 -07003200 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003201
3202 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3204 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003205 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3206}
3207
3208TEST_F(LayerCallbackTest, NoStateChange) {
3209 Transaction transaction;
3210 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003211 int err = fillTransaction(transaction, &callback);
3212 if (err) {
3213 GTEST_SUCCEED() << "test not supported";
3214 return;
3215 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003216
3217 transaction.apply();
3218
3219 ExpectedResult expected;
3220 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3221}
3222
3223TEST_F(LayerCallbackTest, OffScreen) {
3224 sp<SurfaceControl> layer;
3225 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3226
3227 Transaction transaction;
3228 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003229 int err = fillTransaction(transaction, &callback, layer);
3230 if (err) {
3231 GTEST_SUCCEED() << "test not supported";
3232 return;
3233 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003234
Marissa Wall861616d2018-10-22 12:52:23 -07003235 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003236
3237 ExpectedResult expected;
3238 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3239 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3240}
3241
3242TEST_F(LayerCallbackTest, Merge) {
3243 sp<SurfaceControl> layer1, layer2;
3244 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3245 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3246
3247 Transaction transaction1, transaction2;
3248 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003249 int err = fillTransaction(transaction1, &callback1, layer1);
3250 if (err) {
3251 GTEST_SUCCEED() << "test not supported";
3252 return;
3253 }
3254 err = fillTransaction(transaction2, &callback2, layer2);
3255 if (err) {
3256 GTEST_SUCCEED() << "test not supported";
3257 return;
3258 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259
Marissa Wall861616d2018-10-22 12:52:23 -07003260 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3261 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003262
3263 ExpectedResult expected;
3264 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3265 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3266 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3267}
3268
3269TEST_F(LayerCallbackTest, Merge_SameCallback) {
3270 sp<SurfaceControl> layer1, layer2;
3271 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3272 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3273
3274 Transaction transaction1, transaction2;
3275 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003276 int err = fillTransaction(transaction1, &callback, layer1);
3277 if (err) {
3278 GTEST_SUCCEED() << "test not supported";
3279 return;
3280 }
3281 err = fillTransaction(transaction2, &callback, layer2);
3282 if (err) {
3283 GTEST_SUCCEED() << "test not supported";
3284 return;
3285 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003286
3287 transaction2.merge(std::move(transaction1)).apply();
3288
3289 ExpectedResult expected;
3290 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3291 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3292 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3293}
3294
3295TEST_F(LayerCallbackTest, Merge_SameLayer) {
3296 sp<SurfaceControl> layer;
3297 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3298
3299 Transaction transaction1, transaction2;
3300 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003301 int err = fillTransaction(transaction1, &callback1, layer);
3302 if (err) {
3303 GTEST_SUCCEED() << "test not supported";
3304 return;
3305 }
3306 err = fillTransaction(transaction2, &callback2, layer);
3307 if (err) {
3308 GTEST_SUCCEED() << "test not supported";
3309 return;
3310 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003311
3312 transaction2.merge(std::move(transaction1)).apply();
3313
3314 ExpectedResult expected;
3315 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3316 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3317 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3318}
3319
Marissa Wallfda30bb2018-10-12 11:34:28 -07003320TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3321 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3322 client2(new SurfaceComposerClient);
3323
3324 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3325 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3326
3327 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003328 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003329 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003330 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003331 ISurfaceComposerClient::eFXSurfaceBufferState));
3332
3333 Transaction transaction1, transaction2;
3334 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003335 int err = fillTransaction(transaction1, &callback1, layer1);
3336 if (err) {
3337 GTEST_SUCCEED() << "test not supported";
3338 return;
3339 }
3340 err = fillTransaction(transaction2, &callback2, layer2);
3341 if (err) {
3342 GTEST_SUCCEED() << "test not supported";
3343 return;
3344 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003345
Marissa Wall861616d2018-10-22 12:52:23 -07003346 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3347 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003348
3349 ExpectedResult expected;
3350 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3351 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3352 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3353}
3354
3355TEST_F(LayerCallbackTest, MultipleTransactions) {
3356 sp<SurfaceControl> layer;
3357 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3358
3359 Transaction transaction;
3360 CallbackHelper callback;
3361 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003362 int err = fillTransaction(transaction, &callback, layer);
3363 if (err) {
3364 GTEST_SUCCEED() << "test not supported";
3365 return;
3366 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003367
3368 transaction.apply();
3369
3370 ExpectedResult expected;
3371 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003372 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003373 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3374 : ExpectedResult::PreviousBuffer::RELEASED);
3375 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3376 }
3377 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3378}
3379
3380TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3381 sp<SurfaceControl> layer;
3382 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3383
3384 Transaction transaction;
3385 CallbackHelper callback;
3386 for (size_t i = 0; i < 10; i++) {
3387 ExpectedResult expected;
3388
3389 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003390 int err = fillTransaction(transaction, &callback, layer);
3391 if (err) {
3392 GTEST_SUCCEED() << "test not supported";
3393 return;
3394 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003395 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3396 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003397 int err = fillTransaction(transaction, &callback);
3398 if (err) {
3399 GTEST_SUCCEED() << "test not supported";
3400 return;
3401 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003402 }
3403
3404 transaction.apply();
3405
3406 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3407 }
3408 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3409}
3410
3411TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3412 sp<SurfaceControl> layer;
3413 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3414
3415 Transaction transaction;
3416 CallbackHelper callback;
3417 for (size_t i = 0; i < 10; i++) {
3418 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003419 int err = fillTransaction(transaction, &callback, layer);
3420 if (err) {
3421 GTEST_SUCCEED() << "test not supported";
3422 return;
3423 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003424 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003425 int err = fillTransaction(transaction, &callback);
3426 if (err) {
3427 GTEST_SUCCEED() << "test not supported";
3428 return;
3429 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003430 }
3431
Marissa Wall861616d2018-10-22 12:52:23 -07003432 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003433
3434 ExpectedResult expected;
3435 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3436 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003437 layer,
3438 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3439 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003440 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3441 }
3442 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3443}
3444
3445TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3446 sp<SurfaceControl> layer1, layer2;
3447 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3448 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3449
3450 Transaction transaction1, transaction2;
3451 CallbackHelper callback1, callback2;
3452 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003453 int err = fillTransaction(transaction1, &callback1, layer1);
3454 if (err) {
3455 GTEST_SUCCEED() << "test not supported";
3456 return;
3457 }
3458 err = fillTransaction(transaction2, &callback2, layer2);
3459 if (err) {
3460 GTEST_SUCCEED() << "test not supported";
3461 return;
3462 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003463
Marissa Wall861616d2018-10-22 12:52:23 -07003464 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3465 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003466
3467 ExpectedResult expected;
3468 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003469 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003470 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3471 : ExpectedResult::PreviousBuffer::RELEASED);
3472 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3473 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3474 }
3475 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3476 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3477}
3478
3479TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3480 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3481 client2(new SurfaceComposerClient);
3482 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3483 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3484
3485 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003486 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003487 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003488 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003489 ISurfaceComposerClient::eFXSurfaceBufferState));
3490
3491 Transaction transaction1, transaction2;
3492 CallbackHelper callback1, callback2;
3493 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003494 int err = fillTransaction(transaction1, &callback1, layer1);
3495 if (err) {
3496 GTEST_SUCCEED() << "test not supported";
3497 return;
3498 }
3499 err = fillTransaction(transaction2, &callback2, layer2);
3500 if (err) {
3501 GTEST_SUCCEED() << "test not supported";
3502 return;
3503 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003504
Marissa Wall861616d2018-10-22 12:52:23 -07003505 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3506 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003507
3508 ExpectedResult expected;
3509 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003510 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003511 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3512 : ExpectedResult::PreviousBuffer::RELEASED);
3513 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3514 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3515 }
3516 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3517 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3518}
3519
3520TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3521 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3522 client2(new SurfaceComposerClient);
3523 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3524 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3525
3526 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003527 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003528 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003529 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003530 ISurfaceComposerClient::eFXSurfaceBufferState));
3531
3532 Transaction transaction1, transaction2;
3533 CallbackHelper callback1, callback2;
3534
3535 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003536 int err = fillTransaction(transaction1, &callback1, layer1);
3537 if (err) {
3538 GTEST_SUCCEED() << "test not supported";
3539 return;
3540 }
3541 err = fillTransaction(transaction2, &callback2, layer2);
3542 if (err) {
3543 GTEST_SUCCEED() << "test not supported";
3544 return;
3545 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003546
Marissa Wall861616d2018-10-22 12:52:23 -07003547 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3548 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003549
3550 ExpectedResult expected;
3551 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3552 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3553 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3554 expected.reset();
3555
3556 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003557 err = fillTransaction(transaction1, &callback1);
3558 if (err) {
3559 GTEST_SUCCEED() << "test not supported";
3560 return;
3561 }
3562 err = fillTransaction(transaction2, &callback2);
3563 if (err) {
3564 GTEST_SUCCEED() << "test not supported";
3565 return;
3566 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003567
3568 transaction2.merge(std::move(transaction1)).apply();
3569
3570 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3571 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3572}
3573
3574TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3575 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3576 client2(new SurfaceComposerClient);
3577
3578 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3579 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3580
3581 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003582 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003583 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003584 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003585 ISurfaceComposerClient::eFXSurfaceBufferState));
3586
3587 Transaction transaction1, transaction2;
3588 CallbackHelper callback1, callback2;
3589
3590 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003591 int err = fillTransaction(transaction1, &callback1, layer1);
3592 if (err) {
3593 GTEST_SUCCEED() << "test not supported";
3594 return;
3595 }
3596 err = fillTransaction(transaction2, &callback2, layer2);
3597 if (err) {
3598 GTEST_SUCCEED() << "test not supported";
3599 return;
3600 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003601
Marissa Wall861616d2018-10-22 12:52:23 -07003602 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3603 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003604
3605 ExpectedResult expected;
3606 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3607 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3608 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3609 expected.reset();
3610
3611 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003612 err = fillTransaction(transaction1, &callback1);
3613 if (err) {
3614 GTEST_SUCCEED() << "test not supported";
3615 return;
3616 }
3617 err = fillTransaction(transaction2, &callback2);
3618 if (err) {
3619 GTEST_SUCCEED() << "test not supported";
3620 return;
3621 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003622
Marissa Wall861616d2018-10-22 12:52:23 -07003623 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003624
Marissa Wall713b63f2018-10-17 15:42:43 -07003625 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3626 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003627 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3628 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3629}
3630
3631TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3632 sp<SurfaceControl> layer;
3633 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3634
3635 Transaction transaction;
3636 CallbackHelper callback;
3637 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003638 for (auto& expected : expectedResults) {
3639 expected.reset();
3640 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003641 ExpectedResult::Buffer::ACQUIRED,
3642 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003643
Marissa Wall713b63f2018-10-17 15:42:43 -07003644 int err = fillTransaction(transaction, &callback, layer);
3645 if (err) {
3646 GTEST_SUCCEED() << "test not supported";
3647 return;
3648 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003649
3650 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003651 }
3652 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3653}
3654
3655TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3656 sp<SurfaceControl> layer;
3657 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3658
Marissa Wall713b63f2018-10-17 15:42:43 -07003659 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003660 Transaction transaction;
3661 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003662 int err = fillTransaction(transaction, &callback, layer);
3663 if (err) {
3664 GTEST_SUCCEED() << "test not supported";
3665 return;
3666 }
3667
3668 transaction.apply();
3669
3670 ExpectedResult expected;
3671 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3672 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3673
3674 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003675 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003676 for (auto& expected : expectedResults) {
3677 expected.reset();
3678
Marissa Wall713b63f2018-10-17 15:42:43 -07003679 err = fillTransaction(transaction, &callback);
3680 if (err) {
3681 GTEST_SUCCEED() << "test not supported";
3682 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003683 }
3684
3685 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003686 }
3687 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3688}
3689
3690TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3691 sp<SurfaceControl> layer;
3692 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3693
3694 // Normal call to set up test
3695 Transaction transaction;
3696 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003697 int err = fillTransaction(transaction, &callback, layer);
3698 if (err) {
3699 GTEST_SUCCEED() << "test not supported";
3700 return;
3701 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003702
Marissa Wall861616d2018-10-22 12:52:23 -07003703 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003704
3705 ExpectedResult expectedResult;
3706 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3707 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3708
3709 // Test
3710 std::vector<ExpectedResult> expectedResults(50);
3711 for (auto& expected : expectedResults) {
3712 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003713 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3714 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003715
Marissa Wall713b63f2018-10-17 15:42:43 -07003716 err = fillTransaction(transaction, &callback);
3717 if (err) {
3718 GTEST_SUCCEED() << "test not supported";
3719 return;
3720 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003721
Marissa Wall861616d2018-10-22 12:52:23 -07003722 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003723 }
3724 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3725}
3726
Marissa Wall17b4e452018-12-26 16:32:34 -08003727TEST_F(LayerCallbackTest, DesiredPresentTime) {
3728 sp<SurfaceControl> layer;
3729 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3730
3731 Transaction transaction;
3732 CallbackHelper callback;
3733 int err = fillTransaction(transaction, &callback, layer);
3734 if (err) {
3735 GTEST_SUCCEED() << "test not supported";
3736 return;
3737 }
3738
3739 // Try to present 100ms in the future
3740 nsecs_t time = systemTime() + (100 * 1e6);
3741
3742 transaction.setDesiredPresentTime(time);
3743 transaction.apply();
3744
3745 ExpectedResult expected;
3746 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3747 expected.addExpectedPresentTime(time);
3748 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3749}
3750
3751TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3752 sp<SurfaceControl> layer;
3753 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3754
3755 Transaction transaction;
3756 CallbackHelper callback1;
3757 int err = fillTransaction(transaction, &callback1, layer);
3758 if (err) {
3759 GTEST_SUCCEED() << "test not supported";
3760 return;
3761 }
3762
3763 // Try to present 100ms in the future
3764 nsecs_t time = systemTime() + (100 * 1e6);
3765
3766 transaction.setDesiredPresentTime(time);
3767 transaction.apply();
3768
3769 ExpectedResult expected1;
3770 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3771 expected1.addExpectedPresentTime(time);
3772
3773 CallbackHelper callback2;
3774 err = fillTransaction(transaction, &callback2, layer);
3775 if (err) {
3776 GTEST_SUCCEED() << "test not supported";
3777 return;
3778 }
3779
3780 // Try to present 33ms after the first frame
3781 time += (33.3 * 1e6);
3782
3783 transaction.setDesiredPresentTime(time);
3784 transaction.apply();
3785
3786 ExpectedResult expected2;
3787 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3788 ExpectedResult::Buffer::ACQUIRED,
3789 ExpectedResult::PreviousBuffer::RELEASED);
3790 expected2.addExpectedPresentTime(time);
3791
3792 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3793 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3794}
3795
3796TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3797 sp<SurfaceControl> layer;
3798 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3799
3800 Transaction transaction;
3801 CallbackHelper callback1;
3802 int err = fillTransaction(transaction, &callback1, layer);
3803 if (err) {
3804 GTEST_SUCCEED() << "test not supported";
3805 return;
3806 }
3807
3808 // Try to present 100ms in the future
3809 nsecs_t time = systemTime() + (100 * 1e6);
3810
3811 transaction.setDesiredPresentTime(time);
3812 transaction.apply();
3813
3814 ExpectedResult expected1;
3815 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3816 expected1.addExpectedPresentTime(time);
3817
3818 CallbackHelper callback2;
3819 err = fillTransaction(transaction, &callback2, layer);
3820 if (err) {
3821 GTEST_SUCCEED() << "test not supported";
3822 return;
3823 }
3824
3825 // Try to present 33ms before the previous frame
3826 time -= (33.3 * 1e6);
3827
3828 transaction.setDesiredPresentTime(time);
3829 transaction.apply();
3830
3831 ExpectedResult expected2;
3832 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3833 ExpectedResult::Buffer::ACQUIRED,
3834 ExpectedResult::PreviousBuffer::RELEASED);
3835
3836 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3837 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3838}
3839
3840TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3841 sp<SurfaceControl> layer;
3842 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3843
3844 Transaction transaction;
3845 CallbackHelper callback;
3846 int err = fillTransaction(transaction, &callback, layer);
3847 if (err) {
3848 GTEST_SUCCEED() << "test not supported";
3849 return;
3850 }
3851
3852 // Try to present 100ms in the past
3853 nsecs_t time = systemTime() - (100 * 1e6);
3854
3855 transaction.setDesiredPresentTime(time);
3856 transaction.apply();
3857
3858 ExpectedResult expected;
3859 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3860 expected.addExpectedPresentTime(systemTime());
3861 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3862}
3863
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003864class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003865protected:
3866 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003867 LayerTransactionTest::SetUp();
3868 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003869
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003870 const auto display = SurfaceComposerClient::getInternalDisplayToken();
3871 ASSERT_FALSE(display == nullptr);
3872
Mathias Agopianc666cae2012-07-25 18:56:13 -07003873 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003874 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003875
3876 ssize_t displayWidth = info.w;
3877 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003878
3879 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003880 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3881 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003882 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003883 ASSERT_TRUE(mBGSurfaceControl->isValid());
3884 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3885
3886 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003887 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
3888
Peiyong Lin566a3b42018-01-09 18:22:43 -08003889 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003890 ASSERT_TRUE(mFGSurfaceControl->isValid());
3891
3892 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
3893
3894 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07003895 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003896 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003897 ASSERT_TRUE(mSyncSurfaceControl->isValid());
3898
3899 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3900
Robert Carr4cdc58f2017-08-23 14:22:20 -07003901 asTransaction([&](Transaction& t) {
3902 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003903
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003904 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07003905
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003906 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
3907 .setPosition(mFGSurfaceControl, 64, 64)
3908 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003909
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003910 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
3911 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
3912 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07003913 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003914 }
3915
3916 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07003917 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003918 mBGSurfaceControl = 0;
3919 mFGSurfaceControl = 0;
3920 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003921 }
3922
3923 void waitForPostedBuffers() {
3924 // Since the sync surface is in synchronous mode (i.e. double buffered)
3925 // posting three buffers to it should ensure that at least two
3926 // SurfaceFlinger::handlePageFlip calls have been made, which should
3927 // guaranteed that a buffer posted to another Surface has been retired.
3928 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3929 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3930 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3931 }
3932
Robert Carr4cdc58f2017-08-23 14:22:20 -07003933 void asTransaction(const std::function<void(Transaction&)>& exec) {
3934 Transaction t;
3935 exec(t);
3936 t.apply(true);
3937 }
3938
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003939 sp<SurfaceControl> mBGSurfaceControl;
3940 sp<SurfaceControl> mFGSurfaceControl;
3941
3942 // This surface is used to ensure that the buffers posted to
3943 // mFGSurfaceControl have been picked up by SurfaceFlinger.
3944 sp<SurfaceControl> mSyncSurfaceControl;
3945};
3946
Robert Carr7f619b22017-11-06 12:56:35 -08003947TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08003948
chaviw0e3479f2018-09-10 16:49:30 -07003949 std::unique_ptr<ScreenCapture> sc;
3950
3951 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08003952 fillSurfaceRGBA8(relative, 10, 10, 10);
3953 waitForPostedBuffers();
3954
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003955 Transaction{}
3956 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08003957 .setPosition(relative, 64, 64)
3958 .apply();
3959
3960 {
3961 // The relative should be on top of the FG control.
3962 ScreenCapture::captureScreen(&sc);
3963 sc->checkPixel(64, 64, 10, 10, 10);
3964 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003965 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08003966
3967 {
3968 // Nothing should change at this point.
3969 ScreenCapture::captureScreen(&sc);
3970 sc->checkPixel(64, 64, 10, 10, 10);
3971 }
3972
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003973 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08003974
3975 {
3976 // Ensure that the relative was actually hidden, rather than
3977 // being left in the detached but visible state.
3978 ScreenCapture::captureScreen(&sc);
3979 sc->expectFGColor(64, 64);
3980 }
3981}
3982
Robert Carr8d5227b2017-03-16 15:41:03 -07003983class GeometryLatchingTest : public LayerUpdateTest {
3984protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003985 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07003986 SCOPED_TRACE(trace);
3987 ScreenCapture::captureScreen(&sc);
3988 // We find the leading edge of the FG surface.
3989 sc->expectFGColor(127, 127);
3990 sc->expectBGColor(128, 128);
3991 }
Robert Carr7bf247e2017-05-18 14:02:49 -07003992
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003993 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07003994
3995 void unlockFGBuffer() {
3996 sp<Surface> s = mFGSurfaceControl->getSurface();
3997 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
3998 waitForPostedBuffers();
3999 }
4000
Robert Carr8d5227b2017-03-16 15:41:03 -07004001 void completeFGResize() {
4002 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4003 waitForPostedBuffers();
4004 }
4005 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004006 asTransaction([&](Transaction& t) {
4007 t.setSize(mFGSurfaceControl, 64, 64);
4008 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004009 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004010 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004011
4012 EXPECT_INITIAL_STATE("After restoring initial state");
4013 }
chaviw0e3479f2018-09-10 16:49:30 -07004014 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004015};
4016
Robert Carr8d5227b2017-03-16 15:41:03 -07004017class CropLatchingTest : public GeometryLatchingTest {
4018protected:
4019 void EXPECT_CROPPED_STATE(const char* trace) {
4020 SCOPED_TRACE(trace);
4021 ScreenCapture::captureScreen(&sc);
4022 // The edge should be moved back one pixel by our crop.
4023 sc->expectFGColor(126, 126);
4024 sc->expectBGColor(127, 127);
4025 sc->expectBGColor(128, 128);
4026 }
chaviw59f5c562017-06-28 16:39:06 -07004027
4028 void EXPECT_RESIZE_STATE(const char* trace) {
4029 SCOPED_TRACE(trace);
4030 ScreenCapture::captureScreen(&sc);
4031 // The FG is now resized too 128,128 at 64,64
4032 sc->expectFGColor(64, 64);
4033 sc->expectFGColor(191, 191);
4034 sc->expectBGColor(192, 192);
4035 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004036};
4037
Pablo Ceballos05289c22016-04-14 15:49:55 -07004038TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004039 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004040 {
4041 SCOPED_TRACE("before anything");
4042 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004043 sc->expectBGColor(32, 32);
4044 sc->expectFGColor(96, 96);
4045 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004046 }
4047
4048 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004049 asTransaction([&](Transaction& t) {
4050 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004051 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4052 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004053 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004054
Robert Carr4cdc58f2017-08-23 14:22:20 -07004055 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004056 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004057 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4058 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004059 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004060
4061 {
4062 SCOPED_TRACE("before any trigger");
4063 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004064 sc->expectBGColor(32, 32);
4065 sc->expectFGColor(96, 96);
4066 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004067 }
4068
4069 // should trigger the first deferred transaction, but not the second one
4070 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4071 {
4072 SCOPED_TRACE("after first trigger");
4073 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004074 sc->expectBGColor(32, 32);
4075 sc->checkPixel(96, 96, 162, 63, 96);
4076 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004077 }
4078
4079 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004080 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004081
4082 // trigger the second deferred transaction
4083 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4084 {
4085 SCOPED_TRACE("after second trigger");
4086 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004087 sc->expectBGColor(32, 32);
4088 sc->expectBGColor(96, 96);
4089 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004090 }
4091}
4092
Robert Carre392b552017-09-19 12:16:05 -07004093TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004094 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004095
4096 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004097 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4098 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4099 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4100 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004101 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004102 SurfaceComposerClient::Transaction{}
4103 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4104 .show(childNoBuffer)
4105 .show(childBuffer)
4106 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004107 {
4108 ScreenCapture::captureScreen(&sc);
4109 sc->expectChildColor(73, 73);
4110 sc->expectFGColor(74, 74);
4111 }
Vishnu Nair60356342018-11-13 13:00:45 -08004112 SurfaceComposerClient::Transaction{}
4113 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4114 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004115 {
4116 ScreenCapture::captureScreen(&sc);
4117 sc->expectChildColor(73, 73);
4118 sc->expectChildColor(74, 74);
4119 }
4120}
4121
Robert Carr2c5f6d22017-09-26 12:30:35 -07004122TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004123 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004124 {
4125 SCOPED_TRACE("before move");
4126 ScreenCapture::captureScreen(&sc);
4127 sc->expectBGColor(0, 12);
4128 sc->expectFGColor(75, 75);
4129 sc->expectBGColor(145, 145);
4130 }
4131
4132 Transaction t1, t2;
4133 t1.setPosition(mFGSurfaceControl, 128, 128);
4134 t2.setPosition(mFGSurfaceControl, 0, 0);
4135 // We expect that the position update from t2 now
4136 // overwrites the position update from t1.
4137 t1.merge(std::move(t2));
4138 t1.apply();
4139
4140 {
4141 ScreenCapture::captureScreen(&sc);
4142 sc->expectFGColor(1, 1);
4143 }
4144}
4145
Robert Carr1f0a16a2016-10-24 16:27:39 -07004146class ChildLayerTest : public LayerUpdateTest {
4147protected:
4148 void SetUp() override {
4149 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004150 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4151 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004152 fillSurfaceRGBA8(mChild, 200, 200, 200);
4153
4154 {
4155 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004156 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004157 mCapture->expectChildColor(64, 64);
4158 }
4159 }
4160 void TearDown() override {
4161 LayerUpdateTest::TearDown();
4162 mChild = 0;
4163 }
4164
4165 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004166 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004167};
4168
4169TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004170 asTransaction([&](Transaction& t) {
4171 t.show(mChild);
4172 t.setPosition(mChild, 10, 10);
4173 t.setPosition(mFGSurfaceControl, 64, 64);
4174 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004175
4176 {
chaviw0e3479f2018-09-10 16:49:30 -07004177 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004178 // Top left of foreground must now be visible
4179 mCapture->expectFGColor(64, 64);
4180 // But 10 pixels in we should see the child surface
4181 mCapture->expectChildColor(74, 74);
4182 // And 10 more pixels we should be back to the foreground surface
4183 mCapture->expectFGColor(84, 84);
4184 }
4185
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004186 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004187
4188 {
chaviw0e3479f2018-09-10 16:49:30 -07004189 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004190 // Top left of foreground should now be at 0, 0
4191 mCapture->expectFGColor(0, 0);
4192 // But 10 pixels in we should see the child surface
4193 mCapture->expectChildColor(10, 10);
4194 // And 10 more pixels we should be back to the foreground surface
4195 mCapture->expectFGColor(20, 20);
4196 }
4197}
4198
Robert Carr41b08b52017-06-01 16:11:34 -07004199TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004200 asTransaction([&](Transaction& t) {
4201 t.show(mChild);
4202 t.setPosition(mChild, 0, 0);
4203 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004204 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004205 });
Robert Carr41b08b52017-06-01 16:11:34 -07004206
4207 {
chaviw0e3479f2018-09-10 16:49:30 -07004208 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004209 mCapture->expectChildColor(0, 0);
4210 mCapture->expectChildColor(4, 4);
4211 mCapture->expectBGColor(5, 5);
4212 }
4213}
4214
Robert Carr1f0a16a2016-10-24 16:27:39 -07004215TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004216 asTransaction([&](Transaction& t) {
4217 t.show(mChild);
4218 t.setPosition(mFGSurfaceControl, 0, 0);
4219 t.setPosition(mChild, 63, 63);
4220 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004221
4222 {
chaviw0e3479f2018-09-10 16:49:30 -07004223 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004224 mCapture->expectFGColor(0, 0);
4225 // Last pixel in foreground should now be the child.
4226 mCapture->expectChildColor(63, 63);
4227 // But the child should be constrained and the next pixel
4228 // must be the background
4229 mCapture->expectBGColor(64, 64);
4230 }
4231}
4232
4233TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004234 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004235
4236 // Find the boundary between the parent and child
4237 {
chaviw0e3479f2018-09-10 16:49:30 -07004238 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004239 mCapture->expectChildColor(9, 9);
4240 mCapture->expectFGColor(10, 10);
4241 }
4242
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004243 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004244
4245 // The boundary should be twice as far from the origin now.
4246 // The pixels from the last test should all be child now
4247 {
chaviw0e3479f2018-09-10 16:49:30 -07004248 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004249 mCapture->expectChildColor(9, 9);
4250 mCapture->expectChildColor(10, 10);
4251 mCapture->expectChildColor(19, 19);
4252 mCapture->expectFGColor(20, 20);
4253 }
4254}
Robert Carr9524cb32017-02-13 11:32:32 -08004255
Robert Carr6452f122017-03-21 10:41:29 -07004256TEST_F(ChildLayerTest, ChildLayerAlpha) {
4257 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4258 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4259 fillSurfaceRGBA8(mChild, 0, 254, 0);
4260 waitForPostedBuffers();
4261
Robert Carr4cdc58f2017-08-23 14:22:20 -07004262 asTransaction([&](Transaction& t) {
4263 t.show(mChild);
4264 t.setPosition(mChild, 0, 0);
4265 t.setPosition(mFGSurfaceControl, 0, 0);
4266 });
Robert Carr6452f122017-03-21 10:41:29 -07004267
4268 {
chaviw0e3479f2018-09-10 16:49:30 -07004269 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004270 // Unblended child color
4271 mCapture->checkPixel(0, 0, 0, 254, 0);
4272 }
4273
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004274 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004275
4276 {
chaviw0e3479f2018-09-10 16:49:30 -07004277 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004278 // Child and BG blended.
4279 mCapture->checkPixel(0, 0, 127, 127, 0);
4280 }
4281
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004282 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004283
4284 {
chaviw0e3479f2018-09-10 16:49:30 -07004285 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004286 // Child and BG blended.
4287 mCapture->checkPixel(0, 0, 95, 64, 95);
4288 }
4289}
4290
Robert Carr9524cb32017-02-13 11:32:32 -08004291TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004292 asTransaction([&](Transaction& t) {
4293 t.show(mChild);
4294 t.setPosition(mChild, 10, 10);
4295 t.setPosition(mFGSurfaceControl, 64, 64);
4296 });
Robert Carr9524cb32017-02-13 11:32:32 -08004297
4298 {
chaviw0e3479f2018-09-10 16:49:30 -07004299 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004300 // Top left of foreground must now be visible
4301 mCapture->expectFGColor(64, 64);
4302 // But 10 pixels in we should see the child surface
4303 mCapture->expectChildColor(74, 74);
4304 // And 10 more pixels we should be back to the foreground surface
4305 mCapture->expectFGColor(84, 84);
4306 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004307
4308 asTransaction([&](Transaction& t) {
4309 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4310 });
4311
Robert Carr9524cb32017-02-13 11:32:32 -08004312 {
chaviw0e3479f2018-09-10 16:49:30 -07004313 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004314 mCapture->expectFGColor(64, 64);
4315 // In reparenting we should have exposed the entire foreground surface.
4316 mCapture->expectFGColor(74, 74);
4317 // And the child layer should now begin at 10, 10 (since the BG
4318 // layer is at (0, 0)).
4319 mCapture->expectBGColor(9, 9);
4320 mCapture->expectChildColor(10, 10);
4321 }
4322}
4323
Robert Carr2e102c92018-10-23 12:11:15 -07004324TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4325 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004326 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004327 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4328
4329 {
4330 SCOPED_TRACE("Grandchild visible");
4331 ScreenCapture::captureScreen(&mCapture);
4332 mCapture->checkPixel(64, 64, 111, 111, 111);
4333 }
4334
4335 mChild->clear();
4336
4337 {
4338 SCOPED_TRACE("After destroying child");
4339 ScreenCapture::captureScreen(&mCapture);
4340 mCapture->expectFGColor(64, 64);
4341 }
4342
4343 asTransaction([&](Transaction& t) {
4344 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4345 });
4346
4347 {
4348 SCOPED_TRACE("After reparenting grandchild");
4349 ScreenCapture::captureScreen(&mCapture);
4350 mCapture->checkPixel(64, 64, 111, 111, 111);
4351 }
4352}
4353
chaviw161410b02017-07-27 10:46:08 -07004354TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004355 asTransaction([&](Transaction& t) {
4356 t.show(mChild);
4357 t.setPosition(mChild, 10, 10);
4358 t.setPosition(mFGSurfaceControl, 64, 64);
4359 });
Robert Carr9524cb32017-02-13 11:32:32 -08004360
4361 {
chaviw0e3479f2018-09-10 16:49:30 -07004362 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004363 // Top left of foreground must now be visible
4364 mCapture->expectFGColor(64, 64);
4365 // But 10 pixels in we should see the child surface
4366 mCapture->expectChildColor(74, 74);
4367 // And 10 more pixels we should be back to the foreground surface
4368 mCapture->expectFGColor(84, 84);
4369 }
4370
chaviw0e3479f2018-09-10 16:49:30 -07004371
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004372 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004373
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004374 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004375
chaviw161410b02017-07-27 10:46:08 -07004376 // Since the child has the same client as the parent, it will not get
4377 // detached and will be hidden.
4378 {
chaviw0e3479f2018-09-10 16:49:30 -07004379 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004380 mCapture->expectFGColor(64, 64);
4381 mCapture->expectFGColor(74, 74);
4382 mCapture->expectFGColor(84, 84);
4383 }
4384}
4385
4386TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4387 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004388 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004389 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4390 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004391
chaviw161410b02017-07-27 10:46:08 -07004392 ASSERT_TRUE(mChildNewClient->isValid());
4393
4394 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4395
Robert Carr4cdc58f2017-08-23 14:22:20 -07004396 asTransaction([&](Transaction& t) {
4397 t.hide(mChild);
4398 t.show(mChildNewClient);
4399 t.setPosition(mChildNewClient, 10, 10);
4400 t.setPosition(mFGSurfaceControl, 64, 64);
4401 });
chaviw161410b02017-07-27 10:46:08 -07004402
4403 {
chaviw0e3479f2018-09-10 16:49:30 -07004404 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004405 // 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 }
4412
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004413 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004414
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004415 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004416
Robert Carr9524cb32017-02-13 11:32:32 -08004417 // Nothing should have changed.
4418 {
chaviw0e3479f2018-09-10 16:49:30 -07004419 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004420 mCapture->expectFGColor(64, 64);
4421 mCapture->expectChildColor(74, 74);
4422 mCapture->expectFGColor(84, 84);
4423 }
4424}
4425
chaviw5aedec92018-10-22 10:40:38 -07004426TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4427 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4428 sp<SurfaceControl> childNewClient =
4429 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4430 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4431
4432 ASSERT_TRUE(childNewClient != nullptr);
4433 ASSERT_TRUE(childNewClient->isValid());
4434
4435 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4436
4437 Transaction()
4438 .hide(mChild)
4439 .show(childNewClient)
4440 .setPosition(childNewClient, 10, 10)
4441 .setPosition(mFGSurfaceControl, 64, 64)
4442 .apply();
4443
4444 {
4445 mCapture = screenshot();
4446 // Top left of foreground must now be visible
4447 mCapture->expectFGColor(64, 64);
4448 // But 10 pixels in we should see the child surface
4449 mCapture->expectChildColor(74, 74);
4450 // And 10 more pixels we should be back to the foreground surface
4451 mCapture->expectFGColor(84, 84);
4452 }
4453
4454 Transaction().detachChildren(mFGSurfaceControl).apply();
4455 Transaction().hide(childNewClient).apply();
4456
4457 // Nothing should have changed.
4458 {
4459 mCapture = screenshot();
4460 mCapture->expectFGColor(64, 64);
4461 mCapture->expectChildColor(74, 74);
4462 mCapture->expectFGColor(84, 84);
4463 }
4464
4465 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4466 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4467 32);
4468 Transaction()
4469 .setLayer(newParentSurface, INT32_MAX - 1)
4470 .show(newParentSurface)
4471 .setPosition(newParentSurface, 20, 20)
4472 .reparent(childNewClient, newParentSurface->getHandle())
4473 .apply();
4474 {
4475 mCapture = screenshot();
4476 // Child is now hidden.
4477 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4478 }
4479}
4480
Robert Carr9b429f42017-04-17 14:56:57 -07004481TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004482 asTransaction([&](Transaction& t) {
4483 t.show(mChild);
4484 t.setPosition(mChild, 0, 0);
4485 t.setPosition(mFGSurfaceControl, 0, 0);
4486 });
Robert Carr9b429f42017-04-17 14:56:57 -07004487
4488 {
chaviw0e3479f2018-09-10 16:49:30 -07004489 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004490 // We've positioned the child in the top left.
4491 mCapture->expectChildColor(0, 0);
4492 // But it's only 10x10.
4493 mCapture->expectFGColor(10, 10);
4494 }
4495
Robert Carr4cdc58f2017-08-23 14:22:20 -07004496 asTransaction([&](Transaction& t) {
4497 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4498 // We cause scaling by 2.
4499 t.setSize(mFGSurfaceControl, 128, 128);
4500 });
Robert Carr9b429f42017-04-17 14:56:57 -07004501
4502 {
chaviw0e3479f2018-09-10 16:49:30 -07004503 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004504 // We've positioned the child in the top left.
4505 mCapture->expectChildColor(0, 0);
4506 mCapture->expectChildColor(10, 10);
4507 mCapture->expectChildColor(19, 19);
4508 // And now it should be scaled all the way to 20x20
4509 mCapture->expectFGColor(20, 20);
4510 }
4511}
4512
Robert Carr1725eee2017-04-26 18:32:15 -07004513// Regression test for b/37673612
4514TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004515 asTransaction([&](Transaction& t) {
4516 t.show(mChild);
4517 t.setPosition(mChild, 0, 0);
4518 t.setPosition(mFGSurfaceControl, 0, 0);
4519 });
Robert Carr1725eee2017-04-26 18:32:15 -07004520
4521 {
chaviw0e3479f2018-09-10 16:49:30 -07004522 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004523 // We've positioned the child in the top left.
4524 mCapture->expectChildColor(0, 0);
4525 // But it's only 10x10.
4526 mCapture->expectFGColor(10, 10);
4527 }
Robert Carr1725eee2017-04-26 18:32:15 -07004528 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4529 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004530 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004531 sp<Surface> s = mFGSurfaceControl->getSurface();
4532 auto anw = static_cast<ANativeWindow*>(s.get());
4533 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4534 native_window_set_buffers_dimensions(anw, 64, 128);
4535 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4536 waitForPostedBuffers();
4537
4538 {
4539 // The child should still be in the same place and not have any strange scaling as in
4540 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004541 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004542 mCapture->expectChildColor(0, 0);
4543 mCapture->expectFGColor(10, 10);
4544 }
4545}
4546
Dan Stoza412903f2017-04-27 13:42:17 -07004547TEST_F(ChildLayerTest, Bug36858924) {
4548 // Destroy the child layer
4549 mChild.clear();
4550
4551 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004552 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4553 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004554
4555 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004556 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004557 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4558 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004559 t.show(mChild);
4560 });
Dan Stoza412903f2017-04-27 13:42:17 -07004561
4562 // Render the foreground surface a few times
4563 //
4564 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4565 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4566 // never acquire/release the first buffer
4567 ALOGI("Filling 1");
4568 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4569 ALOGI("Filling 2");
4570 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4571 ALOGI("Filling 3");
4572 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4573 ALOGI("Filling 4");
4574 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4575}
4576
chaviwf1961f72017-09-18 16:41:07 -07004577TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004578 asTransaction([&](Transaction& t) {
4579 t.show(mChild);
4580 t.setPosition(mChild, 10, 10);
4581 t.setPosition(mFGSurfaceControl, 64, 64);
4582 });
chaviw06178942017-07-27 10:25:59 -07004583
4584 {
chaviw0e3479f2018-09-10 16:49:30 -07004585 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004586 // Top left of foreground must now be visible
4587 mCapture->expectFGColor(64, 64);
4588 // But 10 pixels in we should see the child surface
4589 mCapture->expectChildColor(74, 74);
4590 // And 10 more pixels we should be back to the foreground surface
4591 mCapture->expectFGColor(84, 84);
4592 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004593
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004594 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004595
chaviw06178942017-07-27 10:25:59 -07004596 {
chaviw0e3479f2018-09-10 16:49:30 -07004597 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004598 mCapture->expectFGColor(64, 64);
4599 // In reparenting we should have exposed the entire foreground surface.
4600 mCapture->expectFGColor(74, 74);
4601 // And the child layer should now begin at 10, 10 (since the BG
4602 // layer is at (0, 0)).
4603 mCapture->expectBGColor(9, 9);
4604 mCapture->expectChildColor(10, 10);
4605 }
4606}
4607
chaviwf1961f72017-09-18 16:41:07 -07004608TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004609 asTransaction([&](Transaction& t) {
4610 t.show(mChild);
4611 t.setPosition(mChild, 10, 10);
4612 t.setPosition(mFGSurfaceControl, 64, 64);
4613 });
chaviwf1961f72017-09-18 16:41:07 -07004614
4615 {
chaviw0e3479f2018-09-10 16:49:30 -07004616 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004617 // Top left of foreground must now be visible
4618 mCapture->expectFGColor(64, 64);
4619 // But 10 pixels in we should see the child surface
4620 mCapture->expectChildColor(74, 74);
4621 // And 10 more pixels we should be back to the foreground surface
4622 mCapture->expectFGColor(84, 84);
4623 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004624 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004625 {
chaviw0e3479f2018-09-10 16:49:30 -07004626 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004627 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004628 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004629 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004630 mCapture->expectFGColor(84, 84);
4631 }
4632}
4633
4634TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004635 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004636 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004637 ASSERT_TRUE(newSurface->isValid());
4638
4639 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004640 asTransaction([&](Transaction& t) {
4641 t.hide(mChild);
4642 t.show(newSurface);
4643 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004644 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004645 t.setPosition(mFGSurfaceControl, 64, 64);
4646 });
chaviwf1961f72017-09-18 16:41:07 -07004647
4648 {
chaviw0e3479f2018-09-10 16:49:30 -07004649 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004650 // Top left of foreground must now be visible
4651 mCapture->expectFGColor(64, 64);
4652 // At 10, 10 we should see the new surface
4653 mCapture->checkPixel(10, 10, 63, 195, 63);
4654 }
4655
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004656 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004657
4658 {
chaviw0e3479f2018-09-10 16:49:30 -07004659 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004660 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4661 // mFGSurface, putting it at 74, 74.
4662 mCapture->expectFGColor(64, 64);
4663 mCapture->checkPixel(74, 74, 63, 195, 63);
4664 mCapture->expectFGColor(84, 84);
4665 }
4666}
4667
chaviwc9674332017-08-28 12:32:18 -07004668TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004669 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4670 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004671 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4672
4673 {
chaviw0e3479f2018-09-10 16:49:30 -07004674 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004675 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4676 // which begins at 64, 64
4677 mCapture->checkPixel(64, 64, 50, 50, 50);
4678 }
4679}
4680
Robert Carr503c7042017-09-27 15:06:08 -07004681TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004682 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004683 fillSurfaceRGBA8(relative, 255, 255, 255);
4684
4685 Transaction t;
4686 t.setLayer(relative, INT32_MAX)
4687 .setRelativeLayer(mChild, relative->getHandle(), 1)
4688 .setPosition(mFGSurfaceControl, 0, 0)
4689 .apply(true);
4690
4691 // We expect that the child should have been elevated above our
4692 // INT_MAX layer even though it's not a child of it.
4693 {
chaviw0e3479f2018-09-10 16:49:30 -07004694 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004695 mCapture->expectChildColor(0, 0);
4696 mCapture->expectChildColor(9, 9);
4697 mCapture->checkPixel(10, 10, 255, 255, 255);
4698 }
4699}
Vishnu Nair60356342018-11-13 13:00:45 -08004700class BoundlessLayerTest : public LayerUpdateTest {
4701protected:
4702 std::unique_ptr<ScreenCapture> mCapture;
4703};
4704
4705// Verify setting a size on a buffer layer has no effect.
4706TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4707 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004708 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4709 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004710 ASSERT_TRUE(bufferLayer->isValid());
4711 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4712 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4713 {
4714 mCapture = screenshot();
4715 // Top left of background must now be visible
4716 mCapture->expectBGColor(0, 0);
4717 // Foreground Surface bounds must be color layer
4718 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4719 // Buffer layer should not extend past buffer bounds
4720 mCapture->expectFGColor(95, 95);
4721 }
4722}
4723
4724// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4725// which will crop the color layer.
4726TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4727 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004728 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4729 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004730 ASSERT_TRUE(colorLayer->isValid());
4731 asTransaction([&](Transaction& t) {
4732 t.setColor(colorLayer, half3{0, 0, 0});
4733 t.show(colorLayer);
4734 });
4735 {
4736 mCapture = screenshot();
4737 // Top left of background must now be visible
4738 mCapture->expectBGColor(0, 0);
4739 // Foreground Surface bounds must be color layer
4740 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4741 // Color layer should not extend past foreground bounds
4742 mCapture->expectBGColor(129, 129);
4743 }
4744}
4745
4746// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4747// a crop which will be used to crop the color layer.
4748TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004749 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4750 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004751 ASSERT_TRUE(cropLayer->isValid());
4752 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004753 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4754 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004755 ASSERT_TRUE(colorLayer->isValid());
4756 asTransaction([&](Transaction& t) {
4757 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4758 t.setColor(colorLayer, half3{0, 0, 0});
4759 t.show(cropLayer);
4760 t.show(colorLayer);
4761 });
4762 {
4763 mCapture = screenshot();
4764 // Top left of background must now be visible
4765 mCapture->expectBGColor(0, 0);
4766 // Top left of foreground must now be visible
4767 mCapture->expectFGColor(64, 64);
4768 // 5 pixels from the foreground we should see the child surface
4769 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4770 // 10 pixels from the foreground we should be back to the foreground surface
4771 mCapture->expectFGColor(74, 74);
4772 }
4773}
4774
4775// Verify for boundless layer with no children, their transforms have no effect.
4776TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4777 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004778 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4779 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004780 ASSERT_TRUE(colorLayer->isValid());
4781 asTransaction([&](Transaction& t) {
4782 t.setPosition(colorLayer, 320, 320);
4783 t.setMatrix(colorLayer, 2, 0, 0, 2);
4784 t.setColor(colorLayer, half3{0, 0, 0});
4785 t.show(colorLayer);
4786 });
4787 {
4788 mCapture = screenshot();
4789 // Top left of background must now be visible
4790 mCapture->expectBGColor(0, 0);
4791 // Foreground Surface bounds must be color layer
4792 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4793 // Color layer should not extend past foreground bounds
4794 mCapture->expectBGColor(129, 129);
4795 }
4796}
4797
4798// Verify for boundless layer with children, their transforms have an effect.
4799TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4800 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004801 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4802 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004803 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4804 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004805 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4806 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004807 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4808 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004809 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4810 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004811 ASSERT_TRUE(colorLayer->isValid());
4812 asTransaction([&](Transaction& t) {
4813 t.setPosition(boundlessLayerRightShift, 32, 0);
4814 t.show(boundlessLayerRightShift);
4815 t.setPosition(boundlessLayerDownShift, 0, 32);
4816 t.show(boundlessLayerDownShift);
4817 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4818 t.setColor(colorLayer, half3{0, 0, 0});
4819 t.show(colorLayer);
4820 });
4821 {
4822 mCapture = screenshot();
4823 // Top left of background must now be visible
4824 mCapture->expectBGColor(0, 0);
4825 // Top left of foreground must now be visible
4826 mCapture->expectFGColor(64, 64);
4827 // Foreground Surface bounds must be color layer
4828 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4829 // Color layer should not extend past foreground bounds
4830 mCapture->expectBGColor(129, 129);
4831 }
4832}
4833
4834// Verify child layers do not get clipped if they temporarily move into the negative
4835// coordinate space as the result of an intermediate transformation.
4836TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4837 sp<SurfaceControl> boundlessLayer =
4838 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4839 0 /* flags */, mFGSurfaceControl.get());
4840 ASSERT_TRUE(boundlessLayer != nullptr);
4841 ASSERT_TRUE(boundlessLayer->isValid());
4842 sp<SurfaceControl> colorLayer =
4843 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4844 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4845 ASSERT_TRUE(colorLayer != nullptr);
4846 ASSERT_TRUE(colorLayer->isValid());
4847 asTransaction([&](Transaction& t) {
4848 // shift child layer off bounds. If this layer was not boundless, we will
4849 // expect the child layer to be cropped.
4850 t.setPosition(boundlessLayer, 32, 32);
4851 t.show(boundlessLayer);
4852 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4853 // undo shift by parent
4854 t.setPosition(colorLayer, -32, -32);
4855 t.setColor(colorLayer, half3{0, 0, 0});
4856 t.show(colorLayer);
4857 });
4858 {
4859 mCapture = screenshot();
4860 // Top left of background must now be visible
4861 mCapture->expectBGColor(0, 0);
4862 // Foreground Surface bounds must be color layer
4863 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4864 // Color layer should not extend past foreground bounds
4865 mCapture->expectBGColor(129, 129);
4866 }
4867}
4868
4869// Verify for boundless root layers with children, their transforms have an effect.
4870TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004871 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4872 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004873 ASSERT_TRUE(rootBoundlessLayer->isValid());
4874 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004875 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4876 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4877
Vishnu Nair60356342018-11-13 13:00:45 -08004878 ASSERT_TRUE(colorLayer->isValid());
4879 asTransaction([&](Transaction& t) {
4880 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4881 t.setPosition(rootBoundlessLayer, 32, 32);
4882 t.show(rootBoundlessLayer);
4883 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4884 t.setColor(colorLayer, half3{0, 0, 0});
4885 t.show(colorLayer);
4886 t.hide(mFGSurfaceControl);
4887 });
4888 {
4889 mCapture = screenshot();
4890 // Top left of background must now be visible
4891 mCapture->expectBGColor(0, 0);
4892 // Top left of foreground must now be visible
4893 mCapture->expectBGColor(31, 31);
4894 // Foreground Surface bounds must be color layer
4895 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
4896 // Color layer should not extend past foreground bounds
4897 mCapture->expectBGColor(97, 97);
4898 }
4899}
Robert Carr503c7042017-09-27 15:06:08 -07004900
chaviwa76b2712017-09-20 12:02:26 -07004901class ScreenCaptureTest : public LayerUpdateTest {
4902protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004903 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07004904};
4905
4906TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
4907 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004908 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004909 mCapture->expectBGColor(0, 0);
4910 // Doesn't capture FG layer which is at 64, 64
4911 mCapture->expectBGColor(64, 64);
4912}
4913
4914TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
4915 auto fgHandle = mFGSurfaceControl->getHandle();
4916
Vishnu Nair88a11f22018-11-28 18:30:57 -08004917 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4918 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07004919 fillSurfaceRGBA8(child, 200, 200, 200);
4920
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004921 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07004922
4923 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004924 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004925 mCapture->expectFGColor(10, 10);
4926 mCapture->expectChildColor(0, 0);
4927}
4928
Robert Carr578038f2018-03-09 12:25:24 -08004929TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
4930 auto fgHandle = mFGSurfaceControl->getHandle();
4931
Vishnu Nair88a11f22018-11-28 18:30:57 -08004932 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4933 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08004934 fillSurfaceRGBA8(child, 200, 200, 200);
4935
4936 SurfaceComposerClient::Transaction().show(child).apply(true);
4937
4938 // Captures mFGSurfaceControl's child
4939 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
4940 mCapture->checkPixel(10, 10, 0, 0, 0);
4941 mCapture->expectChildColor(0, 0);
4942}
4943
chaviw50da5042018-04-09 13:49:37 -07004944TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004945 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4946 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07004947
4948 fillSurfaceRGBA8(child, 200, 200, 200);
4949
4950 SurfaceComposerClient::Transaction().show(child).apply(true);
4951
4952 auto childHandle = child->getHandle();
4953
4954 // Captures child
4955 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
4956 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
4957 // Area outside of child's bounds is transparent.
4958 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
4959}
4960
chaviw4b129c22018-04-09 16:19:43 -07004961TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
4962 auto fgHandle = mFGSurfaceControl->getHandle();
4963
Vishnu Nair88a11f22018-11-28 18:30:57 -08004964 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4965 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4966 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07004967 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07004968 fillSurfaceRGBA8(child, 200, 200, 200);
4969 fillSurfaceRGBA8(relative, 100, 100, 100);
4970
4971 SurfaceComposerClient::Transaction()
4972 .show(child)
4973 // Set relative layer above fg layer so should be shown above when computing all layers.
4974 .setRelativeLayer(relative, fgHandle, 1)
4975 .show(relative)
4976 .apply(true);
4977
4978 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
4979 ScreenCapture::captureLayers(&mCapture, fgHandle);
4980 mCapture->expectFGColor(10, 10);
4981 mCapture->expectChildColor(0, 0);
4982}
4983
4984TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
4985 auto fgHandle = mFGSurfaceControl->getHandle();
4986
Vishnu Nair88a11f22018-11-28 18:30:57 -08004987 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4988 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4989 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
4990 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07004991 fillSurfaceRGBA8(child, 200, 200, 200);
4992 fillSurfaceRGBA8(relative, 100, 100, 100);
4993
4994 SurfaceComposerClient::Transaction()
4995 .show(child)
4996 // Set relative layer below fg layer but relative to child layer so it should be shown
4997 // above child layer.
4998 .setLayer(relative, -1)
4999 .setRelativeLayer(relative, child->getHandle(), 1)
5000 .show(relative)
5001 .apply(true);
5002
5003 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5004 // relative value should be taken into account, placing it above child layer.
5005 ScreenCapture::captureLayers(&mCapture, fgHandle);
5006 mCapture->expectFGColor(10, 10);
5007 // Relative layer is showing on top of child layer
5008 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5009}
Robert Carr578038f2018-03-09 12:25:24 -08005010
5011// In the following tests we verify successful skipping of a parent layer,
5012// so we use the same verification logic and only change how we mutate
5013// the parent layer to verify that various properties are ignored.
5014class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5015public:
5016 void SetUp() override {
5017 LayerUpdateTest::SetUp();
5018
Vishnu Nair88a11f22018-11-28 18:30:57 -08005019 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5020 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005021 fillSurfaceRGBA8(mChild, 200, 200, 200);
5022
5023 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5024 }
5025
5026 void verify() {
5027 auto fgHandle = mFGSurfaceControl->getHandle();
5028 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5029 mCapture->checkPixel(10, 10, 0, 0, 0);
5030 mCapture->expectChildColor(0, 0);
5031 }
5032
5033 std::unique_ptr<ScreenCapture> mCapture;
5034 sp<SurfaceControl> mChild;
5035};
5036
5037TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5038
5039 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5040
5041 // Even though the parent is hidden we should still capture the child.
5042 verify();
5043}
5044
5045TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005046 SurfaceComposerClient::Transaction()
5047 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5048 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005049
5050 // Even though the parent is cropped out we should still capture the child.
5051 verify();
5052}
5053
5054TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
5055
5056 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2);
5057
5058 // We should not inherit the parent scaling.
5059 verify();
5060}
5061
Robert Carr15eae092018-03-23 13:43:53 -07005062TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) {
5063 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5064
5065 // Even though the parent is hidden we should still capture the child.
5066 verify();
5067
5068 // Verify everything was properly hidden when rendering the full-screen.
5069 screenshot()->expectBGColor(0,0);
5070}
5071
5072
chaviwa76b2712017-09-20 12:02:26 -07005073TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5074 auto fgHandle = mFGSurfaceControl->getHandle();
5075
Vishnu Nair88a11f22018-11-28 18:30:57 -08005076 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5077 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005078 fillSurfaceRGBA8(child, 200, 200, 200);
5079
Vishnu Nair88a11f22018-11-28 18:30:57 -08005080 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5081 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005082
5083 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5084 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005085 .show(child)
5086 .setPosition(grandchild, 5, 5)
5087 .show(grandchild)
5088 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005089
5090 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005091 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005092 mCapture->expectFGColor(10, 10);
5093 mCapture->expectChildColor(0, 0);
5094 mCapture->checkPixel(5, 5, 50, 50, 50);
5095}
5096
5097TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005098 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5099 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005100 fillSurfaceRGBA8(child, 200, 200, 200);
5101 auto childHandle = child->getHandle();
5102
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005103 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005104
5105 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005106 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005107 mCapture->expectChildColor(0, 0);
5108 mCapture->expectChildColor(9, 9);
5109}
5110
5111TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005112 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5113 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005114 fillSurfaceRGBA8(child, 200, 200, 200);
5115 auto childHandle = child->getHandle();
5116
Vishnu Nair88a11f22018-11-28 18:30:57 -08005117 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5118 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005119 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5120
5121 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005122 .show(child)
5123 .setPosition(grandchild, 5, 5)
5124 .show(grandchild)
5125 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005126
5127 auto grandchildHandle = grandchild->getHandle();
5128
5129 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005130 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005131 mCapture->checkPixel(0, 0, 50, 50, 50);
5132 mCapture->checkPixel(4, 4, 50, 50, 50);
5133}
5134
chaviw7206d492017-11-10 16:16:12 -08005135TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005136 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005137 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5138 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005139
Marissa Wall61c58622018-07-18 10:12:20 -07005140 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5141 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005142
5143 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005144 .setLayer(redLayer, INT32_MAX - 1)
5145 .show(redLayer)
5146 .show(blueLayer)
5147 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005148
5149 auto redLayerHandle = redLayer->getHandle();
5150
5151 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005152 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5153 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5154 // red area below the blue area
5155 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5156 // red area to the right of the blue area
5157 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005158
Marissa Wall861616d2018-10-22 12:52:23 -07005159 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005160 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005161 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5162 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005163 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005164 mCapture->checkPixel(30, 30, 0, 0, 0);
5165}
5166
5167TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005168 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005169 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5170 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005171
Marissa Wall61c58622018-07-18 10:12:20 -07005172 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5173 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005174
5175 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005176 .setLayer(redLayer, INT32_MAX - 1)
5177 .show(redLayer)
5178 .show(blueLayer)
5179 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005180
5181 auto redLayerHandle = redLayer->getHandle();
5182
5183 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005184 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5185 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5186 // red area below the blue area
5187 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5188 // red area to the right of the blue area
5189 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005190
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005191 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005192 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005193 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5194 // red area below the blue area
5195 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5196 // red area to the right of the blue area
5197 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005198 mCapture->checkPixel(30, 30, 0, 0, 0);
5199}
5200
5201TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005202 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005203
Marissa Wall61c58622018-07-18 10:12:20 -07005204 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005205
5206 auto redLayerHandle = redLayer->getHandle();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005207 redLayer->clear();
chaviw7206d492017-11-10 16:16:12 -08005208 SurfaceComposerClient::Transaction().apply(true);
5209
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005210 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005211
5212 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005213 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5214 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005215}
5216
chaviw8e3fe5d2018-02-22 10:55:42 -08005217
5218class DereferenceSurfaceControlTest : public LayerTransactionTest {
5219protected:
5220 void SetUp() override {
5221 LayerTransactionTest::SetUp();
5222 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005223 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005224 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005225 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005226 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5227 {
5228 SCOPED_TRACE("before anything");
5229 auto shot = screenshot();
5230 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5231 }
5232 }
5233 void TearDown() override {
5234 LayerTransactionTest::TearDown();
5235 bgLayer = 0;
5236 fgLayer = 0;
5237 }
5238
5239 sp<SurfaceControl> bgLayer;
5240 sp<SurfaceControl> fgLayer;
5241};
5242
5243TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5244 fgLayer = nullptr;
5245 {
5246 SCOPED_TRACE("after setting null");
5247 auto shot = screenshot();
5248 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5249 }
5250}
5251
5252TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5253 auto transaction = Transaction().show(fgLayer);
5254 fgLayer = nullptr;
5255 {
5256 SCOPED_TRACE("after setting null");
5257 auto shot = screenshot();
5258 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5259 }
5260}
5261
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005262} // namespace android