blob: 50a2e602d73219a58477afe78b3fda1ad717f3fc [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
35#include <private/gui/ComposerService.h>
36
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070037#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070038#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070039#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070040#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070041
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070042#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070043#include <math/vec3.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044
Marissa Wall713b63f2018-10-17 15:42:43 -070045#include "BufferGenerator.h"
46
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070047namespace android {
48
Chia-I Wu718daf82017-10-20 11:57:17 -070049namespace {
50
51struct Color {
52 uint8_t r;
53 uint8_t g;
54 uint8_t b;
55 uint8_t a;
56
57 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070058 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070059 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070060 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070061 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070062 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070063};
64
65const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070066const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070067const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070068const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070069const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070070const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070073using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070074
Chia-I Wu718daf82017-10-20 11:57:17 -070075std::ostream& operator<<(std::ostream& os, const Color& color) {
76 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
77 return os;
78}
79
80// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070081void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
82 const Color& color) {
83 Rect r(0, 0, buffer.width, buffer.height);
84 if (!r.intersect(rect, &r)) {
85 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070086 }
87
Marissa Wall61c58622018-07-18 10:12:20 -070088 int32_t width = r.right - r.left;
89 int32_t height = r.bottom - r.top;
90
91 for (int32_t row = 0; row < height; row++) {
92 uint8_t* dst =
93 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
94 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070095 dst[0] = color.r;
96 dst[1] = color.g;
97 dst[2] = color.b;
98 dst[3] = color.a;
99 dst += 4;
100 }
101 }
102}
103
Marissa Wall61c58622018-07-18 10:12:20 -0700104// Fill a region with the specified color.
105void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
106 Rect r(0, 0, buffer->width, buffer->height);
107 if (!r.intersect(rect, &r)) {
108 return;
109 }
110
111 int32_t width = r.right - r.left;
112 int32_t height = r.bottom - r.top;
113
114 uint8_t* pixels;
115 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
116 reinterpret_cast<void**>(&pixels));
117
118 for (int32_t row = 0; row < height; row++) {
119 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
120 for (int32_t column = 0; column < width; column++) {
121 dst[0] = color.r;
122 dst[1] = color.g;
123 dst[2] = color.b;
124 dst[3] = color.a;
125 dst += 4;
126 }
127 }
128 buffer->unlock();
129}
130
Chia-I Wu718daf82017-10-20 11:57:17 -0700131// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000132void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700133 const Color& color, uint8_t tolerance) {
134 int32_t x = rect.left;
135 int32_t y = rect.top;
136 int32_t width = rect.right - rect.left;
137 int32_t height = rect.bottom - rect.top;
138
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000139 int32_t bufferWidth = int32_t(outBuffer->getWidth());
140 int32_t bufferHeight = int32_t(outBuffer->getHeight());
141 if (x + width > bufferWidth) {
142 x = std::min(x, bufferWidth);
143 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700144 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000145 if (y + height > bufferHeight) {
146 y = std::min(y, bufferHeight);
147 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
149
150 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
151 uint8_t tmp = a >= b ? a - b : b - a;
152 return tmp <= tolerance;
153 };
154 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000155 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700156 for (int32_t i = 0; i < width; i++) {
157 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
158 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
159 << "pixel @ (" << x + i << ", " << y + j << "): "
160 << "expected (" << color << "), "
161 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
162 src += 4;
163 }
164 }
165}
166
167} // anonymous namespace
168
Robert Carr4cdc58f2017-08-23 14:22:20 -0700169using Transaction = SurfaceComposerClient::Transaction;
170
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700171// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700172static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
173 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800174 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800176 ASSERT_TRUE(s != nullptr);
177 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700179 for (int y = 0; y < outBuffer.height; y++) {
180 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700181 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700182 pixel[0] = r;
183 pixel[1] = g;
184 pixel[2] = b;
185 pixel[3] = 255;
186 }
187 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700188 if (unlock) {
189 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
190 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700191}
192
193// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
194// individual pixel values for testing purposes.
195class ScreenCapture : public RefBase {
196public:
chaviw0e3479f2018-09-10 16:49:30 -0700197 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700198 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700199 sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Robert Carr4cdc58f2017-08-23 14:22:20 -0700200 SurfaceComposerClient::Transaction().apply(true);
201
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000202 sp<GraphicBuffer> outBuffer;
Chia-I Wu718daf82017-10-20 11:57:17 -0700203 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -0700204 sf->captureScreen(display, &outBuffer, Rect(), 0, 0, false));
205 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000206 }
207
208 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
209 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
210 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
211 SurfaceComposerClient::Transaction().apply(true);
212
213 sp<GraphicBuffer> outBuffer;
214 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
215 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700216 }
217
Robert Carr578038f2018-03-09 12:25:24 -0800218 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
219 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
220 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
221 SurfaceComposerClient::Transaction().apply(true);
222
223 sp<GraphicBuffer> outBuffer;
224 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
225 *sc = std::make_unique<ScreenCapture>(outBuffer);
226 }
227
Chia-I Wu718daf82017-10-20 11:57:17 -0700228 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000229 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
230 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700231 }
232
233 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000234 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700235 const bool leftBorder = rect.left > 0;
236 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000237 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
238 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700239
240 if (topBorder) {
241 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
242 if (leftBorder) {
243 top.left -= 1;
244 }
245 if (rightBorder) {
246 top.right += 1;
247 }
248 expectColor(top, color, tolerance);
249 }
250 if (leftBorder) {
251 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
252 expectColor(left, color, tolerance);
253 }
254 if (rightBorder) {
255 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
256 expectColor(right, color, tolerance);
257 }
258 if (bottomBorder) {
259 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
260 if (leftBorder) {
261 bottom.left -= 1;
262 }
263 if (rightBorder) {
264 bottom.right += 1;
265 }
266 expectColor(bottom, color, tolerance);
267 }
268 }
269
Chia-I Wu93853fe2017-11-02 08:30:27 -0700270 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
271 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
272 uint8_t tolerance = 0) {
273 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
274
275 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
276 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
277 // avoid checking borders due to unspecified filtering behavior
278 const int32_t offsetX = filtered ? 2 : 0;
279 const int32_t offsetY = filtered ? 2 : 0;
280 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
281 tolerance);
282 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
283 tolerance);
284 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
285 tolerance);
286 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
287 bottomRight, tolerance);
288 }
289
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700290 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000291 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
292 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700293 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
294 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700295 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
296 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700297 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700298 }
299 }
300
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700301 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700302
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700303 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700304
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700305 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700306
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800307 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000308 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700309 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700310
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000311 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700312
313private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000314 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800315 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700316};
317
Chia-I Wu718daf82017-10-20 11:57:17 -0700318class LayerTransactionTest : public ::testing::Test {
319protected:
320 void SetUp() override {
321 mClient = new SurfaceComposerClient;
322 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
323
324 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700325
326 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
327 sp<IBinder> binder = sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
Ady Abraham37965d42018-11-01 13:43:32 -0700328 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700329 }
330
chaviw0e3479f2018-09-10 16:49:30 -0700331 virtual void TearDown() {
332 mBlackBgSurface = 0;
333 mClient->dispose();
334 mClient = 0;
335 }
336
Marissa Wallfda30bb2018-10-12 11:34:28 -0700337 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
338 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800339 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
340 auto layer =
341 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700342
Vishnu Nair60356342018-11-13 13:00:45 -0800343 Transaction t;
344 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800345
346 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700347 if (error != NO_ERROR) {
348 ADD_FAILURE() << "failed to initialize SurfaceControl";
349 layer.clear();
350 }
351
352 return layer;
353 }
354
Vishnu Nair88a11f22018-11-28 18:30:57 -0800355 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
356 const char* name, uint32_t width, uint32_t height,
357 PixelFormat format, uint32_t flags,
358 SurfaceControl* parent = nullptr) {
359 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
360 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
361 return layer;
362 }
363
Marissa Wallfda30bb2018-10-12 11:34:28 -0700364 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800365 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
366 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700367 }
368
Marissa Wall61c58622018-07-18 10:12:20 -0700369 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700370 // wait for previous transactions (such as setSize) to complete
371 Transaction().apply(true);
372
373 ANativeWindow_Buffer buffer = {};
374 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
375
376 return buffer;
377 }
378
Marissa Wall61c58622018-07-18 10:12:20 -0700379 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700380 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
381
382 // wait for the newly posted buffer to be latched
383 waitForLayerBuffers();
384 }
385
Marissa Wall61c58622018-07-18 10:12:20 -0700386 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
387 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700388 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700389 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
390 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
391 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700392 }
393
Marissa Wall61c58622018-07-18 10:12:20 -0700394 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
395 int32_t bufferWidth, int32_t bufferHeight) {
396 sp<GraphicBuffer> buffer =
397 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
398 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
399 BufferUsage::COMPOSER_OVERLAY,
400 "test");
401 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700402 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700403 }
404
405 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
406 int32_t bufferWidth, int32_t bufferHeight) {
407 switch (mLayerType) {
408 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
409 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
410 break;
411 case ISurfaceComposerClient::eFXSurfaceBufferState:
412 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
413 break;
414 default:
415 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
416 }
417 }
418
419 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
420 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700421 const Color& topRight, const Color& bottomLeft,
422 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700423 switch (mLayerType) {
424 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
425 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
426 bottomLeft, bottomRight);
427 break;
428 case ISurfaceComposerClient::eFXSurfaceBufferState:
429 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
430 bottomLeft, bottomRight);
431 break;
432 default:
433 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
434 }
435 }
436
437 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
438 int32_t bufferHeight, const Color& topLeft,
439 const Color& topRight, const Color& bottomLeft,
440 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700441 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700442 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
443 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700444
Marissa Wall61c58622018-07-18 10:12:20 -0700445 const int32_t halfW = bufferWidth / 2;
446 const int32_t halfH = bufferHeight / 2;
447 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
448 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
449 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
450 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
451 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700452
Marissa Wall61c58622018-07-18 10:12:20 -0700453 postBufferQueueLayerBuffer(layer);
454 }
455
456 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
457 int32_t bufferHeight, const Color& topLeft,
458 const Color& topRight, const Color& bottomLeft,
459 const Color& bottomRight) {
460 sp<GraphicBuffer> buffer =
461 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
462 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
463 BufferUsage::COMPOSER_OVERLAY,
464 "test");
465
466 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
467
468 const int32_t halfW = bufferWidth / 2;
469 const int32_t halfH = bufferHeight / 2;
470 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
471 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
472 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
473 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
474
475 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700476 }
477
chaviw0e3479f2018-09-10 16:49:30 -0700478 std::unique_ptr<ScreenCapture> screenshot() {
479 std::unique_ptr<ScreenCapture> screenshot;
480 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700481 return screenshot;
482 }
483
Marissa Wall713b63f2018-10-17 15:42:43 -0700484 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
485 static BufferGenerator bufferGenerator;
486 return bufferGenerator.get(outBuffer, outFence);
487 }
488
Chia-I Wu718daf82017-10-20 11:57:17 -0700489 sp<SurfaceComposerClient> mClient;
490
491 sp<IBinder> mDisplay;
492 uint32_t mDisplayWidth;
493 uint32_t mDisplayHeight;
494 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700495 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700496
497 // leave room for ~256 layers
498 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
499
chaviw0e3479f2018-09-10 16:49:30 -0700500 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700501 bool mColorManagementUsed;
502
Chia-I Wu718daf82017-10-20 11:57:17 -0700503private:
504 void SetUpDisplay() {
505 mDisplay = mClient->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
506 ASSERT_NE(nullptr, mDisplay.get()) << "failed to get built-in display";
507
508 // get display width/height
509 DisplayInfo info;
510 SurfaceComposerClient::getDisplayInfo(mDisplay, &info);
511 mDisplayWidth = info.w;
512 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700513 mDisplayRect =
514 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700515
516 // After a new buffer is queued, SurfaceFlinger is notified and will
517 // latch the new buffer on next vsync. Let's heuristically wait for 3
518 // vsyncs.
519 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
520
521 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700522
Vishnu Nair88a11f22018-11-28 18:30:57 -0800523 mBlackBgSurface =
524 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
525 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700526
Chia-I Wu718daf82017-10-20 11:57:17 -0700527 // set layer stack (b/68888219)
528 Transaction t;
529 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800530 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700531 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
532 t.setColor(mBlackBgSurface, half3{0, 0, 0});
533 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700534 t.apply();
535 }
536
chaviw0e3479f2018-09-10 16:49:30 -0700537 void waitForLayerBuffers() {
538 // Request an empty transaction to get applied synchronously to ensure the buffer is
539 // latched.
540 Transaction().apply(true);
541 usleep(mBufferPostDelay);
542 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700543
544 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800545
546 friend class LayerRenderPathTestHarness;
547};
548enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
549
550class LayerRenderPathTestHarness {
551public:
552 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
553 : mDelegate(delegate), mRenderPath(renderPath) {}
554
555 std::unique_ptr<ScreenCapture> getScreenCapture() {
556 switch (mRenderPath) {
557 case RenderPath::SCREENSHOT:
558 return mDelegate->screenshot();
559 case RenderPath::VIRTUAL_DISPLAY:
560
561 sp<IBinder> mainDisplay =
562 SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
563 DisplayInfo mainDisplayInfo;
564 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
565
566 sp<IBinder> vDisplay;
567 sp<IGraphicBufferProducer> producer;
568 sp<IGraphicBufferConsumer> consumer;
569 sp<BufferItemConsumer> itemConsumer;
570 BufferQueue::createBufferQueue(&producer, &consumer);
571
572 consumer->setConsumerName(String8("Virtual disp consumer"));
573 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
574
575 itemConsumer = new BufferItemConsumer(consumer,
576 // Sample usage bits from screenrecord
577 GRALLOC_USAGE_HW_VIDEO_ENCODER |
578 GRALLOC_USAGE_SW_READ_OFTEN);
579
580 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
581 false /*secure*/);
582
583 SurfaceComposerClient::Transaction t;
584 t.setDisplaySurface(vDisplay, producer);
585 t.setDisplayLayerStack(vDisplay, 0);
586 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
587 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
588 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
589 t.apply();
590 SurfaceComposerClient::Transaction().apply(true);
591 BufferItem item;
592 itemConsumer->acquireBuffer(&item, 0, true);
593 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
594 itemConsumer->releaseBuffer(item);
595 SurfaceComposerClient::destroyDisplay(vDisplay);
596 return sc;
597 }
598 }
599
600protected:
601 LayerTransactionTest* mDelegate;
602 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700603};
604
Alec Mouri80863a62019-01-17 15:19:35 -0800605class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700606public:
Alec Mouri80863a62019-01-17 15:19:35 -0800607 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700608
609 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800610 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700611 // if the flags already have a layer type specified, return an error
612 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
613 return nullptr;
614 }
chaviwf66724d2018-11-28 16:35:21 -0800615 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700616 }
617
618 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
619 int32_t bufferHeight) {
620 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
621 bufferWidth, bufferHeight));
622 }
623
624 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
625 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
626 const Color& bottomLeft, const Color& bottomRight) {
627 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
628 bufferWidth, bufferHeight,
629 topLeft, topRight,
630 bottomLeft, bottomRight));
631 }
632
633protected:
634 uint32_t mLayerType;
635};
636
Alec Mouri80863a62019-01-17 15:19:35 -0800637class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
638 public ::testing::WithParamInterface<uint32_t> {
639public:
640 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
641};
642
643class LayerTypeAndRenderTypeTransactionTest
644 : public LayerTypeTransactionHarness,
645 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
646public:
647 LayerTypeAndRenderTypeTransactionTest()
648 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
649 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
650
651 std::unique_ptr<ScreenCapture> getScreenCapture() {
652 return mRenderPathHarness.getScreenCapture();
653 }
654
655protected:
656 LayerRenderPathTestHarness mRenderPathHarness;
657};
658
659// Environment for starting up binder threads. This is required for testing
660// virtual displays, as BufferQueue parameters may be queried over binder.
661class BinderEnvironment : public ::testing::Environment {
662public:
663 void SetUp() override { ProcessState::self()->startThreadPool(); }
664};
665
666::testing::Environment* const binderEnv =
667 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
668
669class LayerRenderTypeTransactionTest : public LayerTransactionTest,
670 public ::testing::WithParamInterface<RenderPath> {
671public:
672 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
673
674 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
675 void setRelativeZBasicHelper(uint32_t layerType);
676 void setRelativeZGroupHelper(uint32_t layerType);
677 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800678 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
679 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800680
681protected:
682 LayerRenderPathTestHarness mHarness;
683};
684
685INSTANTIATE_TEST_CASE_P(
686 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
687 ::testing::Combine(
688 ::testing::Values(
689 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
690 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
691 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
692
693INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
694 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
695
Marissa Wall61c58622018-07-18 10:12:20 -0700696INSTANTIATE_TEST_CASE_P(
697 LayerTypeTransactionTests, LayerTypeTransactionTest,
698 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
699 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
700
Alec Mouri80863a62019-01-17 15:19:35 -0800701TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700702 sp<SurfaceControl> layer;
703 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700704 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700705
706 {
707 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700708 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800709 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700710 shot->expectColor(rect, Color::RED);
711 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700712 }
713
714 Transaction().setPosition(layer, 5, 10).apply();
715 {
716 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700717 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800718 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700719 shot->expectColor(rect, Color::RED);
720 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700721 }
722}
723
Alec Mouri80863a62019-01-17 15:19:35 -0800724TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700725 sp<SurfaceControl> layer;
726 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700727 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700728
729 // GLES requires only 4 bits of subpixel precision during rasterization
730 // XXX GLES composition does not match HWC composition due to precision
731 // loss (b/69315223)
732 const float epsilon = 1.0f / 16.0f;
733 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
734 {
735 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800736 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700737 }
738
739 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
740 {
741 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800742 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700743 }
744}
745
Alec Mouri80863a62019-01-17 15:19:35 -0800746TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700747 sp<SurfaceControl> layer;
748 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700749 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700750
751 Transaction().setPosition(layer, -32, -32).apply();
752 {
753 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800754 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700755 }
756
757 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
758 {
759 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762}
763
Alec Mouri80863a62019-01-17 15:19:35 -0800764TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700765 sp<SurfaceControl> layer;
766 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700767 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700768
769 // partially out of bounds
770 Transaction().setPosition(layer, -30, -30).apply();
771 {
772 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800773 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700774 }
775
776 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
777 {
778 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800779 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
780 mDisplayHeight),
781 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700782 }
783}
784
Alec Mouri80863a62019-01-17 15:19:35 -0800785TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700786 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700787 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
788 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700789
790 // setPosition is applied immediately by default, with or without resize
791 // pending
792 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
793 {
794 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800795 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700796 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700797 shot->expectColor(rect, Color::RED);
798 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700799 }
800
Marissa Wall861616d2018-10-22 12:52:23 -0700801 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 {
803 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800804 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700805 }
806}
807
Alec Mouri80863a62019-01-17 15:19:35 -0800808TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700809 sp<SurfaceControl> layer;
810 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700811 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700812
813 // request setPosition to be applied with the next resize
814 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
815 {
816 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800817 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700818 }
819
820 Transaction().setPosition(layer, 15, 20).apply();
821 {
822 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800823 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700824 }
825
826 Transaction().setSize(layer, 64, 64).apply();
827 {
828 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800829 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700830 }
831
832 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700833 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 {
835 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800836 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700837 }
838}
839
Alec Mouri80863a62019-01-17 15:19:35 -0800840TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700841 sp<SurfaceControl> layer;
842 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700843 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700844
845 // setPosition is not immediate even with SCALE_TO_WINDOW override
846 Transaction()
847 .setPosition(layer, 5, 10)
848 .setSize(layer, 64, 64)
849 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
850 .setGeometryAppliesWithResize(layer)
851 .apply();
852 {
853 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800854 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 }
856
Marissa Wall61c58622018-07-18 10:12:20 -0700857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 {
859 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862}
863
Alec Mouri80863a62019-01-17 15:19:35 -0800864TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700865 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700866 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700868
869 Transaction().setSize(layer, 64, 64).apply();
870 {
871 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800872 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700873 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700874 shot->expectColor(rect, Color::RED);
875 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700876 }
877
Marissa Wall861616d2018-10-22 12:52:23 -0700878 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700879 {
880 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800881 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700882 const Rect rect(0, 0, 64, 64);
883 shot->expectColor(rect, Color::RED);
884 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700885 }
886}
887
Alec Mouri80863a62019-01-17 15:19:35 -0800888TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 // cannot test robustness against invalid sizes (zero or really huge)
890}
891
Alec Mouri80863a62019-01-17 15:19:35 -0800892TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700893 sp<SurfaceControl> layer;
894 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700895 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700896
897 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
898 Transaction()
899 .setSize(layer, 64, 64)
900 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
901 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800902 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903}
904
Alec Mouri80863a62019-01-17 15:19:35 -0800905TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700906 sp<SurfaceControl> layerR;
907 sp<SurfaceControl> layerG;
908 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700909 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700910 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700911 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700912
913 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
914 {
915 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800916 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700917 }
918
919 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
920 {
921 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800922 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700923 }
924}
925
Alec Mouri80863a62019-01-17 15:19:35 -0800926TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700927 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800928 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700929 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800930 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700931 sp<SurfaceControl> layerR;
932 sp<SurfaceControl> layerG;
933 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700934 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700935 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700936 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700937
chaviw0e3479f2018-09-10 16:49:30 -0700938 Transaction()
939 .reparent(layerR, parent->getHandle())
940 .reparent(layerG, parent->getHandle())
941 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700942 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
943 {
944 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800945 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700946 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 }
948
949 Transaction().setLayer(layerR, -3).apply();
950 {
951 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800952 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700953 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700954 }
955}
956
Alec Mouri80863a62019-01-17 15:19:35 -0800957void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700958 sp<SurfaceControl> layerR;
959 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700960 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
961 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
962 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
963 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700964
Marissa Wall861616d2018-10-22 12:52:23 -0700965 switch (layerType) {
966 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
967 Transaction()
968 .setPosition(layerG, 16, 16)
969 .setRelativeLayer(layerG, layerR->getHandle(), 1)
970 .apply();
971 break;
972 case ISurfaceComposerClient::eFXSurfaceBufferState:
973 Transaction()
974 .setFrame(layerR, Rect(0, 0, 32, 32))
975 .setFrame(layerG, Rect(16, 16, 48, 48))
976 .setRelativeLayer(layerG, layerR->getHandle(), 1)
977 .apply();
978 break;
979 default:
980 ASSERT_FALSE(true) << "Unsupported layer type";
981 }
Chia-I Wu49313302017-10-31 10:14:40 -0700982 {
983 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800984 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700985 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
986 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
987 }
988
989 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
990 {
991 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800992 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700993 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
994 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
995 }
996}
997
Alec Mouri80863a62019-01-17 15:19:35 -0800998TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700999 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1000}
1001
Alec Mouri80863a62019-01-17 15:19:35 -08001002TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001003 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1004}
1005
Marissa Wall61c58622018-07-18 10:12:20 -07001006TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001007 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001008 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001009 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001010 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001011 sp<SurfaceControl> layerR;
1012 sp<SurfaceControl> layerG;
1013 sp<SurfaceControl> layerB;
1014 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001015 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001016 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001017 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001018 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001019 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001020
chaviw0e3479f2018-09-10 16:49:30 -07001021 Transaction()
1022 .reparent(layerB, parent->getHandle())
1023 .apply();
1024
Chia-I Wuec2d9852017-11-21 09:21:01 -08001025 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1026 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1027
chaviw0e3479f2018-09-10 16:49:30 -07001028 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001030 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001031 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001032 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1033}
1034
Alec Mouri80863a62019-01-17 15:19:35 -08001035void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001036 sp<SurfaceControl> layerR;
1037 sp<SurfaceControl> layerG;
1038 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001039 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1040 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1041 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1042 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1043 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1044 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001045
1046 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001047 switch (layerType) {
1048 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1049 Transaction()
1050 .setPosition(layerG, 8, 8)
1051 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1052 .setPosition(layerB, 16, 16)
1053 .setLayer(layerB, mLayerZBase + 2)
1054 .apply();
1055 break;
1056 case ISurfaceComposerClient::eFXSurfaceBufferState:
1057 Transaction()
1058 .setFrame(layerR, Rect(0, 0, 32, 32))
1059 .setFrame(layerG, Rect(8, 8, 40, 40))
1060 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1061 .setFrame(layerB, Rect(16, 16, 48, 48))
1062 .setLayer(layerB, mLayerZBase + 2)
1063 .apply();
1064 break;
1065 default:
1066 ASSERT_FALSE(true) << "Unsupported layer type";
1067 }
1068
Chia-I Wu49313302017-10-31 10:14:40 -07001069 {
1070 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001071 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001072 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1073 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1074 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1075 }
1076
1077 // layerR = 4, layerG = layerR + 3, layerB = 2
1078 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1079 {
1080 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001081 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001082 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1083 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1084 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1085 }
1086
1087 // layerR = 4, layerG = layerR - 3, layerB = 2
1088 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1089 {
1090 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001091 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001092 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1093 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1094 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1095 }
1096
1097 // restore to absolute z
1098 // layerR = 4, layerG = 0, layerB = 2
1099 Transaction().setLayer(layerG, mLayerZBase).apply();
1100 {
1101 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001102 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001103 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1104 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1105 }
1106
1107 // layerR should not affect layerG anymore
1108 // layerR = 1, layerG = 0, layerB = 2
1109 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1110 {
1111 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001112 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001113 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1114 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1115 }
1116}
1117
Alec Mouri80863a62019-01-17 15:19:35 -08001118TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001119 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1120}
1121
Alec Mouri80863a62019-01-17 15:19:35 -08001122TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001123 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1124}
1125
Alec Mouri80863a62019-01-17 15:19:35 -08001126TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001127 sp<SurfaceControl> layerR;
1128 sp<SurfaceControl> layerG;
1129
1130 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001131 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001132 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001133 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001134
1135 Transaction()
1136 .setPosition(layerG, 16, 16)
1137 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1138 .apply();
1139
Robert Carr87246532019-02-04 15:20:26 -08001140 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001141 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001142 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001143}
1144
Alec Mouri80863a62019-01-17 15:19:35 -08001145TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001146 sp<SurfaceControl> layer;
1147 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001148 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001149
1150 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1151 {
1152 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001153 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001154 }
1155
1156 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1157 {
1158 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001159 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001160 }
1161}
1162
Alec Mouri80863a62019-01-17 15:19:35 -08001163TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001164 const Color translucentRed = {100, 0, 0, 100};
1165 sp<SurfaceControl> layerR;
1166 sp<SurfaceControl> layerG;
1167 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001168 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001169 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001170 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001171
1172 Transaction()
1173 .setLayer(layerR, mLayerZBase + 1)
1174 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1175 .apply();
1176 {
1177 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001178 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001179 }
1180
1181 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1182 {
1183 SCOPED_TRACE("layerR translucent");
1184 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001185 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001186 }
1187}
1188
Marissa Wall61c58622018-07-18 10:12:20 -07001189TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001190 sp<SurfaceControl> layer;
1191 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001192 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001193
1194 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001195 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001196 Transaction()
1197 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1198 .apply(true);
1199 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001200 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001201
1202 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1203 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001204 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001205}
1206
Alec Mouri80863a62019-01-17 15:19:35 -08001207TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001208 const Rect top(0, 0, 32, 16);
1209 const Rect bottom(0, 16, 32, 32);
1210 sp<SurfaceControl> layer;
1211 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1212
1213 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001214 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1215 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1216 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001217 // setTransparentRegionHint always applies to the following buffer
1218 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001219 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001220 {
1221 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001222 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001223 shot->expectColor(top, Color::BLACK);
1224 shot->expectColor(bottom, Color::RED);
1225 }
1226
1227 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1228 {
1229 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001230 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001231 shot->expectColor(top, Color::BLACK);
1232 shot->expectColor(bottom, Color::RED);
1233 }
1234
Marissa Wall61c58622018-07-18 10:12:20 -07001235 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1236 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1237 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1238 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001239 {
1240 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001241 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001242 shot->expectColor(top, Color::RED);
1243 shot->expectColor(bottom, Color::BLACK);
1244 }
1245}
1246
Alec Mouri80863a62019-01-17 15:19:35 -08001247TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001248 const Rect top(0, 0, 32, 16);
1249 const Rect bottom(0, 16, 32, 32);
1250 sp<SurfaceControl> layer;
1251 ASSERT_NO_FATAL_FAILURE(
1252 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1253
1254 sp<GraphicBuffer> buffer =
1255 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1256 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1257 BufferUsage::COMPOSER_OVERLAY,
1258 "test");
1259
1260 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1261 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1262 Transaction()
1263 .setTransparentRegionHint(layer, Region(top))
1264 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001265 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001266 .apply();
1267 {
1268 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001269 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001270 shot->expectColor(top, Color::BLACK);
1271 shot->expectColor(bottom, Color::RED);
1272 }
1273
1274 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1275 {
1276 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001277 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001278 shot->expectColor(top, Color::BLACK);
1279 shot->expectColor(bottom, Color::BLACK);
1280 }
1281
1282 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1283 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1284 BufferUsage::COMPOSER_OVERLAY,
1285 "test");
1286
1287 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1288 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001289 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001290 {
1291 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001292 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001293 shot->expectColor(top, Color::RED);
1294 shot->expectColor(bottom, Color::BLACK);
1295 }
1296}
1297
Alec Mouri80863a62019-01-17 15:19:35 -08001298TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001299 sp<SurfaceControl> layerTransparent;
1300 sp<SurfaceControl> layerR;
1301 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1302 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1303
1304 // check that transparent region hint is bound by the layer size
1305 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001306 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001307 .setPosition(layerR, 16, 16)
1308 .setLayer(layerR, mLayerZBase + 1)
1309 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001310 ASSERT_NO_FATAL_FAILURE(
1311 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1312 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001313 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001314}
1315
Alec Mouri80863a62019-01-17 15:19:35 -08001316TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001317 sp<SurfaceControl> layerTransparent;
1318 sp<SurfaceControl> layerR;
1319 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1320 ASSERT_NO_FATAL_FAILURE(
1321 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1322
1323 // check that transparent region hint is bound by the layer size
1324 Transaction()
1325 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1326 .setFrame(layerR, Rect(16, 16, 48, 48))
1327 .setLayer(layerR, mLayerZBase + 1)
1328 .apply();
1329 ASSERT_NO_FATAL_FAILURE(
1330 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1331 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001332 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001333}
1334
Alec Mouri80863a62019-01-17 15:19:35 -08001335void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001336 sp<SurfaceControl> layer1;
1337 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001338 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1339 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1340 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1341 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001342
Marissa Wall861616d2018-10-22 12:52:23 -07001343 switch (layerType) {
1344 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1345 Transaction()
1346 .setAlpha(layer1, 0.25f)
1347 .setAlpha(layer2, 0.75f)
1348 .setPosition(layer2, 16, 0)
1349 .setLayer(layer2, mLayerZBase + 1)
1350 .apply();
1351 break;
1352 case ISurfaceComposerClient::eFXSurfaceBufferState:
1353 Transaction()
1354 .setAlpha(layer1, 0.25f)
1355 .setAlpha(layer2, 0.75f)
1356 .setFrame(layer1, Rect(0, 0, 32, 32))
1357 .setFrame(layer2, Rect(16, 0, 48, 32))
1358 .setLayer(layer2, mLayerZBase + 1)
1359 .apply();
1360 break;
1361 default:
1362 ASSERT_FALSE(true) << "Unsupported layer type";
1363 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001364 {
Alec Mouri80863a62019-01-17 15:19:35 -08001365 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001366 uint8_t r = 16; // 64 * 0.25f
1367 uint8_t g = 48; // 64 * 0.75f
1368 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1369 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1370
1371 r /= 4; // r * (1.0f - 0.75f)
1372 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1373 }
1374}
1375
Alec Mouri80863a62019-01-17 15:19:35 -08001376TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001377 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1378}
1379
Alec Mouri80863a62019-01-17 15:19:35 -08001380TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001381 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1382}
1383
Alec Mouri80863a62019-01-17 15:19:35 -08001384TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001385 const Color color = {64, 0, 0, 255};
1386 sp<SurfaceControl> layer;
1387 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001388 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001389
1390 Transaction().setAlpha(layer, 2.0f).apply();
1391 {
1392 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001393 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001394 }
1395
1396 Transaction().setAlpha(layer, -1.0f).apply();
1397 {
1398 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001399 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001400 }
1401}
1402
Alec Mouri80863a62019-01-17 15:19:35 -08001403TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001404 sp<SurfaceControl> layer;
1405 const uint8_t size = 64;
1406 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001407 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001408 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1409 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1410
1411 Transaction()
1412 .setCornerRadius(layer, cornerRadius)
1413 .apply();
1414 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001415 const uint8_t bottom = size - 1;
1416 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001417 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001418 // Transparent corners
1419 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001420 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1421 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1422 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1423 }
1424}
1425
Alec Mouri80863a62019-01-17 15:19:35 -08001426TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001427 sp<SurfaceControl> parent;
1428 sp<SurfaceControl> child;
1429 const uint8_t size = 64;
1430 const uint8_t testArea = 4;
1431 const float cornerRadius = 20.0f;
1432 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1433 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1434 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1435 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1436
1437 Transaction()
1438 .setCornerRadius(parent, cornerRadius)
1439 .reparent(child, parent->getHandle())
1440 .setPosition(child, 0, size / 2)
1441 .apply();
1442 {
1443 const uint8_t bottom = size - 1;
1444 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001445 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001446 // Top edge of child should not have rounded corners because it's translated in the parent
1447 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1448 Color::GREEN);
1449 // But bottom edges should have been clipped according to parent bounds
1450 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1451 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001452 }
1453}
1454
Alec Mouri80863a62019-01-17 15:19:35 -08001455TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001456 sp<SurfaceControl> bufferLayer;
1457 sp<SurfaceControl> colorLayer;
1458 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001459 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001460 ASSERT_NO_FATAL_FAILURE(colorLayer =
1461 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1462 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001463
Vishnu Nair88a11f22018-11-28 18:30:57 -08001464 Transaction()
1465 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1466 .setLayer(colorLayer, mLayerZBase + 1)
1467 .apply();
1468
Chia-I Wue4ef6102017-11-01 15:16:35 -07001469 {
1470 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001471 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001472 }
1473
1474 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1475 const Color expected = {15, 51, 85, 255};
1476 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1477 // channel) should be less than one
1478 const uint8_t tolerance = 1;
1479 Transaction().setColor(colorLayer, color).apply();
1480 {
1481 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001482 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001483 }
1484}
1485
Valerie Haudd0b7572019-01-29 14:59:27 -08001486// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1487// BLUE: prior background color
1488// GREEN: final background color
1489// BLACK: no color or fill
1490void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1491 bool bufferFill, float alpha,
1492 Color finalColor) {
1493 sp<SurfaceControl> layer;
1494 int32_t width = 500;
1495 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001496
Valerie Haudd0b7572019-01-29 14:59:27 -08001497 Color fillColor = Color::RED;
1498 Color priorBgColor = Color::BLUE;
1499 Color expectedColor = Color::BLACK;
1500 switch (layerType) {
1501 case ISurfaceComposerClient::eFXSurfaceColor:
1502 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1503 Transaction()
1504 .setCrop_legacy(layer, Rect(0, 0, width, height))
1505 .setColor(layer, half3(1.0f, 0, 0))
1506 .apply();
1507 expectedColor = fillColor;
1508 break;
1509 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1510 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1511 if (bufferFill) {
1512 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1513 expectedColor = fillColor;
1514 }
1515 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1516 break;
1517 case ISurfaceComposerClient::eFXSurfaceBufferState:
1518 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1519 if (bufferFill) {
1520 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1521 expectedColor = fillColor;
1522 }
1523 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1524 break;
1525 default:
1526 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1527 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001528 }
1529
Valerie Haudd0b7572019-01-29 14:59:27 -08001530 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1531 Transaction()
1532 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1533 .apply();
1534 if (!bufferFill) {
1535 expectedColor = priorBgColor;
1536 }
1537 }
1538
1539 {
1540 SCOPED_TRACE("default before setting background color layer");
1541 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1542 }
1543
Valerie Haua72e2812019-01-23 13:40:39 -08001544 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001545 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001546 .apply();
1547
1548 {
Valerie Haua72e2812019-01-23 13:40:39 -08001549 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001550 shot->expectColor(Rect(0, 0, width, height), finalColor);
1551 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001552 }
1553}
1554
Valerie Haudd0b7572019-01-29 14:59:27 -08001555TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1556 bool priorColor = false;
1557 bool bufferFill = false;
1558 float alpha = 1.0f;
1559 Color finalColor = Color::RED;
1560 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1561 priorColor, bufferFill, alpha, finalColor));
1562}
Valerie Haua72e2812019-01-23 13:40:39 -08001563
Valerie Haudd0b7572019-01-29 14:59:27 -08001564TEST_P(LayerRenderTypeTransactionTest,
1565 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1566 bool priorColor = false;
1567 bool bufferFill = true;
1568 float alpha = 1.0f;
1569 Color finalColor = Color::RED;
1570 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1571 priorColor, bufferFill, alpha, finalColor));
1572}
Valerie Haua72e2812019-01-23 13:40:39 -08001573
Valerie Haudd0b7572019-01-29 14:59:27 -08001574TEST_P(LayerRenderTypeTransactionTest,
1575 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1576 bool priorColor = false;
1577 bool bufferFill = false;
1578 float alpha = 1.0f;
1579 Color finalColor = Color::GREEN;
1580 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1581 priorColor, bufferFill, alpha, finalColor));
1582}
Valerie Haua72e2812019-01-23 13:40:39 -08001583
Valerie Haudd0b7572019-01-29 14:59:27 -08001584TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1585 bool priorColor = true;
1586 bool bufferFill = true;
1587 float alpha = 1.0f;
1588 Color finalColor = Color::RED;
1589 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1590 priorColor, bufferFill, alpha, finalColor));
1591}
1592
1593TEST_P(LayerRenderTypeTransactionTest,
1594 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1595 bool priorColor = true;
1596 bool bufferFill = false;
1597 float alpha = 1.0f;
1598 Color finalColor = Color::GREEN;
1599 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1600 priorColor, bufferFill, alpha, finalColor));
1601}
1602TEST_P(LayerRenderTypeTransactionTest,
1603 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1604 bool priorColor = false;
1605 bool bufferFill = false;
1606 float alpha = 0;
1607 Color finalColor = Color::BLACK;
1608 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1609 priorColor, bufferFill, alpha, finalColor));
1610}
1611
1612TEST_P(LayerRenderTypeTransactionTest,
1613 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1614 bool priorColor = true;
1615 bool bufferFill = false;
1616 float alpha = 0;
1617 Color finalColor = Color::BLACK;
1618 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1619 priorColor, bufferFill, alpha, finalColor));
1620}
1621
1622TEST_P(LayerRenderTypeTransactionTest,
1623 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1624 bool priorColor = false;
1625 bool bufferFill = true;
1626 float alpha = 1.0f;
1627 Color finalColor = Color::RED;
1628 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1629 priorColor, bufferFill, alpha, finalColor));
1630}
1631
1632TEST_P(LayerRenderTypeTransactionTest,
1633 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1634 bool priorColor = false;
1635 bool bufferFill = false;
1636 float alpha = 1.0f;
1637 Color finalColor = Color::GREEN;
1638 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1639 priorColor, bufferFill, alpha, finalColor));
1640}
1641
1642TEST_P(LayerRenderTypeTransactionTest,
1643 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1644 bool priorColor = true;
1645 bool bufferFill = false;
1646 float alpha = 1.0f;
1647 Color finalColor = Color::GREEN;
1648 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1649 priorColor, bufferFill, alpha, finalColor));
1650}
1651
1652TEST_P(LayerRenderTypeTransactionTest,
1653 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1654 bool priorColor = false;
1655 bool bufferFill = false;
1656 float alpha = 0;
1657 Color finalColor = Color::BLACK;
1658 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1659 priorColor, bufferFill, alpha, finalColor));
1660}
1661
1662TEST_P(LayerRenderTypeTransactionTest,
1663 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1664 bool priorColor = true;
1665 bool bufferFill = false;
1666 float alpha = 0;
1667 Color finalColor = Color::BLACK;
1668 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1669 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001670}
1671
Alec Mouri80863a62019-01-17 15:19:35 -08001672TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001673 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001674 ASSERT_NO_FATAL_FAILURE(colorLayer =
1675 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1676 ISurfaceComposerClient::eFXSurfaceColor));
1677 Transaction()
1678 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1679 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1680 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001681
Alec Mouri80863a62019-01-17 15:19:35 -08001682 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001683}
1684
Alec Mouri80863a62019-01-17 15:19:35 -08001685TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001686 sp<SurfaceControl> bufferLayer;
1687 sp<SurfaceControl> colorLayer;
1688 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001689 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001690 ASSERT_NO_FATAL_FAILURE(colorLayer =
1691 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1692 ISurfaceComposerClient::eFXSurfaceColor));
1693 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001694
1695 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1696 const float alpha = 0.25f;
1697 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1698 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1699 // channel) should be less than one
1700 const uint8_t tolerance = 1;
1701 Transaction()
1702 .setColor(colorLayer, color)
1703 .setAlpha(colorLayer, alpha)
1704 .setLayer(colorLayer, mLayerZBase + 1)
1705 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001706 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1707 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001708}
1709
Alec Mouri80863a62019-01-17 15:19:35 -08001710TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001711 sp<SurfaceControl> bufferLayer;
1712 sp<SurfaceControl> parentLayer;
1713 sp<SurfaceControl> colorLayer;
1714 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1715 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001716 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001717 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1718 0 /* buffer height */,
1719 ISurfaceComposerClient::eFXSurfaceColor));
1720 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001721 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1722 const float alpha = 0.25f;
1723 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1724 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1725 // channel) should be less than one
1726 const uint8_t tolerance = 1;
1727 Transaction()
1728 .reparent(colorLayer, parentLayer->getHandle())
1729 .setColor(colorLayer, color)
1730 .setAlpha(parentLayer, alpha)
1731 .setLayer(parentLayer, mLayerZBase + 1)
1732 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001733 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1734 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001735}
1736
Alec Mouri80863a62019-01-17 15:19:35 -08001737TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001738 sp<SurfaceControl> bufferLayer;
1739 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001740 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001741
1742 // color is ignored
1743 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001744 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001745}
1746
Alec Mouri80863a62019-01-17 15:19:35 -08001747TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001748 sp<SurfaceControl> layer;
1749 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001750 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001751
1752 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1753 {
1754 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001755 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001756 }
1757
1758 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1759 {
1760 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001761 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001762 }
1763}
1764
Alec Mouri80863a62019-01-17 15:19:35 -08001765TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001766 sp<SurfaceControl> layer;
1767 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001768 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1769 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001770
1771 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1772 {
1773 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001774 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1775 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001776 }
1777
1778 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1779 {
1780 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001781 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1782 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001783 }
1784
1785 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1786 {
1787 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001788 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1789 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001790 }
1791
1792 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1793 {
1794 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001795 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1796 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001797 }
1798
1799 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1800 {
1801 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001802 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1803 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001804 }
1805}
1806
Alec Mouri80863a62019-01-17 15:19:35 -08001807TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001808 sp<SurfaceControl> layer;
1809 ASSERT_NO_FATAL_FAILURE(
1810 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1811 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1812 Color::BLUE, Color::WHITE));
1813
1814 Transaction()
1815 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1816 .setFrame(layer, Rect(0, 0, 32, 32))
1817 .apply();
1818 {
1819 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001820 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1821 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001822 }
1823
1824 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1825 {
1826 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001827 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1828 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001829 }
1830
1831 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1832 {
1833 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001834 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1835 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001836 }
1837
1838 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1839 {
1840 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001841 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1842 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001843 }
1844
1845 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1846 {
1847 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001848 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1849 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001850 }
1851}
1852
Alec Mouri80863a62019-01-17 15:19:35 -08001853TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001854 sp<SurfaceControl> layer;
1855 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001856 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1857 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001858
1859 const float rot = M_SQRT1_2; // 45 degrees
1860 const float trans = M_SQRT2 * 16.0f;
1861 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1862
Alec Mouri80863a62019-01-17 15:19:35 -08001863 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001864 // check a 8x8 region inside each color
1865 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1866 const int32_t halfL = 4;
1867 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1868 };
1869 const int32_t unit = int32_t(trans / 2);
1870 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1871 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1872 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1873 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1874}
1875
Alec Mouri80863a62019-01-17 15:19:35 -08001876TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001877 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001878 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1879 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001880
1881 // setMatrix is applied after any pending resize, unlike setPosition
1882 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1883 {
1884 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001885 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001886 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001887 shot->expectColor(rect, Color::RED);
1888 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001889 }
1890
Marissa Wall861616d2018-10-22 12:52:23 -07001891 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001892 {
1893 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001894 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001895 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001896 }
1897}
1898
Alec Mouri80863a62019-01-17 15:19:35 -08001899TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001900 sp<SurfaceControl> layer;
1901 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001902 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001903
1904 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1905 Transaction()
1906 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1907 .setSize(layer, 64, 64)
1908 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1909 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001910 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001911}
1912
Alec Mouri80863a62019-01-17 15:19:35 -08001913TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001914 sp<SurfaceControl> layer;
1915 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001916 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1917 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001918
1919 // XXX SCALE_CROP is not respected; calling setSize and
1920 // setOverrideScalingMode in separate transactions does not work
1921 // (b/69315456)
1922 Transaction()
1923 .setSize(layer, 64, 16)
1924 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1925 .apply();
1926 {
1927 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001928 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1929 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001930 }
1931}
1932
Dan Stoza000dd012018-08-01 13:31:52 -07001933TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1934 sp<SurfaceControl> layer;
1935 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1936
1937 sp<IBinder> handle = layer->getHandle();
1938 ASSERT_TRUE(handle != nullptr);
1939
1940 FrameStats frameStats;
1941 mClient->getLayerFrameStats(handle, &frameStats);
1942
1943 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1944}
1945
Alec Mouri80863a62019-01-17 15:19:35 -08001946TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001947 sp<SurfaceControl> layer;
1948 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001949 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001950 const Rect crop(8, 8, 24, 24);
1951
Marissa Wallf58c14b2018-07-24 10:50:43 -07001952 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001953 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001954 shot->expectColor(crop, Color::RED);
1955 shot->expectBorder(crop, Color::BLACK);
1956}
1957
Alec Mouri80863a62019-01-17 15:19:35 -08001958TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001959 sp<SurfaceControl> layer;
1960 ASSERT_NO_FATAL_FAILURE(
1961 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1962 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1963 const Rect crop(8, 8, 24, 24);
1964
1965 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001966 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001967 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1968 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001969}
1970
Alec Mouri80863a62019-01-17 15:19:35 -08001971TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001972 sp<SurfaceControl> layer;
1973 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001974 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001975
1976 {
1977 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001978 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001979 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001980 }
1981
1982 {
1983 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001984 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001985 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001986 }
1987}
1988
Alec Mouri80863a62019-01-17 15:19:35 -08001989TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001990 sp<SurfaceControl> layer;
1991 ASSERT_NO_FATAL_FAILURE(
1992 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1993 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1994
1995 {
1996 SCOPED_TRACE("empty rect");
1997 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001998 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001999 }
2000
2001 {
2002 SCOPED_TRACE("negative rect");
2003 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002004 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002005 }
2006}
2007
Alec Mouri80863a62019-01-17 15:19:35 -08002008TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002009 sp<SurfaceControl> layer;
2010 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002011 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002012
Marissa Wallf58c14b2018-07-24 10:50:43 -07002013 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002014 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002015 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2016 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2017}
2018
Alec Mouri80863a62019-01-17 15:19:35 -08002019TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002020 sp<SurfaceControl> layer;
2021 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2022 ISurfaceComposerClient::eFXSurfaceBufferState));
2023 sp<GraphicBuffer> buffer =
2024 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2025 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2026 BufferUsage::COMPOSER_OVERLAY,
2027 "test");
2028 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2029 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2030 Color::RED);
2031
2032 Transaction().setBuffer(layer, buffer).apply();
2033
2034 // Partially out of bounds in the negative (upper left) direction
2035 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2036 {
2037 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002038 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002039 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2040 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2041 }
2042
2043 // Partially out of bounds in the positive (lower right) direction
2044 Transaction()
2045 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2046 .apply();
2047 {
2048 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002049 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002050 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2051 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2052 }
2053
2054 // Fully out of buffer space bounds
2055 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2056 {
2057 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002058 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002059 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2060 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2061 Color::RED);
2062 }
2063}
2064
Alec Mouri80863a62019-01-17 15:19:35 -08002065TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002066 sp<SurfaceControl> layer;
2067 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002068 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002069
2070 const Point position(32, 32);
2071 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002072 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002073 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002074 shot->expectColor(crop + position, Color::RED);
2075 shot->expectBorder(crop + position, Color::BLACK);
2076}
2077
Alec Mouri80863a62019-01-17 15:19:35 -08002078TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002079 sp<SurfaceControl> layer;
2080 ASSERT_NO_FATAL_FAILURE(
2081 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2082 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2083
Marissa Wall861616d2018-10-22 12:52:23 -07002084 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002085 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002086 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002087 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002088 shot->expectColor(frame, Color::RED);
2089 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002090}
2091
Alec Mouri80863a62019-01-17 15:19:35 -08002092TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002093 sp<SurfaceControl> layer;
2094 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002095 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002096
Marissa Wall861616d2018-10-22 12:52:23 -07002097 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002098 Transaction()
2099 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002100 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002101 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002102 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002103 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2104 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2105}
2106
Alec Mouri80863a62019-01-17 15:19:35 -08002107TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002108 sp<SurfaceControl> layer;
2109 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002110 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002111
Marissa Wallf58c14b2018-07-24 10:50:43 -07002112 // setCrop_legacy is applied immediately by default, with or without resize pending
2113 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002114 {
2115 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002116 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002117 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2118 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2119 }
2120
Marissa Wall61c58622018-07-18 10:12:20 -07002121 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002122 {
2123 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002124 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002125 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2126 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2127 }
2128}
2129
Alec Mouri80863a62019-01-17 15:19:35 -08002130TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002131 sp<SurfaceControl> layer;
2132 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002133 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002134
Marissa Wallf58c14b2018-07-24 10:50:43 -07002135 // request setCrop_legacy to be applied with the next resize
2136 Transaction()
2137 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2138 .setGeometryAppliesWithResize(layer)
2139 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002140 {
2141 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002142 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002143 }
2144
Marissa Wallf58c14b2018-07-24 10:50:43 -07002145 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002146 {
2147 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002148 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002149 }
2150
2151 Transaction().setSize(layer, 16, 16).apply();
2152 {
2153 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002154 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002155 }
2156
2157 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002158 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159 {
2160 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002161 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002162 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2163 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2164 }
2165}
2166
Alec Mouri80863a62019-01-17 15:19:35 -08002167TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002168 sp<SurfaceControl> layer;
2169 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002170 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002171
Marissa Wallf58c14b2018-07-24 10:50:43 -07002172 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002173 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002174 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002175 .setSize(layer, 16, 16)
2176 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2177 .setGeometryAppliesWithResize(layer)
2178 .apply();
2179 {
2180 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002181 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002182 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2183 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2184 }
2185
2186 // XXX crop is never latched without other geometry change (b/69315677)
2187 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002188 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189 Transaction().setPosition(layer, 0, 0).apply();
2190 {
2191 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002192 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002193 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2194 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2195 }
2196}
2197
Alec Mouri80863a62019-01-17 15:19:35 -08002198TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002199 sp<SurfaceControl> layer;
2200 ASSERT_NO_FATAL_FAILURE(
2201 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2202 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2203 const Rect frame(8, 8, 24, 24);
2204
2205 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002206 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002207 shot->expectColor(frame, Color::RED);
2208 shot->expectBorder(frame, Color::BLACK);
2209}
2210
Alec Mouri80863a62019-01-17 15:19:35 -08002211TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002212 sp<SurfaceControl> layer;
2213 ASSERT_NO_FATAL_FAILURE(
2214 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2215 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2216
Marissa Wall61c58622018-07-18 10:12:20 -07002217 {
Marissa Wall861616d2018-10-22 12:52:23 -07002218 SCOPED_TRACE("empty rect");
2219 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002220 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002221 }
2222
Marissa Wall61c58622018-07-18 10:12:20 -07002223 {
Marissa Wall861616d2018-10-22 12:52:23 -07002224 SCOPED_TRACE("negative rect");
2225 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002226 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002227 }
2228}
2229
Alec Mouri80863a62019-01-17 15:19:35 -08002230TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002231 sp<SurfaceControl> layer;
2232 ASSERT_NO_FATAL_FAILURE(
2233 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2234 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2235
2236 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002237 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002238 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2239 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2240}
2241
Alec Mouri80863a62019-01-17 15:19:35 -08002242TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002243 sp<SurfaceControl> parent, child;
2244 ASSERT_NO_FATAL_FAILURE(
2245 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2246 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2247 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2248
2249 ASSERT_NO_FATAL_FAILURE(
2250 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2251 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2252
2253 Transaction().reparent(child, parent->getHandle()).apply();
2254
2255 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002256 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002257 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2258 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2259}
2260
Alec Mouri80863a62019-01-17 15:19:35 -08002261TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002262 sp<SurfaceControl> parent, child;
2263 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2264 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2265
2266 ASSERT_NO_FATAL_FAILURE(
2267 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2268 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2269
2270 Transaction().reparent(child, parent->getHandle()).apply();
2271
2272 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002273 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002274 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2275 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2276}
2277
Alec Mouri80863a62019-01-17 15:19:35 -08002278TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002279 sp<SurfaceControl> layer;
2280 ASSERT_NO_FATAL_FAILURE(
2281 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2282 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2283 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2284
2285 std::this_thread::sleep_for(500ms);
2286
2287 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2288
Alec Mouri80863a62019-01-17 15:19:35 -08002289 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002290 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2291 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2292}
2293
Alec Mouri80863a62019-01-17 15:19:35 -08002294TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002295 sp<SurfaceControl> parent, child;
2296 ASSERT_NO_FATAL_FAILURE(
2297 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2298 ASSERT_NO_FATAL_FAILURE(
2299 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2300 Transaction().reparent(child, parent->getHandle()).apply();
2301
2302 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2303 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2304
2305 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2306 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2307
Alec Mouri80863a62019-01-17 15:19:35 -08002308 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002309 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2310 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2311 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2312}
2313
Alec Mouri80863a62019-01-17 15:19:35 -08002314TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002315 sp<SurfaceControl> layer;
2316 ASSERT_NO_FATAL_FAILURE(
2317 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2318
2319 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2320
Alec Mouri80863a62019-01-17 15:19:35 -08002321 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002322 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2323 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2324}
2325
Alec Mouri80863a62019-01-17 15:19:35 -08002326TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002327 sp<SurfaceControl> layer;
2328 ASSERT_NO_FATAL_FAILURE(
2329 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2330
2331 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2332
2333 {
2334 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002335 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002336 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2337 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2338 }
2339
2340 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2341
2342 {
2343 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002344 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002345 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2346 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2347 }
2348
2349 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2350
2351 {
2352 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002353 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002354 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2355 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2356 }
2357}
2358
Alec Mouri80863a62019-01-17 15:19:35 -08002359TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002360 sp<SurfaceControl> layer1;
2361 ASSERT_NO_FATAL_FAILURE(
2362 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2363
2364 sp<SurfaceControl> layer2;
2365 ASSERT_NO_FATAL_FAILURE(
2366 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2367
2368 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2369
Marissa Wall861616d2018-10-22 12:52:23 -07002370 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002371 {
2372 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002373 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002374 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2375 }
2376
2377 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2378
Marissa Wall861616d2018-10-22 12:52:23 -07002379 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002380 {
2381 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002382 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002383 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2384 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2385 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2386 }
2387
2388 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2389 {
2390 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002391 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002392 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2393 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2394 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2395 }
2396
2397 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2398
2399 {
2400 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002401 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002402 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2403 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2404 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2405 }
2406}
2407
Alec Mouri80863a62019-01-17 15:19:35 -08002408TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002409 sp<SurfaceControl> layer;
2410 ASSERT_NO_FATAL_FAILURE(
2411 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2412
2413 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2414 Color::BLUE, Color::WHITE));
2415
Marissa Wall861616d2018-10-22 12:52:23 -07002416 Transaction()
2417 .setFrame(layer, Rect(0, 0, 32, 32))
2418 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2419 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002420
Alec Mouri80863a62019-01-17 15:19:35 -08002421 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2422 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002423}
2424
Alec Mouri80863a62019-01-17 15:19:35 -08002425TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002426 sp<SurfaceControl> layer;
2427 ASSERT_NO_FATAL_FAILURE(
2428 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2429
2430 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2431 Color::BLUE, Color::WHITE));
2432
Marissa Wall861616d2018-10-22 12:52:23 -07002433 Transaction()
2434 .setFrame(layer, Rect(0, 0, 32, 32))
2435 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2436 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002437
Alec Mouri80863a62019-01-17 15:19:35 -08002438 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2439 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002440}
2441
Alec Mouri80863a62019-01-17 15:19:35 -08002442TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002443 sp<SurfaceControl> layer;
2444 ASSERT_NO_FATAL_FAILURE(
2445 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2446
2447 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2448 Color::BLUE, Color::WHITE));
2449
Marissa Wall861616d2018-10-22 12:52:23 -07002450 Transaction()
2451 .setFrame(layer, Rect(0, 0, 32, 32))
2452 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2453 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002454
Alec Mouri80863a62019-01-17 15:19:35 -08002455 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2456 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002457}
2458
2459TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2460 sp<SurfaceControl> layer;
2461 ASSERT_NO_FATAL_FAILURE(
2462 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2463
2464 Transaction().setTransformToDisplayInverse(layer, false).apply();
2465
2466 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2467
2468 Transaction().setTransformToDisplayInverse(layer, true).apply();
2469}
2470
Alec Mouri80863a62019-01-17 15:19:35 -08002471TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002472 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002473 Transaction transaction;
2474 ASSERT_NO_FATAL_FAILURE(
2475 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2476
2477 sp<GraphicBuffer> buffer =
2478 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2479 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2480 BufferUsage::COMPOSER_OVERLAY,
2481 "test");
2482 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2483
2484 sp<Fence> fence;
2485 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2486 GTEST_SUCCEED() << "test not supported";
2487 return;
2488 }
2489
2490 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2491
2492 status_t status = fence->wait(1000);
2493 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2494 std::this_thread::sleep_for(200ms);
2495
Alec Mouri80863a62019-01-17 15:19:35 -08002496 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002497 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2498 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2499}
2500
Alec Mouri80863a62019-01-17 15:19:35 -08002501TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002502 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002503 ASSERT_NO_FATAL_FAILURE(
2504 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2505
2506 sp<GraphicBuffer> buffer =
2507 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2508 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2509 BufferUsage::COMPOSER_OVERLAY,
2510 "test");
2511 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2512
Marissa Wallfda30bb2018-10-12 11:34:28 -07002513 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002514
2515 Transaction()
2516 .setBuffer(layer, buffer)
2517 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002518 .apply();
2519
Alec Mouri80863a62019-01-17 15:19:35 -08002520 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002521 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2522 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2523}
2524
Alec Mouri80863a62019-01-17 15:19:35 -08002525TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002526 sp<SurfaceControl> layer;
2527 ASSERT_NO_FATAL_FAILURE(
2528 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2529
2530 sp<GraphicBuffer> buffer =
2531 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2532 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2533 BufferUsage::COMPOSER_OVERLAY,
2534 "test");
2535 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2536
2537 Transaction()
2538 .setBuffer(layer, buffer)
2539 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002540 .apply();
2541
Alec Mouri80863a62019-01-17 15:19:35 -08002542 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002543 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2544 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2545}
2546
Alec Mouri80863a62019-01-17 15:19:35 -08002547TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002548 sp<SurfaceControl> layer;
2549 ASSERT_NO_FATAL_FAILURE(
2550 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2551
2552 sp<GraphicBuffer> buffer =
2553 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2554 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2555 BufferUsage::COMPOSER_OVERLAY,
2556 "test");
2557 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2558
2559 HdrMetadata hdrMetadata;
2560 hdrMetadata.validTypes = 0;
2561 Transaction()
2562 .setBuffer(layer, buffer)
2563 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002564 .apply();
2565
Alec Mouri80863a62019-01-17 15:19:35 -08002566 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002567 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2568 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2569}
2570
Alec Mouri80863a62019-01-17 15:19:35 -08002571TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002572 sp<SurfaceControl> layer;
2573 ASSERT_NO_FATAL_FAILURE(
2574 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2575
2576 sp<GraphicBuffer> buffer =
2577 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2578 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2579 BufferUsage::COMPOSER_OVERLAY,
2580 "test");
2581 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2582
2583 Region region;
2584 region.set(32, 32);
2585 Transaction()
2586 .setBuffer(layer, buffer)
2587 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002588 .apply();
2589
Alec Mouri80863a62019-01-17 15:19:35 -08002590 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002591 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2592 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2593}
2594
Alec Mouri80863a62019-01-17 15:19:35 -08002595TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002596 sp<SurfaceControl> layer;
2597 ASSERT_NO_FATAL_FAILURE(
2598 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2599
2600 sp<GraphicBuffer> buffer =
2601 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2602 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2603 BufferUsage::COMPOSER_OVERLAY,
2604 "test");
2605 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2606
2607 Transaction()
2608 .setBuffer(layer, buffer)
2609 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002610 .apply();
2611
Alec Mouri80863a62019-01-17 15:19:35 -08002612 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002613 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2614 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2615}
2616
2617TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2618 sp<SurfaceControl> layer;
2619 ASSERT_NO_FATAL_FAILURE(
2620 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2621
2622 // verify this doesn't cause a crash
2623 Transaction().setSidebandStream(layer, nullptr).apply();
2624}
2625
Marissa Wallebc2c052019-01-16 19:16:55 -08002626TEST_F(LayerTransactionTest, CacheBuffer_BufferState) {
2627 sp<GraphicBuffer> buffer =
2628 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2629 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2630 BufferUsage::COMPOSER_OVERLAY,
2631 "test");
2632
2633 int32_t bufferId = -1;
2634 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2635 ASSERT_GE(bufferId, 0);
2636
2637 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2638}
2639
2640TEST_F(LayerTransactionTest, CacheBuffers_BufferState) {
2641 std::vector<int32_t> bufferIds;
2642 int32_t bufferCount = 20;
2643
2644 for (int i = 0; i < bufferCount; i++) {
2645 sp<GraphicBuffer> buffer =
2646 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2647 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2648 BufferUsage::COMPOSER_OVERLAY,
2649 "test");
2650 int32_t bufferId = -1;
2651 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2652 if (bufferId < 0) {
2653 EXPECT_GE(bufferId, 0);
2654 break;
2655 }
2656 bufferIds.push_back(bufferId);
2657 }
2658
2659 for (int32_t bufferId : bufferIds) {
2660 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2661 }
2662}
2663
2664TEST_F(LayerTransactionTest, CacheBufferInvalid_BufferState) {
2665 sp<GraphicBuffer> buffer = nullptr;
2666
2667 int32_t bufferId = -1;
2668 ASSERT_NE(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2669 ASSERT_LT(bufferId, 0);
2670}
2671
2672TEST_F(LayerTransactionTest, UncacheBufferTwice_BufferState) {
2673 sp<GraphicBuffer> buffer =
2674 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2675 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2676 BufferUsage::COMPOSER_OVERLAY,
2677 "test");
2678
2679 int32_t bufferId = -1;
2680 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2681 ASSERT_GE(bufferId, 0);
2682
2683 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2684 mClient->uncacheBuffer(bufferId);
2685}
2686
2687TEST_F(LayerTransactionTest, UncacheBufferInvalidId_BufferState) {
2688 mClient->uncacheBuffer(-1);
2689 mClient->uncacheBuffer(0);
2690 mClient->uncacheBuffer(1);
2691 mClient->uncacheBuffer(5);
2692 mClient->uncacheBuffer(1000);
2693}
2694
2695TEST_F(LayerTransactionTest, SetCachedBuffer_BufferState) {
2696 sp<SurfaceControl> layer;
2697 ASSERT_NO_FATAL_FAILURE(
2698 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2699
2700 sp<GraphicBuffer> buffer =
2701 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2702 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2703 BufferUsage::COMPOSER_OVERLAY,
2704 "test");
2705
2706 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2707
2708 int32_t bufferId = -1;
2709 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2710 ASSERT_GE(bufferId, 0);
2711
2712 Transaction().setCachedBuffer(layer, bufferId).apply();
2713
2714 auto shot = screenshot();
2715 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2716 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2717
2718 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2719}
2720
2721TEST_F(LayerTransactionTest, SetCachedBufferDelayed_BufferState) {
2722 sp<SurfaceControl> layer;
2723 ASSERT_NO_FATAL_FAILURE(
2724 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2725
2726 sp<GraphicBuffer> cachedBuffer =
2727 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2728 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2729 BufferUsage::COMPOSER_OVERLAY,
2730 "test");
2731 int32_t bufferId = -1;
2732 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(cachedBuffer, &bufferId));
2733 ASSERT_GE(bufferId, 0);
2734
2735 sp<GraphicBuffer> buffer =
2736 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2737 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2738 BufferUsage::COMPOSER_OVERLAY,
2739 "test");
2740 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::BLUE);
2741 Transaction().setBuffer(layer, buffer).apply();
2742 {
2743 SCOPED_TRACE("Uncached buffer");
2744
2745 auto shot = screenshot();
2746 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2747 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2748 }
2749
2750 fillGraphicBufferColor(cachedBuffer, Rect(0, 0, 32, 32), Color::RED);
2751 Transaction().setCachedBuffer(layer, bufferId).apply();
2752 {
2753 SCOPED_TRACE("Cached buffer");
2754
2755 auto shot = screenshot();
2756 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2757 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2758 }
2759
2760 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2761}
2762
Robert Carr54cf5b12019-01-25 14:02:28 -08002763TEST_F(LayerTransactionTest, ReparentToSelf) {
2764 sp<SurfaceControl> layer;
2765 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2766 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2767 Transaction().reparent(layer, layer->getHandle()).apply();
2768
2769 {
2770 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2771 // to still be functioning.
2772 SCOPED_TRACE("after reparent to self");
2773 const Rect rect(0, 0, 32, 32);
2774 auto shot = screenshot();
2775 shot->expectColor(rect, Color::RED);
2776 shot->expectBorder(rect, Color::BLACK);
2777 }
2778}
2779
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002780class ColorTransformHelper {
2781public:
2782 static void DegammaColorSingle(half& s) {
2783 if (s <= 0.03928f)
2784 s = s / 12.92f;
2785 else
2786 s = pow((s + 0.055f) / 1.055f, 2.4f);
2787 }
2788
2789 static void DegammaColor(half3& color) {
2790 DegammaColorSingle(color.r);
2791 DegammaColorSingle(color.g);
2792 DegammaColorSingle(color.b);
2793 }
2794
2795 static void GammaColorSingle(half& s) {
2796 if (s <= 0.0031308f) {
2797 s = s * 12.92f;
2798 } else {
2799 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2800 }
2801 }
2802
2803 static void GammaColor(half3& color) {
2804 GammaColorSingle(color.r);
2805 GammaColorSingle(color.g);
2806 GammaColorSingle(color.b);
2807 }
2808
2809 static void applyMatrix(half3& color, const mat3& mat) {
2810 half3 ret = half3(0);
2811
2812 for (int i = 0; i < 3; i++) {
2813 for (int j = 0; j < 3; j++) {
2814 ret[i] = ret[i] + color[j] * mat[j][i];
2815 }
2816 }
2817 color = ret;
2818 }
2819};
2820
Alec Mouri80863a62019-01-17 15:19:35 -08002821TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002822 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002823 ASSERT_NO_FATAL_FAILURE(colorLayer =
2824 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2825 ISurfaceComposerClient::eFXSurfaceColor));
2826 Transaction()
2827 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2828 .setLayer(colorLayer, mLayerZBase + 1)
2829 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002830 {
2831 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002832 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002833 }
2834
2835 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002836 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002837 mat3 matrix;
2838 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2839 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2840 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002841
2842 // degamma before applying the matrix
2843 if (mColorManagementUsed) {
2844 ColorTransformHelper::DegammaColor(expected);
2845 }
2846
2847 ColorTransformHelper::applyMatrix(expected, matrix);
2848
2849 if (mColorManagementUsed) {
2850 ColorTransformHelper::GammaColor(expected);
2851 }
2852
2853 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2854 uint8_t(expected.b * 255), 255};
2855
2856 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2857 // channel) should be less than one
2858 const uint8_t tolerance = 1;
2859
Peiyong Lind3788632018-09-18 16:01:31 -07002860 Transaction().setColor(colorLayer, color)
2861 .setColorTransform(colorLayer, matrix, vec3()).apply();
2862 {
2863 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002864 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002865 }
2866}
2867
Alec Mouri80863a62019-01-17 15:19:35 -08002868TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002869 sp<SurfaceControl> parentLayer;
2870 sp<SurfaceControl> colorLayer;
2871 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2872 0 /* buffer height */,
2873 ISurfaceComposerClient::eFXSurfaceContainer));
2874 ASSERT_NO_FATAL_FAILURE(
2875 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2876 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2877
2878 Transaction()
2879 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2880 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2881 .setLayer(parentLayer, mLayerZBase + 1)
2882 .apply();
2883 {
2884 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002885 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002886 }
2887
2888 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2889 half3 expected = color;
2890 mat3 matrix;
2891 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2892 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2893 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2894
2895 // degamma before applying the matrix
2896 if (mColorManagementUsed) {
2897 ColorTransformHelper::DegammaColor(expected);
2898 }
2899
2900 ColorTransformHelper::applyMatrix(expected, matrix);
2901
2902 if (mColorManagementUsed) {
2903 ColorTransformHelper::GammaColor(expected);
2904 }
2905
2906 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2907 uint8_t(expected.b * 255), 255};
2908
2909 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2910 // channel) should be less than one
2911 const uint8_t tolerance = 1;
2912
2913 Transaction()
2914 .setColor(colorLayer, color)
2915 .setColorTransform(parentLayer, matrix, vec3())
2916 .apply();
2917 {
2918 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002919 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002920 }
2921}
2922
Alec Mouri80863a62019-01-17 15:19:35 -08002923TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002924 sp<SurfaceControl> parentLayer;
2925 sp<SurfaceControl> colorLayer;
2926 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2927 0 /* buffer height */,
2928 ISurfaceComposerClient::eFXSurfaceContainer));
2929 ASSERT_NO_FATAL_FAILURE(
2930 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2931 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2932
2933 Transaction()
2934 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2935 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2936 .setLayer(parentLayer, mLayerZBase + 1)
2937 .apply();
2938 {
2939 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002940 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002941 }
2942
2943 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2944 half3 expected = color;
2945 mat3 matrixChild;
2946 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2947 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2948 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2949 mat3 matrixParent;
2950 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2951 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2952 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2953
2954 // degamma before applying the matrix
2955 if (mColorManagementUsed) {
2956 ColorTransformHelper::DegammaColor(expected);
2957 }
2958
2959 ColorTransformHelper::applyMatrix(expected, matrixChild);
2960 ColorTransformHelper::applyMatrix(expected, matrixParent);
2961
2962 if (mColorManagementUsed) {
2963 ColorTransformHelper::GammaColor(expected);
2964 }
2965
2966 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2967 uint8_t(expected.b * 255), 255};
2968
2969 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2970 // channel) should be less than one
2971 const uint8_t tolerance = 1;
2972
2973 Transaction()
2974 .setColor(colorLayer, color)
2975 .setColorTransform(parentLayer, matrixParent, vec3())
2976 .setColorTransform(colorLayer, matrixChild, vec3())
2977 .apply();
2978 {
2979 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002980 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002981 }
2982}
2983
Marissa Wall80d94ad2019-01-18 16:04:36 -08002984struct CallbackData {
2985 CallbackData() = default;
2986 CallbackData(nsecs_t time, const sp<Fence>& fence,
2987 const std::vector<SurfaceControlStats>& stats)
2988 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
2989
2990 nsecs_t latchTime;
2991 sp<Fence> presentFence;
2992 std::vector<SurfaceControlStats> surfaceControlStats;
2993};
2994
Marissa Wallfda30bb2018-10-12 11:34:28 -07002995class ExpectedResult {
2996public:
2997 enum Transaction {
2998 NOT_PRESENTED = 0,
2999 PRESENTED,
3000 };
3001
3002 enum Buffer {
3003 NOT_ACQUIRED = 0,
3004 ACQUIRED,
3005 };
3006
3007 enum PreviousBuffer {
3008 NOT_RELEASED = 0,
3009 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003010 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003011 };
3012
3013 void reset() {
3014 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3015 mExpectedSurfaceResults.clear();
3016 }
3017
3018 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003019 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003020 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3021 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003022 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003023 std::forward_as_tuple(bufferResult, previousBufferResult));
3024 }
3025
3026 void addSurfaces(ExpectedResult::Transaction transactionResult,
3027 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003028 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003029 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3030 for (const auto& layer : layers) {
3031 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3032 }
3033 }
3034
Marissa Wall17b4e452018-12-26 16:32:34 -08003035 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3036 mExpectedPresentTime = expectedPresentTime;
3037 }
3038
Marissa Wall80d94ad2019-01-18 16:04:36 -08003039 void verifyCallbackData(const CallbackData& callbackData) const {
3040 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003041 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3042 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003043 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003044 if (mExpectedPresentTime >= 0) {
3045 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3046 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3047 // if the panel is running at 30 hz, at the worst case, our expected time just
3048 // misses vsync and we have to wait another 33.3ms
3049 ASSERT_LE(presentFence->getSignalTime(),
3050 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3051 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003052 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003053 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003054 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3055 }
3056
Marissa Wall80d94ad2019-01-18 16:04:36 -08003057 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003058 << "wrong number of surfaces";
3059
Marissa Wall80d94ad2019-01-18 16:04:36 -08003060 for (const auto& stats : surfaceControlStats) {
3061 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3062
Marissa Wallfda30bb2018-10-12 11:34:28 -07003063 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3064 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3065 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003066 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003067 }
3068 }
3069
3070private:
3071 class ExpectedSurfaceResult {
3072 public:
3073 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3074 ExpectedResult::PreviousBuffer previousBufferResult)
3075 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3076
Marissa Wall80d94ad2019-01-18 16:04:36 -08003077 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3078 nsecs_t latchTime) const {
3079 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003080
3081 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3082 << "bad acquire time";
3083 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003084
3085 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3086 ASSERT_NE(previousReleaseFence, nullptr)
3087 << "failed to set release prev buffer fence";
3088 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3089 ASSERT_EQ(previousReleaseFence, nullptr)
3090 << "should not have set released prev buffer fence";
3091 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003092 }
3093
3094 private:
3095 ExpectedResult::Buffer mBufferResult;
3096 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3097 };
3098
Marissa Wall80d94ad2019-01-18 16:04:36 -08003099 struct SCHash {
3100 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3101 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003102 }
3103 };
3104 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003105 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003106 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003107};
3108
3109class CallbackHelper {
3110public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003111 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3112 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003113 if (!callbackContext) {
3114 ALOGE("failed to get callback context");
3115 }
3116 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3117 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003118 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003119 helper->mConditionVariable.notify_all();
3120 }
3121
Marissa Wall80d94ad2019-01-18 16:04:36 -08003122 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003123 std::unique_lock lock(mMutex);
3124
Marissa Wall80d94ad2019-01-18 16:04:36 -08003125 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003126 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3127 std::cv_status::timeout)
3128 << "did not receive callback";
3129 }
3130
Marissa Wall80d94ad2019-01-18 16:04:36 -08003131 *outData = std::move(mCallbackDataQueue.front());
3132 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003133 }
3134
3135 void verifyFinalState() {
3136 // Wait to see if there are extra callbacks
3137 std::this_thread::sleep_for(500ms);
3138
3139 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003140 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3141 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003142 }
3143
3144 void* getContext() { return static_cast<void*>(this); }
3145
3146 std::mutex mMutex;
3147 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003148 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003149};
3150
3151class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003152public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003153 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003154 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003155 }
3156
Marissa Wall713b63f2018-10-17 15:42:43 -07003157 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
3158 const sp<SurfaceControl>& layer = nullptr) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003159 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003160 sp<GraphicBuffer> buffer;
3161 sp<Fence> fence;
3162 int err = getBuffer(&buffer, &fence);
3163 if (err != NO_ERROR) {
3164 return err;
3165 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003166
Marissa Wall861616d2018-10-22 12:52:23 -07003167 transaction.setBuffer(layer, buffer).setAcquireFence(layer, fence);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003168 }
3169
3170 transaction.addTransactionCompletedCallback(callbackHelper->function,
3171 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003172 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003173 }
3174
Marissa Wall861616d2018-10-22 12:52:23 -07003175 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3176 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003177 CallbackData callbackData;
3178 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3179 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180
3181 if (finalState) {
3182 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3183 }
3184 }
3185
Marissa Wall861616d2018-10-22 12:52:23 -07003186 static void waitForCallbacks(CallbackHelper& helper,
3187 const std::vector<ExpectedResult>& expectedResults,
3188 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003189 for (const auto& expectedResult : expectedResults) {
3190 waitForCallback(helper, expectedResult);
3191 }
3192 if (finalState) {
3193 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3194 }
3195 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003196};
3197
3198TEST_F(LayerCallbackTest, Basic) {
3199 sp<SurfaceControl> layer;
3200 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3201
3202 Transaction transaction;
3203 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003204 int err = fillTransaction(transaction, &callback, layer);
3205 if (err) {
3206 GTEST_SUCCEED() << "test not supported";
3207 return;
3208 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003209
3210 transaction.apply();
3211
3212 ExpectedResult expected;
3213 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3214 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3215}
3216
3217TEST_F(LayerCallbackTest, NoBuffer) {
3218 sp<SurfaceControl> layer;
3219 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3220
3221 Transaction transaction;
3222 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003223 int err = fillTransaction(transaction, &callback);
3224 if (err) {
3225 GTEST_SUCCEED() << "test not supported";
3226 return;
3227 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003228
Marissa Wall861616d2018-10-22 12:52:23 -07003229 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003230
3231 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003232 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3233 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003234 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3235}
3236
3237TEST_F(LayerCallbackTest, NoStateChange) {
3238 Transaction transaction;
3239 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003240 int err = fillTransaction(transaction, &callback);
3241 if (err) {
3242 GTEST_SUCCEED() << "test not supported";
3243 return;
3244 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003245
3246 transaction.apply();
3247
3248 ExpectedResult expected;
3249 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3250}
3251
3252TEST_F(LayerCallbackTest, OffScreen) {
3253 sp<SurfaceControl> layer;
3254 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3255
3256 Transaction transaction;
3257 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003258 int err = fillTransaction(transaction, &callback, layer);
3259 if (err) {
3260 GTEST_SUCCEED() << "test not supported";
3261 return;
3262 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003263
Marissa Wall861616d2018-10-22 12:52:23 -07003264 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003265
3266 ExpectedResult expected;
3267 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3268 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3269}
3270
3271TEST_F(LayerCallbackTest, Merge) {
3272 sp<SurfaceControl> layer1, layer2;
3273 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3274 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3275
3276 Transaction transaction1, transaction2;
3277 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003278 int err = fillTransaction(transaction1, &callback1, layer1);
3279 if (err) {
3280 GTEST_SUCCEED() << "test not supported";
3281 return;
3282 }
3283 err = fillTransaction(transaction2, &callback2, layer2);
3284 if (err) {
3285 GTEST_SUCCEED() << "test not supported";
3286 return;
3287 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003288
Marissa Wall861616d2018-10-22 12:52:23 -07003289 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3290 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003291
3292 ExpectedResult expected;
3293 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3294 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3295 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3296}
3297
3298TEST_F(LayerCallbackTest, Merge_SameCallback) {
3299 sp<SurfaceControl> layer1, layer2;
3300 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3301 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3302
3303 Transaction transaction1, transaction2;
3304 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003305 int err = fillTransaction(transaction1, &callback, layer1);
3306 if (err) {
3307 GTEST_SUCCEED() << "test not supported";
3308 return;
3309 }
3310 err = fillTransaction(transaction2, &callback, layer2);
3311 if (err) {
3312 GTEST_SUCCEED() << "test not supported";
3313 return;
3314 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003315
3316 transaction2.merge(std::move(transaction1)).apply();
3317
3318 ExpectedResult expected;
3319 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3320 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3321 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3322}
3323
3324TEST_F(LayerCallbackTest, Merge_SameLayer) {
3325 sp<SurfaceControl> layer;
3326 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3327
3328 Transaction transaction1, transaction2;
3329 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003330 int err = fillTransaction(transaction1, &callback1, layer);
3331 if (err) {
3332 GTEST_SUCCEED() << "test not supported";
3333 return;
3334 }
3335 err = fillTransaction(transaction2, &callback2, layer);
3336 if (err) {
3337 GTEST_SUCCEED() << "test not supported";
3338 return;
3339 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003340
3341 transaction2.merge(std::move(transaction1)).apply();
3342
3343 ExpectedResult expected;
3344 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3345 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3346 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3347}
3348
Marissa Wallfda30bb2018-10-12 11:34:28 -07003349TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3350 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3351 client2(new SurfaceComposerClient);
3352
3353 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3354 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3355
3356 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003357 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003358 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003359 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003360 ISurfaceComposerClient::eFXSurfaceBufferState));
3361
3362 Transaction transaction1, transaction2;
3363 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003364 int err = fillTransaction(transaction1, &callback1, layer1);
3365 if (err) {
3366 GTEST_SUCCEED() << "test not supported";
3367 return;
3368 }
3369 err = fillTransaction(transaction2, &callback2, layer2);
3370 if (err) {
3371 GTEST_SUCCEED() << "test not supported";
3372 return;
3373 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003374
Marissa Wall861616d2018-10-22 12:52:23 -07003375 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3376 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003377
3378 ExpectedResult expected;
3379 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3380 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3381 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3382}
3383
3384TEST_F(LayerCallbackTest, MultipleTransactions) {
3385 sp<SurfaceControl> layer;
3386 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3387
3388 Transaction transaction;
3389 CallbackHelper callback;
3390 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003391 int err = fillTransaction(transaction, &callback, layer);
3392 if (err) {
3393 GTEST_SUCCEED() << "test not supported";
3394 return;
3395 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003396
3397 transaction.apply();
3398
3399 ExpectedResult expected;
3400 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003401 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003402 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3403 : ExpectedResult::PreviousBuffer::RELEASED);
3404 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3405 }
3406 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3407}
3408
3409TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3410 sp<SurfaceControl> layer;
3411 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3412
3413 Transaction transaction;
3414 CallbackHelper callback;
3415 for (size_t i = 0; i < 10; i++) {
3416 ExpectedResult expected;
3417
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 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3425 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003426 int err = fillTransaction(transaction, &callback);
3427 if (err) {
3428 GTEST_SUCCEED() << "test not supported";
3429 return;
3430 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003431 }
3432
3433 transaction.apply();
3434
3435 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3436 }
3437 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3438}
3439
3440TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3441 sp<SurfaceControl> layer;
3442 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3443
3444 Transaction transaction;
3445 CallbackHelper callback;
3446 for (size_t i = 0; i < 10; i++) {
3447 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003448 int err = fillTransaction(transaction, &callback, layer);
3449 if (err) {
3450 GTEST_SUCCEED() << "test not supported";
3451 return;
3452 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003453 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003454 int err = fillTransaction(transaction, &callback);
3455 if (err) {
3456 GTEST_SUCCEED() << "test not supported";
3457 return;
3458 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003459 }
3460
Marissa Wall861616d2018-10-22 12:52:23 -07003461 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003462
3463 ExpectedResult expected;
3464 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3465 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003466 layer,
3467 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3468 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003469 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3470 }
3471 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3472}
3473
3474TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3475 sp<SurfaceControl> layer1, layer2;
3476 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3477 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3478
3479 Transaction transaction1, transaction2;
3480 CallbackHelper callback1, callback2;
3481 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003482 int err = fillTransaction(transaction1, &callback1, layer1);
3483 if (err) {
3484 GTEST_SUCCEED() << "test not supported";
3485 return;
3486 }
3487 err = fillTransaction(transaction2, &callback2, layer2);
3488 if (err) {
3489 GTEST_SUCCEED() << "test not supported";
3490 return;
3491 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003492
Marissa Wall861616d2018-10-22 12:52:23 -07003493 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3494 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003495
3496 ExpectedResult expected;
3497 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003498 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003499 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3500 : ExpectedResult::PreviousBuffer::RELEASED);
3501 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3502 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3503 }
3504 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3505 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3506}
3507
3508TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3509 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3510 client2(new SurfaceComposerClient);
3511 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3512 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3513
3514 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003515 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003516 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003517 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003518 ISurfaceComposerClient::eFXSurfaceBufferState));
3519
3520 Transaction transaction1, transaction2;
3521 CallbackHelper callback1, callback2;
3522 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003523 int err = fillTransaction(transaction1, &callback1, layer1);
3524 if (err) {
3525 GTEST_SUCCEED() << "test not supported";
3526 return;
3527 }
3528 err = fillTransaction(transaction2, &callback2, layer2);
3529 if (err) {
3530 GTEST_SUCCEED() << "test not supported";
3531 return;
3532 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003533
Marissa Wall861616d2018-10-22 12:52:23 -07003534 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3535 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003536
3537 ExpectedResult expected;
3538 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003539 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003540 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3541 : ExpectedResult::PreviousBuffer::RELEASED);
3542 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3543 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3544 }
3545 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3546 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3547}
3548
3549TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3550 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3551 client2(new SurfaceComposerClient);
3552 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3553 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3554
3555 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003556 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003557 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003558 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003559 ISurfaceComposerClient::eFXSurfaceBufferState));
3560
3561 Transaction transaction1, transaction2;
3562 CallbackHelper callback1, callback2;
3563
3564 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003565 int err = fillTransaction(transaction1, &callback1, layer1);
3566 if (err) {
3567 GTEST_SUCCEED() << "test not supported";
3568 return;
3569 }
3570 err = fillTransaction(transaction2, &callback2, layer2);
3571 if (err) {
3572 GTEST_SUCCEED() << "test not supported";
3573 return;
3574 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003575
Marissa Wall861616d2018-10-22 12:52:23 -07003576 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3577 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003578
3579 ExpectedResult expected;
3580 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3581 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3582 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3583 expected.reset();
3584
3585 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003586 err = fillTransaction(transaction1, &callback1);
3587 if (err) {
3588 GTEST_SUCCEED() << "test not supported";
3589 return;
3590 }
3591 err = fillTransaction(transaction2, &callback2);
3592 if (err) {
3593 GTEST_SUCCEED() << "test not supported";
3594 return;
3595 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003596
3597 transaction2.merge(std::move(transaction1)).apply();
3598
3599 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3600 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3601}
3602
3603TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3604 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3605 client2(new SurfaceComposerClient);
3606
3607 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3608 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3609
3610 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003611 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003612 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003613 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003614 ISurfaceComposerClient::eFXSurfaceBufferState));
3615
3616 Transaction transaction1, transaction2;
3617 CallbackHelper callback1, callback2;
3618
3619 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003620 int err = fillTransaction(transaction1, &callback1, layer1);
3621 if (err) {
3622 GTEST_SUCCEED() << "test not supported";
3623 return;
3624 }
3625 err = fillTransaction(transaction2, &callback2, layer2);
3626 if (err) {
3627 GTEST_SUCCEED() << "test not supported";
3628 return;
3629 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003630
Marissa Wall861616d2018-10-22 12:52:23 -07003631 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3632 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003633
3634 ExpectedResult expected;
3635 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3636 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3637 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3638 expected.reset();
3639
3640 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003641 err = fillTransaction(transaction1, &callback1);
3642 if (err) {
3643 GTEST_SUCCEED() << "test not supported";
3644 return;
3645 }
3646 err = fillTransaction(transaction2, &callback2);
3647 if (err) {
3648 GTEST_SUCCEED() << "test not supported";
3649 return;
3650 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003651
Marissa Wall861616d2018-10-22 12:52:23 -07003652 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003653
Marissa Wall713b63f2018-10-17 15:42:43 -07003654 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3655 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003656 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3657 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3658}
3659
3660TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3661 sp<SurfaceControl> layer;
3662 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3663
3664 Transaction transaction;
3665 CallbackHelper callback;
3666 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003667 for (auto& expected : expectedResults) {
3668 expected.reset();
3669 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003670 ExpectedResult::Buffer::ACQUIRED,
3671 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003672
Marissa Wall713b63f2018-10-17 15:42:43 -07003673 int err = fillTransaction(transaction, &callback, layer);
3674 if (err) {
3675 GTEST_SUCCEED() << "test not supported";
3676 return;
3677 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003678
3679 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003680 }
3681 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3682}
3683
3684TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3685 sp<SurfaceControl> layer;
3686 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3687
Marissa Wall713b63f2018-10-17 15:42:43 -07003688 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003689 Transaction transaction;
3690 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003691 int err = fillTransaction(transaction, &callback, layer);
3692 if (err) {
3693 GTEST_SUCCEED() << "test not supported";
3694 return;
3695 }
3696
3697 transaction.apply();
3698
3699 ExpectedResult expected;
3700 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3701 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3702
3703 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003704 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003705 for (auto& expected : expectedResults) {
3706 expected.reset();
3707
Marissa Wall713b63f2018-10-17 15:42:43 -07003708 err = fillTransaction(transaction, &callback);
3709 if (err) {
3710 GTEST_SUCCEED() << "test not supported";
3711 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003712 }
3713
3714 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003715 }
3716 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3717}
3718
3719TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3720 sp<SurfaceControl> layer;
3721 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3722
3723 // Normal call to set up test
3724 Transaction transaction;
3725 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003726 int err = fillTransaction(transaction, &callback, layer);
3727 if (err) {
3728 GTEST_SUCCEED() << "test not supported";
3729 return;
3730 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003731
Marissa Wall861616d2018-10-22 12:52:23 -07003732 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003733
3734 ExpectedResult expectedResult;
3735 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3736 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3737
3738 // Test
3739 std::vector<ExpectedResult> expectedResults(50);
3740 for (auto& expected : expectedResults) {
3741 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003742 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3743 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003744
Marissa Wall713b63f2018-10-17 15:42:43 -07003745 err = fillTransaction(transaction, &callback);
3746 if (err) {
3747 GTEST_SUCCEED() << "test not supported";
3748 return;
3749 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003750
Marissa Wall861616d2018-10-22 12:52:23 -07003751 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003752 }
3753 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3754}
3755
Marissa Wall17b4e452018-12-26 16:32:34 -08003756TEST_F(LayerCallbackTest, DesiredPresentTime) {
3757 sp<SurfaceControl> layer;
3758 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3759
3760 Transaction transaction;
3761 CallbackHelper callback;
3762 int err = fillTransaction(transaction, &callback, layer);
3763 if (err) {
3764 GTEST_SUCCEED() << "test not supported";
3765 return;
3766 }
3767
3768 // Try to present 100ms in the future
3769 nsecs_t time = systemTime() + (100 * 1e6);
3770
3771 transaction.setDesiredPresentTime(time);
3772 transaction.apply();
3773
3774 ExpectedResult expected;
3775 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3776 expected.addExpectedPresentTime(time);
3777 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3778}
3779
3780TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3781 sp<SurfaceControl> layer;
3782 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3783
3784 Transaction transaction;
3785 CallbackHelper callback1;
3786 int err = fillTransaction(transaction, &callback1, layer);
3787 if (err) {
3788 GTEST_SUCCEED() << "test not supported";
3789 return;
3790 }
3791
3792 // Try to present 100ms in the future
3793 nsecs_t time = systemTime() + (100 * 1e6);
3794
3795 transaction.setDesiredPresentTime(time);
3796 transaction.apply();
3797
3798 ExpectedResult expected1;
3799 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3800 expected1.addExpectedPresentTime(time);
3801
3802 CallbackHelper callback2;
3803 err = fillTransaction(transaction, &callback2, layer);
3804 if (err) {
3805 GTEST_SUCCEED() << "test not supported";
3806 return;
3807 }
3808
3809 // Try to present 33ms after the first frame
3810 time += (33.3 * 1e6);
3811
3812 transaction.setDesiredPresentTime(time);
3813 transaction.apply();
3814
3815 ExpectedResult expected2;
3816 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3817 ExpectedResult::Buffer::ACQUIRED,
3818 ExpectedResult::PreviousBuffer::RELEASED);
3819 expected2.addExpectedPresentTime(time);
3820
3821 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3822 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3823}
3824
3825TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3826 sp<SurfaceControl> layer;
3827 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3828
3829 Transaction transaction;
3830 CallbackHelper callback1;
3831 int err = fillTransaction(transaction, &callback1, layer);
3832 if (err) {
3833 GTEST_SUCCEED() << "test not supported";
3834 return;
3835 }
3836
3837 // Try to present 100ms in the future
3838 nsecs_t time = systemTime() + (100 * 1e6);
3839
3840 transaction.setDesiredPresentTime(time);
3841 transaction.apply();
3842
3843 ExpectedResult expected1;
3844 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3845 expected1.addExpectedPresentTime(time);
3846
3847 CallbackHelper callback2;
3848 err = fillTransaction(transaction, &callback2, layer);
3849 if (err) {
3850 GTEST_SUCCEED() << "test not supported";
3851 return;
3852 }
3853
3854 // Try to present 33ms before the previous frame
3855 time -= (33.3 * 1e6);
3856
3857 transaction.setDesiredPresentTime(time);
3858 transaction.apply();
3859
3860 ExpectedResult expected2;
3861 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3862 ExpectedResult::Buffer::ACQUIRED,
3863 ExpectedResult::PreviousBuffer::RELEASED);
3864
3865 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3866 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3867}
3868
3869TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3870 sp<SurfaceControl> layer;
3871 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3872
3873 Transaction transaction;
3874 CallbackHelper callback;
3875 int err = fillTransaction(transaction, &callback, layer);
3876 if (err) {
3877 GTEST_SUCCEED() << "test not supported";
3878 return;
3879 }
3880
3881 // Try to present 100ms in the past
3882 nsecs_t time = systemTime() - (100 * 1e6);
3883
3884 transaction.setDesiredPresentTime(time);
3885 transaction.apply();
3886
3887 ExpectedResult expected;
3888 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3889 expected.addExpectedPresentTime(systemTime());
3890 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3891}
3892
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003893class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003894protected:
3895 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003896 LayerTransactionTest::SetUp();
3897 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003898
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003899 sp<IBinder> display(
3900 SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003901 DisplayInfo info;
Jeff Brown9d4e3d22012-08-24 20:00:51 -07003902 SurfaceComposerClient::getDisplayInfo(display, &info);
Mathias Agopianc666cae2012-07-25 18:56:13 -07003903
3904 ssize_t displayWidth = info.w;
3905 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003906
3907 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003908 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3909 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003910 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003911 ASSERT_TRUE(mBGSurfaceControl->isValid());
3912 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3913
3914 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003915 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
3916
Peiyong Lin566a3b42018-01-09 18:22:43 -08003917 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003918 ASSERT_TRUE(mFGSurfaceControl->isValid());
3919
3920 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
3921
3922 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07003923 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003924 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003925 ASSERT_TRUE(mSyncSurfaceControl->isValid());
3926
3927 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3928
Robert Carr4cdc58f2017-08-23 14:22:20 -07003929 asTransaction([&](Transaction& t) {
3930 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003931
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003932 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07003933
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003934 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
3935 .setPosition(mFGSurfaceControl, 64, 64)
3936 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003937
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003938 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
3939 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
3940 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07003941 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003942 }
3943
3944 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07003945 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003946 mBGSurfaceControl = 0;
3947 mFGSurfaceControl = 0;
3948 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003949 }
3950
3951 void waitForPostedBuffers() {
3952 // Since the sync surface is in synchronous mode (i.e. double buffered)
3953 // posting three buffers to it should ensure that at least two
3954 // SurfaceFlinger::handlePageFlip calls have been made, which should
3955 // guaranteed that a buffer posted to another Surface has been retired.
3956 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3957 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3958 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3959 }
3960
Robert Carr4cdc58f2017-08-23 14:22:20 -07003961 void asTransaction(const std::function<void(Transaction&)>& exec) {
3962 Transaction t;
3963 exec(t);
3964 t.apply(true);
3965 }
3966
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003967 sp<SurfaceControl> mBGSurfaceControl;
3968 sp<SurfaceControl> mFGSurfaceControl;
3969
3970 // This surface is used to ensure that the buffers posted to
3971 // mFGSurfaceControl have been picked up by SurfaceFlinger.
3972 sp<SurfaceControl> mSyncSurfaceControl;
3973};
3974
Robert Carr7f619b22017-11-06 12:56:35 -08003975TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08003976
chaviw0e3479f2018-09-10 16:49:30 -07003977 std::unique_ptr<ScreenCapture> sc;
3978
3979 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08003980 fillSurfaceRGBA8(relative, 10, 10, 10);
3981 waitForPostedBuffers();
3982
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003983 Transaction{}
3984 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08003985 .setPosition(relative, 64, 64)
3986 .apply();
3987
3988 {
3989 // The relative should be on top of the FG control.
3990 ScreenCapture::captureScreen(&sc);
3991 sc->checkPixel(64, 64, 10, 10, 10);
3992 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003993 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08003994
3995 {
3996 // Nothing should change at this point.
3997 ScreenCapture::captureScreen(&sc);
3998 sc->checkPixel(64, 64, 10, 10, 10);
3999 }
4000
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004001 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004002
4003 {
4004 // Ensure that the relative was actually hidden, rather than
4005 // being left in the detached but visible state.
4006 ScreenCapture::captureScreen(&sc);
4007 sc->expectFGColor(64, 64);
4008 }
4009}
4010
Robert Carr8d5227b2017-03-16 15:41:03 -07004011class GeometryLatchingTest : public LayerUpdateTest {
4012protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004013 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004014 SCOPED_TRACE(trace);
4015 ScreenCapture::captureScreen(&sc);
4016 // We find the leading edge of the FG surface.
4017 sc->expectFGColor(127, 127);
4018 sc->expectBGColor(128, 128);
4019 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004020
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004021 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004022
4023 void unlockFGBuffer() {
4024 sp<Surface> s = mFGSurfaceControl->getSurface();
4025 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4026 waitForPostedBuffers();
4027 }
4028
Robert Carr8d5227b2017-03-16 15:41:03 -07004029 void completeFGResize() {
4030 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4031 waitForPostedBuffers();
4032 }
4033 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004034 asTransaction([&](Transaction& t) {
4035 t.setSize(mFGSurfaceControl, 64, 64);
4036 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004037 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004038 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004039
4040 EXPECT_INITIAL_STATE("After restoring initial state");
4041 }
chaviw0e3479f2018-09-10 16:49:30 -07004042 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004043};
4044
Robert Carr8d5227b2017-03-16 15:41:03 -07004045class CropLatchingTest : public GeometryLatchingTest {
4046protected:
4047 void EXPECT_CROPPED_STATE(const char* trace) {
4048 SCOPED_TRACE(trace);
4049 ScreenCapture::captureScreen(&sc);
4050 // The edge should be moved back one pixel by our crop.
4051 sc->expectFGColor(126, 126);
4052 sc->expectBGColor(127, 127);
4053 sc->expectBGColor(128, 128);
4054 }
chaviw59f5c562017-06-28 16:39:06 -07004055
4056 void EXPECT_RESIZE_STATE(const char* trace) {
4057 SCOPED_TRACE(trace);
4058 ScreenCapture::captureScreen(&sc);
4059 // The FG is now resized too 128,128 at 64,64
4060 sc->expectFGColor(64, 64);
4061 sc->expectFGColor(191, 191);
4062 sc->expectBGColor(192, 192);
4063 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004064};
4065
Pablo Ceballos05289c22016-04-14 15:49:55 -07004066TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004067 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004068 {
4069 SCOPED_TRACE("before anything");
4070 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004071 sc->expectBGColor(32, 32);
4072 sc->expectFGColor(96, 96);
4073 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004074 }
4075
4076 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004077 asTransaction([&](Transaction& t) {
4078 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004079 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4080 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004081 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004082
Robert Carr4cdc58f2017-08-23 14:22:20 -07004083 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004084 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004085 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4086 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004087 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004088
4089 {
4090 SCOPED_TRACE("before any trigger");
4091 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004092 sc->expectBGColor(32, 32);
4093 sc->expectFGColor(96, 96);
4094 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004095 }
4096
4097 // should trigger the first deferred transaction, but not the second one
4098 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4099 {
4100 SCOPED_TRACE("after first trigger");
4101 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004102 sc->expectBGColor(32, 32);
4103 sc->checkPixel(96, 96, 162, 63, 96);
4104 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004105 }
4106
4107 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004108 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004109
4110 // trigger the second deferred transaction
4111 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4112 {
4113 SCOPED_TRACE("after second trigger");
4114 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004115 sc->expectBGColor(32, 32);
4116 sc->expectBGColor(96, 96);
4117 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004118 }
4119}
4120
Robert Carre392b552017-09-19 12:16:05 -07004121TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004122 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004123
4124 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004125 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4126 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4127 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4128 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004129 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004130 SurfaceComposerClient::Transaction{}
4131 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4132 .show(childNoBuffer)
4133 .show(childBuffer)
4134 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004135 {
4136 ScreenCapture::captureScreen(&sc);
4137 sc->expectChildColor(73, 73);
4138 sc->expectFGColor(74, 74);
4139 }
Vishnu Nair60356342018-11-13 13:00:45 -08004140 SurfaceComposerClient::Transaction{}
4141 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4142 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004143 {
4144 ScreenCapture::captureScreen(&sc);
4145 sc->expectChildColor(73, 73);
4146 sc->expectChildColor(74, 74);
4147 }
4148}
4149
Robert Carr2c5f6d22017-09-26 12:30:35 -07004150TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004151 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004152 {
4153 SCOPED_TRACE("before move");
4154 ScreenCapture::captureScreen(&sc);
4155 sc->expectBGColor(0, 12);
4156 sc->expectFGColor(75, 75);
4157 sc->expectBGColor(145, 145);
4158 }
4159
4160 Transaction t1, t2;
4161 t1.setPosition(mFGSurfaceControl, 128, 128);
4162 t2.setPosition(mFGSurfaceControl, 0, 0);
4163 // We expect that the position update from t2 now
4164 // overwrites the position update from t1.
4165 t1.merge(std::move(t2));
4166 t1.apply();
4167
4168 {
4169 ScreenCapture::captureScreen(&sc);
4170 sc->expectFGColor(1, 1);
4171 }
4172}
4173
Robert Carr1f0a16a2016-10-24 16:27:39 -07004174class ChildLayerTest : public LayerUpdateTest {
4175protected:
4176 void SetUp() override {
4177 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004178 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4179 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004180 fillSurfaceRGBA8(mChild, 200, 200, 200);
4181
4182 {
4183 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004184 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004185 mCapture->expectChildColor(64, 64);
4186 }
4187 }
4188 void TearDown() override {
4189 LayerUpdateTest::TearDown();
4190 mChild = 0;
4191 }
4192
4193 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004194 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004195};
4196
4197TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004198 asTransaction([&](Transaction& t) {
4199 t.show(mChild);
4200 t.setPosition(mChild, 10, 10);
4201 t.setPosition(mFGSurfaceControl, 64, 64);
4202 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004203
4204 {
chaviw0e3479f2018-09-10 16:49:30 -07004205 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004206 // Top left of foreground must now be visible
4207 mCapture->expectFGColor(64, 64);
4208 // But 10 pixels in we should see the child surface
4209 mCapture->expectChildColor(74, 74);
4210 // And 10 more pixels we should be back to the foreground surface
4211 mCapture->expectFGColor(84, 84);
4212 }
4213
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004214 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004215
4216 {
chaviw0e3479f2018-09-10 16:49:30 -07004217 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004218 // Top left of foreground should now be at 0, 0
4219 mCapture->expectFGColor(0, 0);
4220 // But 10 pixels in we should see the child surface
4221 mCapture->expectChildColor(10, 10);
4222 // And 10 more pixels we should be back to the foreground surface
4223 mCapture->expectFGColor(20, 20);
4224 }
4225}
4226
Robert Carr41b08b52017-06-01 16:11:34 -07004227TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004228 asTransaction([&](Transaction& t) {
4229 t.show(mChild);
4230 t.setPosition(mChild, 0, 0);
4231 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004232 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004233 });
Robert Carr41b08b52017-06-01 16:11:34 -07004234
4235 {
chaviw0e3479f2018-09-10 16:49:30 -07004236 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004237 mCapture->expectChildColor(0, 0);
4238 mCapture->expectChildColor(4, 4);
4239 mCapture->expectBGColor(5, 5);
4240 }
4241}
4242
Robert Carr1f0a16a2016-10-24 16:27:39 -07004243TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004244 asTransaction([&](Transaction& t) {
4245 t.show(mChild);
4246 t.setPosition(mFGSurfaceControl, 0, 0);
4247 t.setPosition(mChild, 63, 63);
4248 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004249
4250 {
chaviw0e3479f2018-09-10 16:49:30 -07004251 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004252 mCapture->expectFGColor(0, 0);
4253 // Last pixel in foreground should now be the child.
4254 mCapture->expectChildColor(63, 63);
4255 // But the child should be constrained and the next pixel
4256 // must be the background
4257 mCapture->expectBGColor(64, 64);
4258 }
4259}
4260
4261TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004262 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004263
4264 // Find the boundary between the parent and child
4265 {
chaviw0e3479f2018-09-10 16:49:30 -07004266 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004267 mCapture->expectChildColor(9, 9);
4268 mCapture->expectFGColor(10, 10);
4269 }
4270
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004271 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004272
4273 // The boundary should be twice as far from the origin now.
4274 // The pixels from the last test should all be child now
4275 {
chaviw0e3479f2018-09-10 16:49:30 -07004276 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004277 mCapture->expectChildColor(9, 9);
4278 mCapture->expectChildColor(10, 10);
4279 mCapture->expectChildColor(19, 19);
4280 mCapture->expectFGColor(20, 20);
4281 }
4282}
Robert Carr9524cb32017-02-13 11:32:32 -08004283
Robert Carr6452f122017-03-21 10:41:29 -07004284TEST_F(ChildLayerTest, ChildLayerAlpha) {
4285 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4286 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4287 fillSurfaceRGBA8(mChild, 0, 254, 0);
4288 waitForPostedBuffers();
4289
Robert Carr4cdc58f2017-08-23 14:22:20 -07004290 asTransaction([&](Transaction& t) {
4291 t.show(mChild);
4292 t.setPosition(mChild, 0, 0);
4293 t.setPosition(mFGSurfaceControl, 0, 0);
4294 });
Robert Carr6452f122017-03-21 10:41:29 -07004295
4296 {
chaviw0e3479f2018-09-10 16:49:30 -07004297 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004298 // Unblended child color
4299 mCapture->checkPixel(0, 0, 0, 254, 0);
4300 }
4301
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004302 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004303
4304 {
chaviw0e3479f2018-09-10 16:49:30 -07004305 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004306 // Child and BG blended.
4307 mCapture->checkPixel(0, 0, 127, 127, 0);
4308 }
4309
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004310 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004311
4312 {
chaviw0e3479f2018-09-10 16:49:30 -07004313 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004314 // Child and BG blended.
4315 mCapture->checkPixel(0, 0, 95, 64, 95);
4316 }
4317}
4318
Robert Carr9524cb32017-02-13 11:32:32 -08004319TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004320 asTransaction([&](Transaction& t) {
4321 t.show(mChild);
4322 t.setPosition(mChild, 10, 10);
4323 t.setPosition(mFGSurfaceControl, 64, 64);
4324 });
Robert Carr9524cb32017-02-13 11:32:32 -08004325
4326 {
chaviw0e3479f2018-09-10 16:49:30 -07004327 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004328 // Top left of foreground must now be visible
4329 mCapture->expectFGColor(64, 64);
4330 // But 10 pixels in we should see the child surface
4331 mCapture->expectChildColor(74, 74);
4332 // And 10 more pixels we should be back to the foreground surface
4333 mCapture->expectFGColor(84, 84);
4334 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004335
4336 asTransaction([&](Transaction& t) {
4337 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4338 });
4339
Robert Carr9524cb32017-02-13 11:32:32 -08004340 {
chaviw0e3479f2018-09-10 16:49:30 -07004341 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004342 mCapture->expectFGColor(64, 64);
4343 // In reparenting we should have exposed the entire foreground surface.
4344 mCapture->expectFGColor(74, 74);
4345 // And the child layer should now begin at 10, 10 (since the BG
4346 // layer is at (0, 0)).
4347 mCapture->expectBGColor(9, 9);
4348 mCapture->expectChildColor(10, 10);
4349 }
4350}
4351
Robert Carr2e102c92018-10-23 12:11:15 -07004352TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4353 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004354 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004355 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4356
4357 {
4358 SCOPED_TRACE("Grandchild visible");
4359 ScreenCapture::captureScreen(&mCapture);
4360 mCapture->checkPixel(64, 64, 111, 111, 111);
4361 }
4362
Robert Carr87246532019-02-04 15:20:26 -08004363 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004364
4365 {
4366 SCOPED_TRACE("After destroying child");
4367 ScreenCapture::captureScreen(&mCapture);
4368 mCapture->expectFGColor(64, 64);
4369 }
4370
4371 asTransaction([&](Transaction& t) {
4372 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4373 });
4374
4375 {
4376 SCOPED_TRACE("After reparenting grandchild");
4377 ScreenCapture::captureScreen(&mCapture);
4378 mCapture->checkPixel(64, 64, 111, 111, 111);
4379 }
4380}
4381
chaviw161410b02017-07-27 10:46:08 -07004382TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004383 asTransaction([&](Transaction& t) {
4384 t.show(mChild);
4385 t.setPosition(mChild, 10, 10);
4386 t.setPosition(mFGSurfaceControl, 64, 64);
4387 });
Robert Carr9524cb32017-02-13 11:32:32 -08004388
4389 {
chaviw0e3479f2018-09-10 16:49:30 -07004390 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004391 // Top left of foreground must now be visible
4392 mCapture->expectFGColor(64, 64);
4393 // But 10 pixels in we should see the child surface
4394 mCapture->expectChildColor(74, 74);
4395 // And 10 more pixels we should be back to the foreground surface
4396 mCapture->expectFGColor(84, 84);
4397 }
4398
chaviw0e3479f2018-09-10 16:49:30 -07004399
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004400 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004401
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004402 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004403
chaviw161410b02017-07-27 10:46:08 -07004404 // Since the child has the same client as the parent, it will not get
4405 // detached and will be hidden.
4406 {
chaviw0e3479f2018-09-10 16:49:30 -07004407 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004408 mCapture->expectFGColor(64, 64);
4409 mCapture->expectFGColor(74, 74);
4410 mCapture->expectFGColor(84, 84);
4411 }
4412}
4413
4414TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4415 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004416 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004417 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4418 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004419
chaviw161410b02017-07-27 10:46:08 -07004420 ASSERT_TRUE(mChildNewClient->isValid());
4421
4422 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4423
Robert Carr4cdc58f2017-08-23 14:22:20 -07004424 asTransaction([&](Transaction& t) {
4425 t.hide(mChild);
4426 t.show(mChildNewClient);
4427 t.setPosition(mChildNewClient, 10, 10);
4428 t.setPosition(mFGSurfaceControl, 64, 64);
4429 });
chaviw161410b02017-07-27 10:46:08 -07004430
4431 {
chaviw0e3479f2018-09-10 16:49:30 -07004432 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004433 // Top left of foreground must now be visible
4434 mCapture->expectFGColor(64, 64);
4435 // But 10 pixels in we should see the child surface
4436 mCapture->expectChildColor(74, 74);
4437 // And 10 more pixels we should be back to the foreground surface
4438 mCapture->expectFGColor(84, 84);
4439 }
4440
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004441 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004442
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004443 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004444
Robert Carr9524cb32017-02-13 11:32:32 -08004445 // Nothing should have changed.
4446 {
chaviw0e3479f2018-09-10 16:49:30 -07004447 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004448 mCapture->expectFGColor(64, 64);
4449 mCapture->expectChildColor(74, 74);
4450 mCapture->expectFGColor(84, 84);
4451 }
4452}
4453
chaviw5aedec92018-10-22 10:40:38 -07004454TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4455 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4456 sp<SurfaceControl> childNewClient =
4457 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4458 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4459
4460 ASSERT_TRUE(childNewClient != nullptr);
4461 ASSERT_TRUE(childNewClient->isValid());
4462
4463 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4464
4465 Transaction()
4466 .hide(mChild)
4467 .show(childNewClient)
4468 .setPosition(childNewClient, 10, 10)
4469 .setPosition(mFGSurfaceControl, 64, 64)
4470 .apply();
4471
4472 {
4473 mCapture = screenshot();
4474 // Top left of foreground must now be visible
4475 mCapture->expectFGColor(64, 64);
4476 // But 10 pixels in we should see the child surface
4477 mCapture->expectChildColor(74, 74);
4478 // And 10 more pixels we should be back to the foreground surface
4479 mCapture->expectFGColor(84, 84);
4480 }
4481
4482 Transaction().detachChildren(mFGSurfaceControl).apply();
4483 Transaction().hide(childNewClient).apply();
4484
4485 // Nothing should have changed.
4486 {
4487 mCapture = screenshot();
4488 mCapture->expectFGColor(64, 64);
4489 mCapture->expectChildColor(74, 74);
4490 mCapture->expectFGColor(84, 84);
4491 }
4492
4493 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4494 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4495 32);
4496 Transaction()
4497 .setLayer(newParentSurface, INT32_MAX - 1)
4498 .show(newParentSurface)
4499 .setPosition(newParentSurface, 20, 20)
4500 .reparent(childNewClient, newParentSurface->getHandle())
4501 .apply();
4502 {
4503 mCapture = screenshot();
4504 // Child is now hidden.
4505 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4506 }
4507}
4508
Robert Carr9b429f42017-04-17 14:56:57 -07004509TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004510 asTransaction([&](Transaction& t) {
4511 t.show(mChild);
4512 t.setPosition(mChild, 0, 0);
4513 t.setPosition(mFGSurfaceControl, 0, 0);
4514 });
Robert Carr9b429f42017-04-17 14:56:57 -07004515
4516 {
chaviw0e3479f2018-09-10 16:49:30 -07004517 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004518 // We've positioned the child in the top left.
4519 mCapture->expectChildColor(0, 0);
4520 // But it's only 10x10.
4521 mCapture->expectFGColor(10, 10);
4522 }
4523
Robert Carr4cdc58f2017-08-23 14:22:20 -07004524 asTransaction([&](Transaction& t) {
4525 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4526 // We cause scaling by 2.
4527 t.setSize(mFGSurfaceControl, 128, 128);
4528 });
Robert Carr9b429f42017-04-17 14:56:57 -07004529
4530 {
chaviw0e3479f2018-09-10 16:49:30 -07004531 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004532 // We've positioned the child in the top left.
4533 mCapture->expectChildColor(0, 0);
4534 mCapture->expectChildColor(10, 10);
4535 mCapture->expectChildColor(19, 19);
4536 // And now it should be scaled all the way to 20x20
4537 mCapture->expectFGColor(20, 20);
4538 }
4539}
4540
Robert Carr1725eee2017-04-26 18:32:15 -07004541// Regression test for b/37673612
4542TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004543 asTransaction([&](Transaction& t) {
4544 t.show(mChild);
4545 t.setPosition(mChild, 0, 0);
4546 t.setPosition(mFGSurfaceControl, 0, 0);
4547 });
Robert Carr1725eee2017-04-26 18:32:15 -07004548
4549 {
chaviw0e3479f2018-09-10 16:49:30 -07004550 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004551 // We've positioned the child in the top left.
4552 mCapture->expectChildColor(0, 0);
4553 // But it's only 10x10.
4554 mCapture->expectFGColor(10, 10);
4555 }
Robert Carr1725eee2017-04-26 18:32:15 -07004556 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4557 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004558 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004559 sp<Surface> s = mFGSurfaceControl->getSurface();
4560 auto anw = static_cast<ANativeWindow*>(s.get());
4561 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4562 native_window_set_buffers_dimensions(anw, 64, 128);
4563 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4564 waitForPostedBuffers();
4565
4566 {
4567 // The child should still be in the same place and not have any strange scaling as in
4568 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004569 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004570 mCapture->expectChildColor(0, 0);
4571 mCapture->expectFGColor(10, 10);
4572 }
4573}
4574
Dan Stoza412903f2017-04-27 13:42:17 -07004575TEST_F(ChildLayerTest, Bug36858924) {
4576 // Destroy the child layer
4577 mChild.clear();
4578
4579 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004580 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4581 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004582
4583 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004584 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004585 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4586 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004587 t.show(mChild);
4588 });
Dan Stoza412903f2017-04-27 13:42:17 -07004589
4590 // Render the foreground surface a few times
4591 //
4592 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4593 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4594 // never acquire/release the first buffer
4595 ALOGI("Filling 1");
4596 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4597 ALOGI("Filling 2");
4598 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4599 ALOGI("Filling 3");
4600 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4601 ALOGI("Filling 4");
4602 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4603}
4604
chaviwf1961f72017-09-18 16:41:07 -07004605TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004606 asTransaction([&](Transaction& t) {
4607 t.show(mChild);
4608 t.setPosition(mChild, 10, 10);
4609 t.setPosition(mFGSurfaceControl, 64, 64);
4610 });
chaviw06178942017-07-27 10:25:59 -07004611
4612 {
chaviw0e3479f2018-09-10 16:49:30 -07004613 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004614 // Top left of foreground must now be visible
4615 mCapture->expectFGColor(64, 64);
4616 // But 10 pixels in we should see the child surface
4617 mCapture->expectChildColor(74, 74);
4618 // And 10 more pixels we should be back to the foreground surface
4619 mCapture->expectFGColor(84, 84);
4620 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004621
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004622 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004623
chaviw06178942017-07-27 10:25:59 -07004624 {
chaviw0e3479f2018-09-10 16:49:30 -07004625 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004626 mCapture->expectFGColor(64, 64);
4627 // In reparenting we should have exposed the entire foreground surface.
4628 mCapture->expectFGColor(74, 74);
4629 // And the child layer should now begin at 10, 10 (since the BG
4630 // layer is at (0, 0)).
4631 mCapture->expectBGColor(9, 9);
4632 mCapture->expectChildColor(10, 10);
4633 }
4634}
4635
chaviwf1961f72017-09-18 16:41:07 -07004636TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004637 asTransaction([&](Transaction& t) {
4638 t.show(mChild);
4639 t.setPosition(mChild, 10, 10);
4640 t.setPosition(mFGSurfaceControl, 64, 64);
4641 });
chaviwf1961f72017-09-18 16:41:07 -07004642
4643 {
chaviw0e3479f2018-09-10 16:49:30 -07004644 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004645 // Top left of foreground must now be visible
4646 mCapture->expectFGColor(64, 64);
4647 // But 10 pixels in we should see the child surface
4648 mCapture->expectChildColor(74, 74);
4649 // And 10 more pixels we should be back to the foreground surface
4650 mCapture->expectFGColor(84, 84);
4651 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004652 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004653 {
chaviw0e3479f2018-09-10 16:49:30 -07004654 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004655 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004656 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004657 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004658 mCapture->expectFGColor(84, 84);
4659 }
4660}
4661
4662TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004663 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004664 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004665 ASSERT_TRUE(newSurface->isValid());
4666
4667 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004668 asTransaction([&](Transaction& t) {
4669 t.hide(mChild);
4670 t.show(newSurface);
4671 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004672 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004673 t.setPosition(mFGSurfaceControl, 64, 64);
4674 });
chaviwf1961f72017-09-18 16:41:07 -07004675
4676 {
chaviw0e3479f2018-09-10 16:49:30 -07004677 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004678 // Top left of foreground must now be visible
4679 mCapture->expectFGColor(64, 64);
4680 // At 10, 10 we should see the new surface
4681 mCapture->checkPixel(10, 10, 63, 195, 63);
4682 }
4683
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004684 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004685
4686 {
chaviw0e3479f2018-09-10 16:49:30 -07004687 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004688 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4689 // mFGSurface, putting it at 74, 74.
4690 mCapture->expectFGColor(64, 64);
4691 mCapture->checkPixel(74, 74, 63, 195, 63);
4692 mCapture->expectFGColor(84, 84);
4693 }
4694}
4695
chaviwc9674332017-08-28 12:32:18 -07004696TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004697 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4698 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004699 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4700
4701 {
chaviw0e3479f2018-09-10 16:49:30 -07004702 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004703 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4704 // which begins at 64, 64
4705 mCapture->checkPixel(64, 64, 50, 50, 50);
4706 }
4707}
4708
Robert Carr503c7042017-09-27 15:06:08 -07004709TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004710 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004711 fillSurfaceRGBA8(relative, 255, 255, 255);
4712
4713 Transaction t;
4714 t.setLayer(relative, INT32_MAX)
4715 .setRelativeLayer(mChild, relative->getHandle(), 1)
4716 .setPosition(mFGSurfaceControl, 0, 0)
4717 .apply(true);
4718
4719 // We expect that the child should have been elevated above our
4720 // INT_MAX layer even though it's not a child of it.
4721 {
chaviw0e3479f2018-09-10 16:49:30 -07004722 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004723 mCapture->expectChildColor(0, 0);
4724 mCapture->expectChildColor(9, 9);
4725 mCapture->checkPixel(10, 10, 255, 255, 255);
4726 }
4727}
Vishnu Nair60356342018-11-13 13:00:45 -08004728class BoundlessLayerTest : public LayerUpdateTest {
4729protected:
4730 std::unique_ptr<ScreenCapture> mCapture;
4731};
4732
4733// Verify setting a size on a buffer layer has no effect.
4734TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4735 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004736 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4737 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004738 ASSERT_TRUE(bufferLayer->isValid());
4739 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4740 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4741 {
4742 mCapture = screenshot();
4743 // Top left of background must now be visible
4744 mCapture->expectBGColor(0, 0);
4745 // Foreground Surface bounds must be color layer
4746 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4747 // Buffer layer should not extend past buffer bounds
4748 mCapture->expectFGColor(95, 95);
4749 }
4750}
4751
4752// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4753// which will crop the color layer.
4754TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4755 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004756 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4757 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004758 ASSERT_TRUE(colorLayer->isValid());
4759 asTransaction([&](Transaction& t) {
4760 t.setColor(colorLayer, half3{0, 0, 0});
4761 t.show(colorLayer);
4762 });
4763 {
4764 mCapture = screenshot();
4765 // Top left of background must now be visible
4766 mCapture->expectBGColor(0, 0);
4767 // Foreground Surface bounds must be color layer
4768 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4769 // Color layer should not extend past foreground bounds
4770 mCapture->expectBGColor(129, 129);
4771 }
4772}
4773
4774// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4775// a crop which will be used to crop the color layer.
4776TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004777 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4778 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004779 ASSERT_TRUE(cropLayer->isValid());
4780 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004781 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4782 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004783 ASSERT_TRUE(colorLayer->isValid());
4784 asTransaction([&](Transaction& t) {
4785 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4786 t.setColor(colorLayer, half3{0, 0, 0});
4787 t.show(cropLayer);
4788 t.show(colorLayer);
4789 });
4790 {
4791 mCapture = screenshot();
4792 // Top left of background must now be visible
4793 mCapture->expectBGColor(0, 0);
4794 // Top left of foreground must now be visible
4795 mCapture->expectFGColor(64, 64);
4796 // 5 pixels from the foreground we should see the child surface
4797 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4798 // 10 pixels from the foreground we should be back to the foreground surface
4799 mCapture->expectFGColor(74, 74);
4800 }
4801}
4802
4803// Verify for boundless layer with no children, their transforms have no effect.
4804TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4805 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004806 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4807 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004808 ASSERT_TRUE(colorLayer->isValid());
4809 asTransaction([&](Transaction& t) {
4810 t.setPosition(colorLayer, 320, 320);
4811 t.setMatrix(colorLayer, 2, 0, 0, 2);
4812 t.setColor(colorLayer, half3{0, 0, 0});
4813 t.show(colorLayer);
4814 });
4815 {
4816 mCapture = screenshot();
4817 // Top left of background must now be visible
4818 mCapture->expectBGColor(0, 0);
4819 // Foreground Surface bounds must be color layer
4820 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4821 // Color layer should not extend past foreground bounds
4822 mCapture->expectBGColor(129, 129);
4823 }
4824}
4825
4826// Verify for boundless layer with children, their transforms have an effect.
4827TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4828 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004829 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4830 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004831 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4832 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004833 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4834 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004835 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4836 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004837 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4838 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004839 ASSERT_TRUE(colorLayer->isValid());
4840 asTransaction([&](Transaction& t) {
4841 t.setPosition(boundlessLayerRightShift, 32, 0);
4842 t.show(boundlessLayerRightShift);
4843 t.setPosition(boundlessLayerDownShift, 0, 32);
4844 t.show(boundlessLayerDownShift);
4845 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4846 t.setColor(colorLayer, half3{0, 0, 0});
4847 t.show(colorLayer);
4848 });
4849 {
4850 mCapture = screenshot();
4851 // Top left of background must now be visible
4852 mCapture->expectBGColor(0, 0);
4853 // Top left of foreground must now be visible
4854 mCapture->expectFGColor(64, 64);
4855 // Foreground Surface bounds must be color layer
4856 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4857 // Color layer should not extend past foreground bounds
4858 mCapture->expectBGColor(129, 129);
4859 }
4860}
4861
4862// Verify child layers do not get clipped if they temporarily move into the negative
4863// coordinate space as the result of an intermediate transformation.
4864TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4865 sp<SurfaceControl> boundlessLayer =
4866 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4867 0 /* flags */, mFGSurfaceControl.get());
4868 ASSERT_TRUE(boundlessLayer != nullptr);
4869 ASSERT_TRUE(boundlessLayer->isValid());
4870 sp<SurfaceControl> colorLayer =
4871 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4872 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4873 ASSERT_TRUE(colorLayer != nullptr);
4874 ASSERT_TRUE(colorLayer->isValid());
4875 asTransaction([&](Transaction& t) {
4876 // shift child layer off bounds. If this layer was not boundless, we will
4877 // expect the child layer to be cropped.
4878 t.setPosition(boundlessLayer, 32, 32);
4879 t.show(boundlessLayer);
4880 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4881 // undo shift by parent
4882 t.setPosition(colorLayer, -32, -32);
4883 t.setColor(colorLayer, half3{0, 0, 0});
4884 t.show(colorLayer);
4885 });
4886 {
4887 mCapture = screenshot();
4888 // Top left of background must now be visible
4889 mCapture->expectBGColor(0, 0);
4890 // Foreground Surface bounds must be color layer
4891 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4892 // Color layer should not extend past foreground bounds
4893 mCapture->expectBGColor(129, 129);
4894 }
4895}
4896
4897// Verify for boundless root layers with children, their transforms have an effect.
4898TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004899 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4900 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004901 ASSERT_TRUE(rootBoundlessLayer->isValid());
4902 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004903 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4904 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4905
Vishnu Nair60356342018-11-13 13:00:45 -08004906 ASSERT_TRUE(colorLayer->isValid());
4907 asTransaction([&](Transaction& t) {
4908 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4909 t.setPosition(rootBoundlessLayer, 32, 32);
4910 t.show(rootBoundlessLayer);
4911 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4912 t.setColor(colorLayer, half3{0, 0, 0});
4913 t.show(colorLayer);
4914 t.hide(mFGSurfaceControl);
4915 });
4916 {
4917 mCapture = screenshot();
4918 // Top left of background must now be visible
4919 mCapture->expectBGColor(0, 0);
4920 // Top left of foreground must now be visible
4921 mCapture->expectBGColor(31, 31);
4922 // Foreground Surface bounds must be color layer
4923 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
4924 // Color layer should not extend past foreground bounds
4925 mCapture->expectBGColor(97, 97);
4926 }
4927}
Robert Carr503c7042017-09-27 15:06:08 -07004928
chaviwa76b2712017-09-20 12:02:26 -07004929class ScreenCaptureTest : public LayerUpdateTest {
4930protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004931 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07004932};
4933
4934TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
4935 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004936 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004937 mCapture->expectBGColor(0, 0);
4938 // Doesn't capture FG layer which is at 64, 64
4939 mCapture->expectBGColor(64, 64);
4940}
4941
4942TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
4943 auto fgHandle = mFGSurfaceControl->getHandle();
4944
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());
chaviwa76b2712017-09-20 12:02:26 -07004947 fillSurfaceRGBA8(child, 200, 200, 200);
4948
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004949 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07004950
4951 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004952 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004953 mCapture->expectFGColor(10, 10);
4954 mCapture->expectChildColor(0, 0);
4955}
4956
Robert Carr578038f2018-03-09 12:25:24 -08004957TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
4958 auto fgHandle = mFGSurfaceControl->getHandle();
4959
Vishnu Nair88a11f22018-11-28 18:30:57 -08004960 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4961 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08004962 fillSurfaceRGBA8(child, 200, 200, 200);
4963
4964 SurfaceComposerClient::Transaction().show(child).apply(true);
4965
4966 // Captures mFGSurfaceControl's child
4967 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
4968 mCapture->checkPixel(10, 10, 0, 0, 0);
4969 mCapture->expectChildColor(0, 0);
4970}
4971
chaviw50da5042018-04-09 13:49:37 -07004972TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004973 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4974 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07004975
4976 fillSurfaceRGBA8(child, 200, 200, 200);
4977
4978 SurfaceComposerClient::Transaction().show(child).apply(true);
4979
4980 auto childHandle = child->getHandle();
4981
4982 // Captures child
4983 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
4984 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
4985 // Area outside of child's bounds is transparent.
4986 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
4987}
4988
chaviw4b129c22018-04-09 16:19:43 -07004989TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
4990 auto fgHandle = mFGSurfaceControl->getHandle();
4991
Vishnu Nair88a11f22018-11-28 18:30:57 -08004992 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4993 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4994 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07004995 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07004996 fillSurfaceRGBA8(child, 200, 200, 200);
4997 fillSurfaceRGBA8(relative, 100, 100, 100);
4998
4999 SurfaceComposerClient::Transaction()
5000 .show(child)
5001 // Set relative layer above fg layer so should be shown above when computing all layers.
5002 .setRelativeLayer(relative, fgHandle, 1)
5003 .show(relative)
5004 .apply(true);
5005
5006 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5007 ScreenCapture::captureLayers(&mCapture, fgHandle);
5008 mCapture->expectFGColor(10, 10);
5009 mCapture->expectChildColor(0, 0);
5010}
5011
5012TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5013 auto fgHandle = mFGSurfaceControl->getHandle();
5014
Vishnu Nair88a11f22018-11-28 18:30:57 -08005015 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5016 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5017 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5018 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005019 fillSurfaceRGBA8(child, 200, 200, 200);
5020 fillSurfaceRGBA8(relative, 100, 100, 100);
5021
5022 SurfaceComposerClient::Transaction()
5023 .show(child)
5024 // Set relative layer below fg layer but relative to child layer so it should be shown
5025 // above child layer.
5026 .setLayer(relative, -1)
5027 .setRelativeLayer(relative, child->getHandle(), 1)
5028 .show(relative)
5029 .apply(true);
5030
5031 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5032 // relative value should be taken into account, placing it above child layer.
5033 ScreenCapture::captureLayers(&mCapture, fgHandle);
5034 mCapture->expectFGColor(10, 10);
5035 // Relative layer is showing on top of child layer
5036 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5037}
Robert Carr578038f2018-03-09 12:25:24 -08005038
5039// In the following tests we verify successful skipping of a parent layer,
5040// so we use the same verification logic and only change how we mutate
5041// the parent layer to verify that various properties are ignored.
5042class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5043public:
5044 void SetUp() override {
5045 LayerUpdateTest::SetUp();
5046
Vishnu Nair88a11f22018-11-28 18:30:57 -08005047 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5048 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005049 fillSurfaceRGBA8(mChild, 200, 200, 200);
5050
5051 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5052 }
5053
5054 void verify() {
5055 auto fgHandle = mFGSurfaceControl->getHandle();
5056 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5057 mCapture->checkPixel(10, 10, 0, 0, 0);
5058 mCapture->expectChildColor(0, 0);
5059 }
5060
5061 std::unique_ptr<ScreenCapture> mCapture;
5062 sp<SurfaceControl> mChild;
5063};
5064
5065TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5066
5067 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5068
5069 // Even though the parent is hidden we should still capture the child.
5070 verify();
5071}
5072
5073TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005074 SurfaceComposerClient::Transaction()
5075 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5076 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005077
5078 // Even though the parent is cropped out we should still capture the child.
5079 verify();
5080}
5081
5082TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
5083
5084 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2);
5085
5086 // We should not inherit the parent scaling.
5087 verify();
5088}
5089
Robert Carr15eae092018-03-23 13:43:53 -07005090TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) {
5091 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5092
5093 // Even though the parent is hidden we should still capture the child.
5094 verify();
5095
5096 // Verify everything was properly hidden when rendering the full-screen.
5097 screenshot()->expectBGColor(0,0);
5098}
5099
5100
chaviwa76b2712017-09-20 12:02:26 -07005101TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5102 auto fgHandle = mFGSurfaceControl->getHandle();
5103
Vishnu Nair88a11f22018-11-28 18:30:57 -08005104 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5105 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005106 fillSurfaceRGBA8(child, 200, 200, 200);
5107
Vishnu Nair88a11f22018-11-28 18:30:57 -08005108 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5109 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005110
5111 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5112 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005113 .show(child)
5114 .setPosition(grandchild, 5, 5)
5115 .show(grandchild)
5116 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005117
5118 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005119 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005120 mCapture->expectFGColor(10, 10);
5121 mCapture->expectChildColor(0, 0);
5122 mCapture->checkPixel(5, 5, 50, 50, 50);
5123}
5124
5125TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005126 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5127 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005128 fillSurfaceRGBA8(child, 200, 200, 200);
5129 auto childHandle = child->getHandle();
5130
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005131 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005132
5133 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005134 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005135 mCapture->expectChildColor(0, 0);
5136 mCapture->expectChildColor(9, 9);
5137}
5138
5139TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005140 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5141 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005142 fillSurfaceRGBA8(child, 200, 200, 200);
5143 auto childHandle = child->getHandle();
5144
Vishnu Nair88a11f22018-11-28 18:30:57 -08005145 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5146 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005147 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5148
5149 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005150 .show(child)
5151 .setPosition(grandchild, 5, 5)
5152 .show(grandchild)
5153 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005154
5155 auto grandchildHandle = grandchild->getHandle();
5156
5157 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005158 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005159 mCapture->checkPixel(0, 0, 50, 50, 50);
5160 mCapture->checkPixel(4, 4, 50, 50, 50);
5161}
5162
chaviw7206d492017-11-10 16:16:12 -08005163TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005164 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005165 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5166 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005167
Marissa Wall61c58622018-07-18 10:12:20 -07005168 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5169 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005170
5171 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005172 .setLayer(redLayer, INT32_MAX - 1)
5173 .show(redLayer)
5174 .show(blueLayer)
5175 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005176
5177 auto redLayerHandle = redLayer->getHandle();
5178
5179 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005180 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5181 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5182 // red area below the blue area
5183 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5184 // red area to the right of the blue area
5185 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005186
Marissa Wall861616d2018-10-22 12:52:23 -07005187 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005188 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005189 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5190 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005191 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005192 mCapture->checkPixel(30, 30, 0, 0, 0);
5193}
5194
5195TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005196 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005197 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5198 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005199
Marissa Wall61c58622018-07-18 10:12:20 -07005200 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5201 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005202
5203 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005204 .setLayer(redLayer, INT32_MAX - 1)
5205 .show(redLayer)
5206 .show(blueLayer)
5207 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005208
5209 auto redLayerHandle = redLayer->getHandle();
5210
5211 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005212 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5213 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5214 // red area below the blue area
5215 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5216 // red area to the right of the blue area
5217 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005218
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005219 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005220 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005221 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5222 // red area below the blue area
5223 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5224 // red area to the right of the blue area
5225 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005226 mCapture->checkPixel(30, 30, 0, 0, 0);
5227}
5228
5229TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005230 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005231
Marissa Wall61c58622018-07-18 10:12:20 -07005232 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005233
5234 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005235 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005236 SurfaceComposerClient::Transaction().apply(true);
5237
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005238 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005239
5240 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005241 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5242 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005243}
5244
chaviw8e3fe5d2018-02-22 10:55:42 -08005245
5246class DereferenceSurfaceControlTest : public LayerTransactionTest {
5247protected:
5248 void SetUp() override {
5249 LayerTransactionTest::SetUp();
5250 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005251 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005252 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005253 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005254 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5255 {
5256 SCOPED_TRACE("before anything");
5257 auto shot = screenshot();
5258 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5259 }
5260 }
5261 void TearDown() override {
5262 LayerTransactionTest::TearDown();
5263 bgLayer = 0;
5264 fgLayer = 0;
5265 }
5266
5267 sp<SurfaceControl> bgLayer;
5268 sp<SurfaceControl> fgLayer;
5269};
5270
5271TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5272 fgLayer = nullptr;
5273 {
5274 SCOPED_TRACE("after setting null");
5275 auto shot = screenshot();
5276 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5277 }
5278}
5279
5280TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5281 auto transaction = Transaction().show(fgLayer);
5282 fgLayer = nullptr;
5283 {
5284 SCOPED_TRACE("after setting null");
5285 auto shot = screenshot();
5286 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5287 }
5288}
5289
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005290} // namespace android