blob: 05a73dcd94f26dcedb8016d14a9f6b229412c4b8 [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
35#include <private/gui/ComposerService.h>
36
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070037#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070038#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070039#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070040#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070041
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070042#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070043#include <math/vec3.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044
Marissa Wall713b63f2018-10-17 15:42:43 -070045#include "BufferGenerator.h"
46
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070047namespace android {
48
Chia-I Wu718daf82017-10-20 11:57:17 -070049namespace {
50
51struct Color {
52 uint8_t r;
53 uint8_t g;
54 uint8_t b;
55 uint8_t a;
56
57 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070058 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070059 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070060 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070061 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070062 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070063};
64
65const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070066const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070067const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070068const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070069const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070070const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070073using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070074
Chia-I Wu718daf82017-10-20 11:57:17 -070075std::ostream& operator<<(std::ostream& os, const Color& color) {
76 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
77 return os;
78}
79
80// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070081void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
82 const Color& color) {
83 Rect r(0, 0, buffer.width, buffer.height);
84 if (!r.intersect(rect, &r)) {
85 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070086 }
87
Marissa Wall61c58622018-07-18 10:12:20 -070088 int32_t width = r.right - r.left;
89 int32_t height = r.bottom - r.top;
90
91 for (int32_t row = 0; row < height; row++) {
92 uint8_t* dst =
93 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
94 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070095 dst[0] = color.r;
96 dst[1] = color.g;
97 dst[2] = color.b;
98 dst[3] = color.a;
99 dst += 4;
100 }
101 }
102}
103
Marissa Wall61c58622018-07-18 10:12:20 -0700104// Fill a region with the specified color.
105void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
106 Rect r(0, 0, buffer->width, buffer->height);
107 if (!r.intersect(rect, &r)) {
108 return;
109 }
110
111 int32_t width = r.right - r.left;
112 int32_t height = r.bottom - r.top;
113
114 uint8_t* pixels;
115 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
116 reinterpret_cast<void**>(&pixels));
117
118 for (int32_t row = 0; row < height; row++) {
119 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
120 for (int32_t column = 0; column < width; column++) {
121 dst[0] = color.r;
122 dst[1] = color.g;
123 dst[2] = color.b;
124 dst[3] = color.a;
125 dst += 4;
126 }
127 }
128 buffer->unlock();
129}
130
Chia-I Wu718daf82017-10-20 11:57:17 -0700131// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000132void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700133 const Color& color, uint8_t tolerance) {
134 int32_t x = rect.left;
135 int32_t y = rect.top;
136 int32_t width = rect.right - rect.left;
137 int32_t height = rect.bottom - rect.top;
138
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000139 int32_t bufferWidth = int32_t(outBuffer->getWidth());
140 int32_t bufferHeight = int32_t(outBuffer->getHeight());
141 if (x + width > bufferWidth) {
142 x = std::min(x, bufferWidth);
143 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700144 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000145 if (y + height > bufferHeight) {
146 y = std::min(y, bufferHeight);
147 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
149
150 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
151 uint8_t tmp = a >= b ? a - b : b - a;
152 return tmp <= tolerance;
153 };
154 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000155 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700156 for (int32_t i = 0; i < width; i++) {
157 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
158 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
159 << "pixel @ (" << x + i << ", " << y + j << "): "
160 << "expected (" << color << "), "
161 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
162 src += 4;
163 }
164 }
165}
166
167} // anonymous namespace
168
Robert Carr4cdc58f2017-08-23 14:22:20 -0700169using Transaction = SurfaceComposerClient::Transaction;
170
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700171// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700172static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
173 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800174 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800176 ASSERT_TRUE(s != nullptr);
177 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700179 for (int y = 0; y < outBuffer.height; y++) {
180 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700181 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700182 pixel[0] = r;
183 pixel[1] = g;
184 pixel[2] = b;
185 pixel[3] = 255;
186 }
187 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700188 if (unlock) {
189 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
190 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700191}
192
193// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
194// individual pixel values for testing purposes.
195class ScreenCapture : public RefBase {
196public:
chaviw0e3479f2018-09-10 16:49:30 -0700197 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800198 const auto sf = ComposerService::getComposerService();
199 const auto token = sf->getInternalDisplayToken();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700200 SurfaceComposerClient::Transaction().apply(true);
201
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000202 sp<GraphicBuffer> outBuffer;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800203 ASSERT_EQ(NO_ERROR, sf->captureScreen(token, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700204 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000205 }
206
207 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
208 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
209 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
210 SurfaceComposerClient::Transaction().apply(true);
211
212 sp<GraphicBuffer> outBuffer;
213 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
214 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700215 }
216
Robert Carr578038f2018-03-09 12:25:24 -0800217 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
218 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
219 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
220 SurfaceComposerClient::Transaction().apply(true);
221
222 sp<GraphicBuffer> outBuffer;
223 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
224 *sc = std::make_unique<ScreenCapture>(outBuffer);
225 }
226
Chia-I Wu718daf82017-10-20 11:57:17 -0700227 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000228 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
229 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700230 }
231
232 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000233 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700234 const bool leftBorder = rect.left > 0;
235 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000236 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
237 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700238
239 if (topBorder) {
240 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
241 if (leftBorder) {
242 top.left -= 1;
243 }
244 if (rightBorder) {
245 top.right += 1;
246 }
247 expectColor(top, color, tolerance);
248 }
249 if (leftBorder) {
250 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
251 expectColor(left, color, tolerance);
252 }
253 if (rightBorder) {
254 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
255 expectColor(right, color, tolerance);
256 }
257 if (bottomBorder) {
258 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
259 if (leftBorder) {
260 bottom.left -= 1;
261 }
262 if (rightBorder) {
263 bottom.right += 1;
264 }
265 expectColor(bottom, color, tolerance);
266 }
267 }
268
Chia-I Wu93853fe2017-11-02 08:30:27 -0700269 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
270 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
271 uint8_t tolerance = 0) {
272 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
273
274 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
275 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
276 // avoid checking borders due to unspecified filtering behavior
277 const int32_t offsetX = filtered ? 2 : 0;
278 const int32_t offsetY = filtered ? 2 : 0;
279 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
280 tolerance);
281 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
282 tolerance);
283 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
284 tolerance);
285 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
286 bottomRight, tolerance);
287 }
288
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700289 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000290 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
291 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700292 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
293 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700294 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
295 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700296 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700297 }
298 }
299
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700300 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700301
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700302 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700303
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700304 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700305
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800306 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000307 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700308 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700309
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000310 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700311
312private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000313 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800314 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700315};
316
Chia-I Wu718daf82017-10-20 11:57:17 -0700317class LayerTransactionTest : public ::testing::Test {
318protected:
319 void SetUp() override {
320 mClient = new SurfaceComposerClient;
321 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
322
323 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700324
325 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700326 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700327 }
328
chaviw0e3479f2018-09-10 16:49:30 -0700329 virtual void TearDown() {
330 mBlackBgSurface = 0;
331 mClient->dispose();
332 mClient = 0;
333 }
334
Marissa Wallfda30bb2018-10-12 11:34:28 -0700335 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
336 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800337 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
338 auto layer =
339 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700340
Vishnu Nair60356342018-11-13 13:00:45 -0800341 Transaction t;
342 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800343
344 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700345 if (error != NO_ERROR) {
346 ADD_FAILURE() << "failed to initialize SurfaceControl";
347 layer.clear();
348 }
349
350 return layer;
351 }
352
Vishnu Nair88a11f22018-11-28 18:30:57 -0800353 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
354 const char* name, uint32_t width, uint32_t height,
355 PixelFormat format, uint32_t flags,
356 SurfaceControl* parent = nullptr) {
357 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
358 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
359 return layer;
360 }
361
Marissa Wallfda30bb2018-10-12 11:34:28 -0700362 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800363 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
364 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700365 }
366
Marissa Wall61c58622018-07-18 10:12:20 -0700367 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700368 // wait for previous transactions (such as setSize) to complete
369 Transaction().apply(true);
370
371 ANativeWindow_Buffer buffer = {};
372 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
373
374 return buffer;
375 }
376
Marissa Wall61c58622018-07-18 10:12:20 -0700377 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700378 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
379
380 // wait for the newly posted buffer to be latched
381 waitForLayerBuffers();
382 }
383
Marissa Wall61c58622018-07-18 10:12:20 -0700384 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
385 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700386 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700387 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
388 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
389 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700390 }
391
Marissa Wall61c58622018-07-18 10:12:20 -0700392 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
393 int32_t bufferWidth, int32_t bufferHeight) {
394 sp<GraphicBuffer> buffer =
395 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
396 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
397 BufferUsage::COMPOSER_OVERLAY,
398 "test");
399 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700400 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700401 }
402
403 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
404 int32_t bufferWidth, int32_t bufferHeight) {
405 switch (mLayerType) {
406 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
407 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
408 break;
409 case ISurfaceComposerClient::eFXSurfaceBufferState:
410 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
411 break;
412 default:
413 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
414 }
415 }
416
417 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
418 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700419 const Color& topRight, const Color& bottomLeft,
420 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700421 switch (mLayerType) {
422 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
423 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
424 bottomLeft, bottomRight);
425 break;
426 case ISurfaceComposerClient::eFXSurfaceBufferState:
427 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
428 bottomLeft, bottomRight);
429 break;
430 default:
431 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
432 }
433 }
434
435 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
436 int32_t bufferHeight, const Color& topLeft,
437 const Color& topRight, const Color& bottomLeft,
438 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700439 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700440 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
441 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700442
Marissa Wall61c58622018-07-18 10:12:20 -0700443 const int32_t halfW = bufferWidth / 2;
444 const int32_t halfH = bufferHeight / 2;
445 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
446 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
447 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
448 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
449 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700450
Marissa Wall61c58622018-07-18 10:12:20 -0700451 postBufferQueueLayerBuffer(layer);
452 }
453
454 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
455 int32_t bufferHeight, const Color& topLeft,
456 const Color& topRight, const Color& bottomLeft,
457 const Color& bottomRight) {
458 sp<GraphicBuffer> buffer =
459 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
460 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
461 BufferUsage::COMPOSER_OVERLAY,
462 "test");
463
464 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
465
466 const int32_t halfW = bufferWidth / 2;
467 const int32_t halfH = bufferHeight / 2;
468 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
469 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
470 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
471 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
472
473 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700474 }
475
chaviw0e3479f2018-09-10 16:49:30 -0700476 std::unique_ptr<ScreenCapture> screenshot() {
477 std::unique_ptr<ScreenCapture> screenshot;
478 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700479 return screenshot;
480 }
481
Marissa Wall713b63f2018-10-17 15:42:43 -0700482 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
483 static BufferGenerator bufferGenerator;
484 return bufferGenerator.get(outBuffer, outFence);
485 }
486
Chia-I Wu718daf82017-10-20 11:57:17 -0700487 sp<SurfaceComposerClient> mClient;
488
489 sp<IBinder> mDisplay;
490 uint32_t mDisplayWidth;
491 uint32_t mDisplayHeight;
492 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700493 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700494
495 // leave room for ~256 layers
496 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
497
chaviw0e3479f2018-09-10 16:49:30 -0700498 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700499 bool mColorManagementUsed;
500
Chia-I Wu718daf82017-10-20 11:57:17 -0700501private:
502 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800503 mDisplay = mClient->getInternalDisplayToken();
504 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700505
506 // get display width/height
507 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800508 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700509 mDisplayWidth = info.w;
510 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700511 mDisplayRect =
512 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700513
514 // After a new buffer is queued, SurfaceFlinger is notified and will
515 // latch the new buffer on next vsync. Let's heuristically wait for 3
516 // vsyncs.
517 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
518
519 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700520
Vishnu Nair88a11f22018-11-28 18:30:57 -0800521 mBlackBgSurface =
522 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
523 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700524
Chia-I Wu718daf82017-10-20 11:57:17 -0700525 // set layer stack (b/68888219)
526 Transaction t;
527 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800528 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700529 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
530 t.setColor(mBlackBgSurface, half3{0, 0, 0});
531 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700532 t.apply();
533 }
534
chaviw0e3479f2018-09-10 16:49:30 -0700535 void waitForLayerBuffers() {
536 // Request an empty transaction to get applied synchronously to ensure the buffer is
537 // latched.
538 Transaction().apply(true);
539 usleep(mBufferPostDelay);
540 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700541
542 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800543
544 friend class LayerRenderPathTestHarness;
545};
546enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
547
548class LayerRenderPathTestHarness {
549public:
550 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
551 : mDelegate(delegate), mRenderPath(renderPath) {}
552
553 std::unique_ptr<ScreenCapture> getScreenCapture() {
554 switch (mRenderPath) {
555 case RenderPath::SCREENSHOT:
556 return mDelegate->screenshot();
557 case RenderPath::VIRTUAL_DISPLAY:
558
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800559 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800560 DisplayInfo mainDisplayInfo;
561 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
562
563 sp<IBinder> vDisplay;
564 sp<IGraphicBufferProducer> producer;
565 sp<IGraphicBufferConsumer> consumer;
566 sp<BufferItemConsumer> itemConsumer;
567 BufferQueue::createBufferQueue(&producer, &consumer);
568
569 consumer->setConsumerName(String8("Virtual disp consumer"));
570 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
571
572 itemConsumer = new BufferItemConsumer(consumer,
573 // Sample usage bits from screenrecord
574 GRALLOC_USAGE_HW_VIDEO_ENCODER |
575 GRALLOC_USAGE_SW_READ_OFTEN);
576
577 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
578 false /*secure*/);
579
580 SurfaceComposerClient::Transaction t;
581 t.setDisplaySurface(vDisplay, producer);
582 t.setDisplayLayerStack(vDisplay, 0);
583 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
584 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
585 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
586 t.apply();
587 SurfaceComposerClient::Transaction().apply(true);
588 BufferItem item;
589 itemConsumer->acquireBuffer(&item, 0, true);
590 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
591 itemConsumer->releaseBuffer(item);
592 SurfaceComposerClient::destroyDisplay(vDisplay);
593 return sc;
594 }
595 }
596
597protected:
598 LayerTransactionTest* mDelegate;
599 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700600};
601
Alec Mouri80863a62019-01-17 15:19:35 -0800602class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700603public:
Alec Mouri80863a62019-01-17 15:19:35 -0800604 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700605
606 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800607 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700608 // if the flags already have a layer type specified, return an error
609 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
610 return nullptr;
611 }
chaviwf66724d2018-11-28 16:35:21 -0800612 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700613 }
614
615 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
616 int32_t bufferHeight) {
617 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
618 bufferWidth, bufferHeight));
619 }
620
621 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
622 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
623 const Color& bottomLeft, const Color& bottomRight) {
624 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
625 bufferWidth, bufferHeight,
626 topLeft, topRight,
627 bottomLeft, bottomRight));
628 }
629
630protected:
631 uint32_t mLayerType;
632};
633
Alec Mouri80863a62019-01-17 15:19:35 -0800634class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
635 public ::testing::WithParamInterface<uint32_t> {
636public:
637 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
638};
639
640class LayerTypeAndRenderTypeTransactionTest
641 : public LayerTypeTransactionHarness,
642 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
643public:
644 LayerTypeAndRenderTypeTransactionTest()
645 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
646 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
647
648 std::unique_ptr<ScreenCapture> getScreenCapture() {
649 return mRenderPathHarness.getScreenCapture();
650 }
651
652protected:
653 LayerRenderPathTestHarness mRenderPathHarness;
654};
655
656// Environment for starting up binder threads. This is required for testing
657// virtual displays, as BufferQueue parameters may be queried over binder.
658class BinderEnvironment : public ::testing::Environment {
659public:
660 void SetUp() override { ProcessState::self()->startThreadPool(); }
661};
662
663::testing::Environment* const binderEnv =
664 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
665
666class LayerRenderTypeTransactionTest : public LayerTransactionTest,
667 public ::testing::WithParamInterface<RenderPath> {
668public:
669 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
670
671 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
672 void setRelativeZBasicHelper(uint32_t layerType);
673 void setRelativeZGroupHelper(uint32_t layerType);
674 void setAlphaBasicHelper(uint32_t layerType);
675
676protected:
677 LayerRenderPathTestHarness mHarness;
678};
679
680INSTANTIATE_TEST_CASE_P(
681 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
682 ::testing::Combine(
683 ::testing::Values(
684 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
685 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
686 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
687
688INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
689 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
690
Marissa Wall61c58622018-07-18 10:12:20 -0700691INSTANTIATE_TEST_CASE_P(
692 LayerTypeTransactionTests, LayerTypeTransactionTest,
693 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
694 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
695
Alec Mouri80863a62019-01-17 15:19:35 -0800696TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700697 sp<SurfaceControl> layer;
698 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700699 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700700
701 {
702 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700703 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800704 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700705 shot->expectColor(rect, Color::RED);
706 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700707 }
708
709 Transaction().setPosition(layer, 5, 10).apply();
710 {
711 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700712 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800713 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700714 shot->expectColor(rect, Color::RED);
715 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700716 }
717}
718
Alec Mouri80863a62019-01-17 15:19:35 -0800719TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700720 sp<SurfaceControl> layer;
721 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700722 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700723
724 // GLES requires only 4 bits of subpixel precision during rasterization
725 // XXX GLES composition does not match HWC composition due to precision
726 // loss (b/69315223)
727 const float epsilon = 1.0f / 16.0f;
728 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
729 {
730 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800731 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700732 }
733
734 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
735 {
736 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800737 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700738 }
739}
740
Alec Mouri80863a62019-01-17 15:19:35 -0800741TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700742 sp<SurfaceControl> layer;
743 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700744 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700745
746 Transaction().setPosition(layer, -32, -32).apply();
747 {
748 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800749 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700750 }
751
752 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
753 {
754 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800755 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700756 }
757}
758
Alec Mouri80863a62019-01-17 15:19:35 -0800759TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700760 sp<SurfaceControl> layer;
761 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700762 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700763
764 // partially out of bounds
765 Transaction().setPosition(layer, -30, -30).apply();
766 {
767 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800768 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700769 }
770
771 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
772 {
773 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800774 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
775 mDisplayHeight),
776 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700777 }
778}
779
Alec Mouri80863a62019-01-17 15:19:35 -0800780TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700781 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700782 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
783 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700784
785 // setPosition is applied immediately by default, with or without resize
786 // pending
787 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
788 {
789 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800790 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700791 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700792 shot->expectColor(rect, Color::RED);
793 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700794 }
795
Marissa Wall861616d2018-10-22 12:52:23 -0700796 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700797 {
798 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800799 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700800 }
801}
802
Alec Mouri80863a62019-01-17 15:19:35 -0800803TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700804 sp<SurfaceControl> layer;
805 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700806 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700807
808 // request setPosition to be applied with the next resize
809 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
810 {
811 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800812 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700813 }
814
815 Transaction().setPosition(layer, 15, 20).apply();
816 {
817 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800818 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700819 }
820
821 Transaction().setSize(layer, 64, 64).apply();
822 {
823 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800824 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700825 }
826
827 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700828 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700829 {
830 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800831 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700832 }
833}
834
Alec Mouri80863a62019-01-17 15:19:35 -0800835TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700836 sp<SurfaceControl> layer;
837 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700838 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700839
840 // setPosition is not immediate even with SCALE_TO_WINDOW override
841 Transaction()
842 .setPosition(layer, 5, 10)
843 .setSize(layer, 64, 64)
844 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
845 .setGeometryAppliesWithResize(layer)
846 .apply();
847 {
848 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800849 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700850 }
851
Marissa Wall61c58622018-07-18 10:12:20 -0700852 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700853 {
854 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800855 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700856 }
857}
858
Alec Mouri80863a62019-01-17 15:19:35 -0800859TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700860 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700861 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
862 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700863
864 Transaction().setSize(layer, 64, 64).apply();
865 {
866 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800867 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700868 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700869 shot->expectColor(rect, Color::RED);
870 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700871 }
872
Marissa Wall861616d2018-10-22 12:52:23 -0700873 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700874 {
875 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800876 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700877 const Rect rect(0, 0, 64, 64);
878 shot->expectColor(rect, Color::RED);
879 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700880 }
881}
882
Alec Mouri80863a62019-01-17 15:19:35 -0800883TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700884 // cannot test robustness against invalid sizes (zero or really huge)
885}
886
Alec Mouri80863a62019-01-17 15:19:35 -0800887TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700888 sp<SurfaceControl> layer;
889 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700890 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700891
892 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
893 Transaction()
894 .setSize(layer, 64, 64)
895 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
896 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800897 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700898}
899
Alec Mouri80863a62019-01-17 15:19:35 -0800900TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700901 sp<SurfaceControl> layerR;
902 sp<SurfaceControl> layerG;
903 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700904 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700905 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700906 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700907
908 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
909 {
910 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800911 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700912 }
913
914 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
915 {
916 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800917 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700918 }
919}
920
Alec Mouri80863a62019-01-17 15:19:35 -0800921TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700922 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800923 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700924 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800925 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700926 sp<SurfaceControl> layerR;
927 sp<SurfaceControl> layerG;
928 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700929 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700930 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700931 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700932
chaviw0e3479f2018-09-10 16:49:30 -0700933 Transaction()
934 .reparent(layerR, parent->getHandle())
935 .reparent(layerG, parent->getHandle())
936 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700937 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
938 {
939 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800940 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700941 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700942 }
943
944 Transaction().setLayer(layerR, -3).apply();
945 {
946 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800947 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700948 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700949 }
950}
951
Alec Mouri80863a62019-01-17 15:19:35 -0800952void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700953 sp<SurfaceControl> layerR;
954 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700955 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
956 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
957 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
958 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700959
Marissa Wall861616d2018-10-22 12:52:23 -0700960 switch (layerType) {
961 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
962 Transaction()
963 .setPosition(layerG, 16, 16)
964 .setRelativeLayer(layerG, layerR->getHandle(), 1)
965 .apply();
966 break;
967 case ISurfaceComposerClient::eFXSurfaceBufferState:
968 Transaction()
969 .setFrame(layerR, Rect(0, 0, 32, 32))
970 .setFrame(layerG, Rect(16, 16, 48, 48))
971 .setRelativeLayer(layerG, layerR->getHandle(), 1)
972 .apply();
973 break;
974 default:
975 ASSERT_FALSE(true) << "Unsupported layer type";
976 }
Chia-I Wu49313302017-10-31 10:14:40 -0700977 {
978 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800979 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700980 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
981 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
982 }
983
984 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
985 {
986 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800987 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700988 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
989 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
990 }
991}
992
Alec Mouri80863a62019-01-17 15:19:35 -0800993TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700994 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
995}
996
Alec Mouri80863a62019-01-17 15:19:35 -0800997TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -0700998 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
999}
1000
Marissa Wall61c58622018-07-18 10:12:20 -07001001TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001002 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001003 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001004 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001005 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001006 sp<SurfaceControl> layerR;
1007 sp<SurfaceControl> layerG;
1008 sp<SurfaceControl> layerB;
1009 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001010 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001011 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001012 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001013 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001014 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001015
chaviw0e3479f2018-09-10 16:49:30 -07001016 Transaction()
1017 .reparent(layerB, parent->getHandle())
1018 .apply();
1019
Chia-I Wuec2d9852017-11-21 09:21:01 -08001020 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1021 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1022
chaviw0e3479f2018-09-10 16:49:30 -07001023 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001024 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001025 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001026 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001027 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1028}
1029
Alec Mouri80863a62019-01-17 15:19:35 -08001030void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001031 sp<SurfaceControl> layerR;
1032 sp<SurfaceControl> layerG;
1033 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001034 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1035 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1036 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1037 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1038 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1039 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001040
1041 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001042 switch (layerType) {
1043 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1044 Transaction()
1045 .setPosition(layerG, 8, 8)
1046 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1047 .setPosition(layerB, 16, 16)
1048 .setLayer(layerB, mLayerZBase + 2)
1049 .apply();
1050 break;
1051 case ISurfaceComposerClient::eFXSurfaceBufferState:
1052 Transaction()
1053 .setFrame(layerR, Rect(0, 0, 32, 32))
1054 .setFrame(layerG, Rect(8, 8, 40, 40))
1055 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1056 .setFrame(layerB, Rect(16, 16, 48, 48))
1057 .setLayer(layerB, mLayerZBase + 2)
1058 .apply();
1059 break;
1060 default:
1061 ASSERT_FALSE(true) << "Unsupported layer type";
1062 }
1063
Chia-I Wu49313302017-10-31 10:14:40 -07001064 {
1065 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001066 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001067 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1068 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1069 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1070 }
1071
1072 // layerR = 4, layerG = layerR + 3, layerB = 2
1073 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1074 {
1075 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001076 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001077 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1078 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1079 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1080 }
1081
1082 // layerR = 4, layerG = layerR - 3, layerB = 2
1083 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1084 {
1085 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001086 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001087 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1088 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1089 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1090 }
1091
1092 // restore to absolute z
1093 // layerR = 4, layerG = 0, layerB = 2
1094 Transaction().setLayer(layerG, mLayerZBase).apply();
1095 {
1096 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001097 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001098 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1099 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1100 }
1101
1102 // layerR should not affect layerG anymore
1103 // layerR = 1, layerG = 0, layerB = 2
1104 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1105 {
1106 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001107 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001108 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1109 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1110 }
1111}
1112
Alec Mouri80863a62019-01-17 15:19:35 -08001113TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001114 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1115}
1116
Alec Mouri80863a62019-01-17 15:19:35 -08001117TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001118 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1119}
1120
Alec Mouri80863a62019-01-17 15:19:35 -08001121TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001122 sp<SurfaceControl> layerR;
1123 sp<SurfaceControl> layerG;
1124
1125 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001126 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001127 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001128 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001129
1130 Transaction()
1131 .setPosition(layerG, 16, 16)
1132 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1133 .apply();
1134
Robert Carr6fb1a7e2018-12-11 12:07:25 -08001135 layerG->clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001136 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001137 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001138}
1139
Alec Mouri80863a62019-01-17 15:19:35 -08001140TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001141 sp<SurfaceControl> layer;
1142 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001143 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001144
1145 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1146 {
1147 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001148 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001149 }
1150
1151 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1152 {
1153 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001154 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001155 }
1156}
1157
Alec Mouri80863a62019-01-17 15:19:35 -08001158TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001159 const Color translucentRed = {100, 0, 0, 100};
1160 sp<SurfaceControl> layerR;
1161 sp<SurfaceControl> layerG;
1162 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001163 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001164 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001165 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001166
1167 Transaction()
1168 .setLayer(layerR, mLayerZBase + 1)
1169 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1170 .apply();
1171 {
1172 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001173 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001174 }
1175
1176 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1177 {
1178 SCOPED_TRACE("layerR translucent");
1179 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001180 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001181 }
1182}
1183
Marissa Wall61c58622018-07-18 10:12:20 -07001184TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001185 sp<SurfaceControl> layer;
1186 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001187 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001188
1189 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001190 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001191 Transaction()
1192 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1193 .apply(true);
1194 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001195 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001196
1197 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1198 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001199 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001200}
1201
Alec Mouri80863a62019-01-17 15:19:35 -08001202TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001203 const Rect top(0, 0, 32, 16);
1204 const Rect bottom(0, 16, 32, 32);
1205 sp<SurfaceControl> layer;
1206 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1207
1208 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001209 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1210 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1211 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001212 // setTransparentRegionHint always applies to the following buffer
1213 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001214 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001215 {
1216 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001217 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001218 shot->expectColor(top, Color::BLACK);
1219 shot->expectColor(bottom, Color::RED);
1220 }
1221
1222 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1223 {
1224 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001225 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001226 shot->expectColor(top, Color::BLACK);
1227 shot->expectColor(bottom, Color::RED);
1228 }
1229
Marissa Wall61c58622018-07-18 10:12:20 -07001230 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1231 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1232 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1233 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001234 {
1235 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001236 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001237 shot->expectColor(top, Color::RED);
1238 shot->expectColor(bottom, Color::BLACK);
1239 }
1240}
1241
Alec Mouri80863a62019-01-17 15:19:35 -08001242TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001243 const Rect top(0, 0, 32, 16);
1244 const Rect bottom(0, 16, 32, 32);
1245 sp<SurfaceControl> layer;
1246 ASSERT_NO_FATAL_FAILURE(
1247 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1248
1249 sp<GraphicBuffer> buffer =
1250 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1251 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1252 BufferUsage::COMPOSER_OVERLAY,
1253 "test");
1254
1255 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1256 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1257 Transaction()
1258 .setTransparentRegionHint(layer, Region(top))
1259 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001260 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001261 .apply();
1262 {
1263 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001264 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001265 shot->expectColor(top, Color::BLACK);
1266 shot->expectColor(bottom, Color::RED);
1267 }
1268
1269 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1270 {
1271 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001272 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001273 shot->expectColor(top, Color::BLACK);
1274 shot->expectColor(bottom, Color::BLACK);
1275 }
1276
1277 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1278 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1279 BufferUsage::COMPOSER_OVERLAY,
1280 "test");
1281
1282 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1283 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001284 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001285 {
1286 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001287 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001288 shot->expectColor(top, Color::RED);
1289 shot->expectColor(bottom, Color::BLACK);
1290 }
1291}
1292
Alec Mouri80863a62019-01-17 15:19:35 -08001293TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001294 sp<SurfaceControl> layerTransparent;
1295 sp<SurfaceControl> layerR;
1296 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1297 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1298
1299 // check that transparent region hint is bound by the layer size
1300 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001301 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001302 .setPosition(layerR, 16, 16)
1303 .setLayer(layerR, mLayerZBase + 1)
1304 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001305 ASSERT_NO_FATAL_FAILURE(
1306 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1307 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001308 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001309}
1310
Alec Mouri80863a62019-01-17 15:19:35 -08001311TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001312 sp<SurfaceControl> layerTransparent;
1313 sp<SurfaceControl> layerR;
1314 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1315 ASSERT_NO_FATAL_FAILURE(
1316 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1317
1318 // check that transparent region hint is bound by the layer size
1319 Transaction()
1320 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1321 .setFrame(layerR, Rect(16, 16, 48, 48))
1322 .setLayer(layerR, mLayerZBase + 1)
1323 .apply();
1324 ASSERT_NO_FATAL_FAILURE(
1325 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1326 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001327 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001328}
1329
Valerie Haua72e2812019-01-23 13:40:39 -08001330TEST_P(LayerRenderTypeTransactionTest, SetColorAlpha_Color_NoEffect) {
1331 sp<SurfaceControl> layer;
1332 ASSERT_NO_FATAL_FAILURE(
1333 layer = createLayer("test", 0, 0, ISurfaceComposerClient::eFXSurfaceColor));
1334
1335 half3 color;
1336 color.r = 1.0f;
1337 color.g = 0.0f;
1338 color.b = 0.0f;
1339 Transaction()
1340 .setCrop_legacy(layer, Rect(0, 0, 32, 32))
1341 .setAlpha(layer, 1.0f)
1342 .setColor(layer, color)
1343 .setColorAlpha(layer, 0.5f)
1344 .apply();
1345
1346 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
1347}
1348
1349TEST_P(LayerRenderTypeTransactionTest, SetColorAlpha_BufferQueue_NoEffect) {
1350 sp<SurfaceControl> layer;
1351 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1352 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1353
1354 Transaction().setAlpha(layer, 1.0f).setColorAlpha(layer, 0.5f).apply();
1355
1356 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
1357}
1358
1359TEST_P(LayerRenderTypeTransactionTest, SetColorAlpha_BufferState_ColorLayer) {
1360 sp<SurfaceControl> bgLayer;
1361 sp<SurfaceControl> layer;
1362 ASSERT_NO_FATAL_FAILURE(bgLayer = createLayer("test bg", 32, 32));
1363 ASSERT_NO_FATAL_FAILURE(
1364 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1365
1366 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bgLayer, Color::RED, 32, 32));
1367
1368 // create color layer
1369 half3 color;
1370 color.r = 0.0f;
1371 color.g = 1.0f;
1372 color.b = 0.0f;
1373 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).setColor(layer, color).apply();
1374
1375 {
1376 SCOPED_TRACE("before alpha");
1377 auto shot = screenshot();
1378 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
1379 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1380 }
1381
1382 // apply alpha
1383 Transaction().setAlpha(layer, 0.0f).apply();
1384 {
1385 SCOPED_TRACE("set alpha");
1386 auto shot = screenshot();
1387 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1388 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1389 }
1390}
1391
1392TEST_P(LayerRenderTypeTransactionTest, SetColorAlpha_BufferState_NoColorLayer) {
1393 sp<SurfaceControl> bgLayer;
1394 sp<SurfaceControl> layer;
1395 ASSERT_NO_FATAL_FAILURE(bgLayer = createLayer("test bg", 32, 32));
1396 ASSERT_NO_FATAL_FAILURE(
1397 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1398
1399 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bgLayer, Color::RED, 32, 32));
1400
1401 {
1402 SCOPED_TRACE("before alpha");
1403 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
1404 }
1405
1406 // setting alpha without creating color layer should have no effect
1407 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).setAlpha(layer, 0.5f).apply();
1408 {
1409 SCOPED_TRACE("alpha");
1410 auto shot = screenshot();
1411 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1412 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1413 }
1414}
1415
Alec Mouri80863a62019-01-17 15:19:35 -08001416void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001417 sp<SurfaceControl> layer1;
1418 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001419 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1420 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1421 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1422 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001423
Marissa Wall861616d2018-10-22 12:52:23 -07001424 switch (layerType) {
1425 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1426 Transaction()
1427 .setAlpha(layer1, 0.25f)
1428 .setAlpha(layer2, 0.75f)
1429 .setPosition(layer2, 16, 0)
1430 .setLayer(layer2, mLayerZBase + 1)
1431 .apply();
1432 break;
1433 case ISurfaceComposerClient::eFXSurfaceBufferState:
1434 Transaction()
1435 .setAlpha(layer1, 0.25f)
1436 .setAlpha(layer2, 0.75f)
1437 .setFrame(layer1, Rect(0, 0, 32, 32))
1438 .setFrame(layer2, Rect(16, 0, 48, 32))
1439 .setLayer(layer2, mLayerZBase + 1)
1440 .apply();
1441 break;
1442 default:
1443 ASSERT_FALSE(true) << "Unsupported layer type";
1444 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001445 {
Alec Mouri80863a62019-01-17 15:19:35 -08001446 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001447 uint8_t r = 16; // 64 * 0.25f
1448 uint8_t g = 48; // 64 * 0.75f
1449 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1450 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1451
1452 r /= 4; // r * (1.0f - 0.75f)
1453 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1454 }
1455}
1456
Alec Mouri80863a62019-01-17 15:19:35 -08001457TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001458 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1459}
1460
Alec Mouri80863a62019-01-17 15:19:35 -08001461TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001462 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1463}
1464
Alec Mouri80863a62019-01-17 15:19:35 -08001465TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001466 const Color color = {64, 0, 0, 255};
1467 sp<SurfaceControl> layer;
1468 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001469 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001470
1471 Transaction().setAlpha(layer, 2.0f).apply();
1472 {
1473 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001474 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001475 }
1476
1477 Transaction().setAlpha(layer, -1.0f).apply();
1478 {
1479 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001480 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001481 }
1482}
1483
Alec Mouri80863a62019-01-17 15:19:35 -08001484TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001485 sp<SurfaceControl> layer;
1486 const uint8_t size = 64;
1487 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001488 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001489 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1490 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1491
1492 Transaction()
1493 .setCornerRadius(layer, cornerRadius)
1494 .apply();
1495 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001496 const uint8_t bottom = size - 1;
1497 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001498 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001499 // Transparent corners
1500 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001501 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1502 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1503 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1504 }
1505}
1506
Alec Mouri80863a62019-01-17 15:19:35 -08001507TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001508 sp<SurfaceControl> parent;
1509 sp<SurfaceControl> child;
1510 const uint8_t size = 64;
1511 const uint8_t testArea = 4;
1512 const float cornerRadius = 20.0f;
1513 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1514 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1515 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1516 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1517
1518 Transaction()
1519 .setCornerRadius(parent, cornerRadius)
1520 .reparent(child, parent->getHandle())
1521 .setPosition(child, 0, size / 2)
1522 .apply();
1523 {
1524 const uint8_t bottom = size - 1;
1525 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001526 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001527 // Top edge of child should not have rounded corners because it's translated in the parent
1528 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1529 Color::GREEN);
1530 // But bottom edges should have been clipped according to parent bounds
1531 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1532 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001533 }
1534}
1535
Alec Mouri80863a62019-01-17 15:19:35 -08001536TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001537 sp<SurfaceControl> bufferLayer;
1538 sp<SurfaceControl> colorLayer;
1539 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001540 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001541 ASSERT_NO_FATAL_FAILURE(colorLayer =
1542 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1543 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001544
Vishnu Nair88a11f22018-11-28 18:30:57 -08001545 Transaction()
1546 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1547 .setLayer(colorLayer, mLayerZBase + 1)
1548 .apply();
1549
Chia-I Wue4ef6102017-11-01 15:16:35 -07001550 {
1551 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001552 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001553 }
1554
1555 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1556 const Color expected = {15, 51, 85, 255};
1557 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1558 // channel) should be less than one
1559 const uint8_t tolerance = 1;
1560 Transaction().setColor(colorLayer, color).apply();
1561 {
1562 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001563 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001564 }
1565}
1566
Valerie Haua72e2812019-01-23 13:40:39 -08001567TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferState_NoPriorColor) {
1568 sp<SurfaceControl> bufferQueueLayer;
1569 sp<SurfaceControl> bufferStateLayer;
1570 ASSERT_NO_FATAL_FAILURE(bufferQueueLayer = createLayer("test bg", 32, 32));
1571 ASSERT_NO_FATAL_FAILURE(
1572 bufferStateLayer =
1573 createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1574
1575 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferQueueLayer, Color::RED, 32, 32));
1576
1577 {
1578 SCOPED_TRACE("default color");
1579 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
1580 }
1581
1582 half3 color;
1583 color.r = 0.0f;
1584 color.g = 1.0f;
1585 color.b = 0.0f;
1586 Transaction()
1587 .setFrame(bufferStateLayer, Rect(0, 0, 32, 32))
1588 .setLayer(bufferStateLayer, mLayerZBase + 1)
1589 .setColor(bufferStateLayer, color)
1590 .apply();
1591
1592 {
1593 SCOPED_TRACE("set color");
1594 auto shot = screenshot();
1595 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
1596 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1597 }
1598}
1599
1600TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferState_PriorColor) {
1601 sp<SurfaceControl> bufferQueueLayer;
1602 sp<SurfaceControl> bufferStateLayer;
1603 ASSERT_NO_FATAL_FAILURE(bufferQueueLayer = createLayer("test bg", 32, 32));
1604 ASSERT_NO_FATAL_FAILURE(
1605 bufferStateLayer =
1606 createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1607
1608 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferQueueLayer, Color::RED, 32, 32));
1609
1610 half3 color;
1611 color.r = 0.0f;
1612 color.g = 1.0f;
1613 color.b = 0.0f;
1614 Transaction()
1615 .setFrame(bufferStateLayer, Rect(0, 0, 32, 32))
1616 .setLayer(bufferStateLayer, mLayerZBase + 1)
1617 .setColor(bufferStateLayer, color)
1618 .apply();
1619 {
1620 SCOPED_TRACE("default color");
1621 auto shot = screenshot();
1622 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
1623 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1624 }
1625
1626 color.r = 0.0f;
1627 color.g = 0.0f;
1628 color.b = 1.0f;
1629 Transaction().setColor(bufferStateLayer, color).apply();
1630 {
1631 SCOPED_TRACE("new color");
1632 auto shot = screenshot();
1633 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1634 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1635 }
1636}
1637
Alec Mouri80863a62019-01-17 15:19:35 -08001638TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001639 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001640 ASSERT_NO_FATAL_FAILURE(colorLayer =
1641 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1642 ISurfaceComposerClient::eFXSurfaceColor));
1643 Transaction()
1644 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1645 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1646 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001647
Alec Mouri80863a62019-01-17 15:19:35 -08001648 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001649}
1650
Alec Mouri80863a62019-01-17 15:19:35 -08001651TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001652 sp<SurfaceControl> bufferLayer;
1653 sp<SurfaceControl> colorLayer;
1654 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001655 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001656 ASSERT_NO_FATAL_FAILURE(colorLayer =
1657 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1658 ISurfaceComposerClient::eFXSurfaceColor));
1659 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001660
1661 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1662 const float alpha = 0.25f;
1663 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1664 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1665 // channel) should be less than one
1666 const uint8_t tolerance = 1;
1667 Transaction()
1668 .setColor(colorLayer, color)
1669 .setAlpha(colorLayer, alpha)
1670 .setLayer(colorLayer, mLayerZBase + 1)
1671 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001672 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1673 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001674}
1675
Alec Mouri80863a62019-01-17 15:19:35 -08001676TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001677 sp<SurfaceControl> bufferLayer;
1678 sp<SurfaceControl> parentLayer;
1679 sp<SurfaceControl> colorLayer;
1680 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1681 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001682 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001683 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1684 0 /* buffer height */,
1685 ISurfaceComposerClient::eFXSurfaceColor));
1686 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001687 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1688 const float alpha = 0.25f;
1689 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1690 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1691 // channel) should be less than one
1692 const uint8_t tolerance = 1;
1693 Transaction()
1694 .reparent(colorLayer, parentLayer->getHandle())
1695 .setColor(colorLayer, color)
1696 .setAlpha(parentLayer, alpha)
1697 .setLayer(parentLayer, mLayerZBase + 1)
1698 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001699 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1700 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001701}
1702
Alec Mouri80863a62019-01-17 15:19:35 -08001703TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001704 sp<SurfaceControl> bufferLayer;
1705 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001706 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001707
1708 // color is ignored
1709 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001710 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001711}
1712
Alec Mouri80863a62019-01-17 15:19:35 -08001713TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001714 sp<SurfaceControl> layer;
1715 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001716 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001717
1718 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1719 {
1720 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001721 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001722 }
1723
1724 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1725 {
1726 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001727 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001728 }
1729}
1730
Alec Mouri80863a62019-01-17 15:19:35 -08001731TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001732 sp<SurfaceControl> layer;
1733 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001734 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1735 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001736
1737 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1738 {
1739 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001740 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1741 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001742 }
1743
1744 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1745 {
1746 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001747 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1748 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001749 }
1750
1751 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1752 {
1753 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001754 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1755 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001756 }
1757
1758 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1759 {
1760 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001761 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1762 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001763 }
1764
1765 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1766 {
1767 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001768 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1769 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001770 }
1771}
1772
Alec Mouri80863a62019-01-17 15:19:35 -08001773TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001774 sp<SurfaceControl> layer;
1775 ASSERT_NO_FATAL_FAILURE(
1776 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1777 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1778 Color::BLUE, Color::WHITE));
1779
1780 Transaction()
1781 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1782 .setFrame(layer, Rect(0, 0, 32, 32))
1783 .apply();
1784 {
1785 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001786 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1787 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001788 }
1789
1790 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1791 {
1792 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001793 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1794 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001795 }
1796
1797 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1798 {
1799 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001800 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1801 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001802 }
1803
1804 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1805 {
1806 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001807 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1808 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001809 }
1810
1811 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1812 {
1813 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001814 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1815 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001816 }
1817}
1818
Alec Mouri80863a62019-01-17 15:19:35 -08001819TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001820 sp<SurfaceControl> layer;
1821 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001822 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1823 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001824
1825 const float rot = M_SQRT1_2; // 45 degrees
1826 const float trans = M_SQRT2 * 16.0f;
1827 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1828
Alec Mouri80863a62019-01-17 15:19:35 -08001829 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001830 // check a 8x8 region inside each color
1831 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1832 const int32_t halfL = 4;
1833 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1834 };
1835 const int32_t unit = int32_t(trans / 2);
1836 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1837 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1838 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1839 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1840}
1841
Alec Mouri80863a62019-01-17 15:19:35 -08001842TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001843 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001844 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1845 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001846
1847 // setMatrix is applied after any pending resize, unlike setPosition
1848 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1849 {
1850 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001851 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001852 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001853 shot->expectColor(rect, Color::RED);
1854 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001855 }
1856
Marissa Wall861616d2018-10-22 12:52:23 -07001857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001858 {
1859 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001860 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001861 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001862 }
1863}
1864
Alec Mouri80863a62019-01-17 15:19:35 -08001865TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001866 sp<SurfaceControl> layer;
1867 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001868 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001869
1870 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1871 Transaction()
1872 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1873 .setSize(layer, 64, 64)
1874 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1875 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001876 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001877}
1878
Alec Mouri80863a62019-01-17 15:19:35 -08001879TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001880 sp<SurfaceControl> layer;
1881 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001882 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1883 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001884
1885 // XXX SCALE_CROP is not respected; calling setSize and
1886 // setOverrideScalingMode in separate transactions does not work
1887 // (b/69315456)
1888 Transaction()
1889 .setSize(layer, 64, 16)
1890 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1891 .apply();
1892 {
1893 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001894 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1895 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001896 }
1897}
1898
Dan Stoza000dd012018-08-01 13:31:52 -07001899TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1900 sp<SurfaceControl> layer;
1901 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1902
1903 sp<IBinder> handle = layer->getHandle();
1904 ASSERT_TRUE(handle != nullptr);
1905
1906 FrameStats frameStats;
1907 mClient->getLayerFrameStats(handle, &frameStats);
1908
1909 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1910}
1911
Alec Mouri80863a62019-01-17 15:19:35 -08001912TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001913 sp<SurfaceControl> layer;
1914 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001915 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001916 const Rect crop(8, 8, 24, 24);
1917
Marissa Wallf58c14b2018-07-24 10:50:43 -07001918 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001919 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001920 shot->expectColor(crop, Color::RED);
1921 shot->expectBorder(crop, Color::BLACK);
1922}
1923
Alec Mouri80863a62019-01-17 15:19:35 -08001924TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001925 sp<SurfaceControl> layer;
1926 ASSERT_NO_FATAL_FAILURE(
1927 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1928 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1929 const Rect crop(8, 8, 24, 24);
1930
1931 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001932 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001933 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1934 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001935}
1936
Alec Mouri80863a62019-01-17 15:19:35 -08001937TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001938 sp<SurfaceControl> layer;
1939 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001940 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001941
1942 {
1943 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001944 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001945 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001946 }
1947
1948 {
1949 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001950 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001951 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001952 }
1953}
1954
Alec Mouri80863a62019-01-17 15:19:35 -08001955TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001956 sp<SurfaceControl> layer;
1957 ASSERT_NO_FATAL_FAILURE(
1958 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1959 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1960
1961 {
1962 SCOPED_TRACE("empty rect");
1963 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001964 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001965 }
1966
1967 {
1968 SCOPED_TRACE("negative rect");
1969 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001970 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07001971 }
1972}
1973
Alec Mouri80863a62019-01-17 15:19:35 -08001974TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001975 sp<SurfaceControl> layer;
1976 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001977 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001978
Marissa Wallf58c14b2018-07-24 10:50:43 -07001979 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001980 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001981 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1982 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
1983}
1984
Alec Mouri80863a62019-01-17 15:19:35 -08001985TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08001986 sp<SurfaceControl> layer;
1987 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
1988 ISurfaceComposerClient::eFXSurfaceBufferState));
1989 sp<GraphicBuffer> buffer =
1990 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
1991 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1992 BufferUsage::COMPOSER_OVERLAY,
1993 "test");
1994 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
1995 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
1996 Color::RED);
1997
1998 Transaction().setBuffer(layer, buffer).apply();
1999
2000 // Partially out of bounds in the negative (upper left) direction
2001 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2002 {
2003 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002004 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002005 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2006 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2007 }
2008
2009 // Partially out of bounds in the positive (lower right) direction
2010 Transaction()
2011 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2012 .apply();
2013 {
2014 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002015 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002016 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2017 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2018 }
2019
2020 // Fully out of buffer space bounds
2021 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2022 {
2023 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002024 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002025 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2026 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2027 Color::RED);
2028 }
2029}
2030
Alec Mouri80863a62019-01-17 15:19:35 -08002031TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002032 sp<SurfaceControl> layer;
2033 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002034 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002035
2036 const Point position(32, 32);
2037 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002038 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002039 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002040 shot->expectColor(crop + position, Color::RED);
2041 shot->expectBorder(crop + position, Color::BLACK);
2042}
2043
Alec Mouri80863a62019-01-17 15:19:35 -08002044TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002045 sp<SurfaceControl> layer;
2046 ASSERT_NO_FATAL_FAILURE(
2047 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2048 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2049
Marissa Wall861616d2018-10-22 12:52:23 -07002050 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002051 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002052 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002053 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002054 shot->expectColor(frame, Color::RED);
2055 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002056}
2057
Alec Mouri80863a62019-01-17 15:19:35 -08002058TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002059 sp<SurfaceControl> layer;
2060 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002061 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002062
Marissa Wall861616d2018-10-22 12:52:23 -07002063 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002064 Transaction()
2065 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002066 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002067 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002068 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002069 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2070 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2071}
2072
Alec Mouri80863a62019-01-17 15:19:35 -08002073TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002074 sp<SurfaceControl> layer;
2075 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002076 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002077
Marissa Wallf58c14b2018-07-24 10:50:43 -07002078 // setCrop_legacy is applied immediately by default, with or without resize pending
2079 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002080 {
2081 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002082 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002083 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2084 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2085 }
2086
Marissa Wall61c58622018-07-18 10:12:20 -07002087 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002088 {
2089 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002090 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002091 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2092 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2093 }
2094}
2095
Alec Mouri80863a62019-01-17 15:19:35 -08002096TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002097 sp<SurfaceControl> layer;
2098 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002099 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002100
Marissa Wallf58c14b2018-07-24 10:50:43 -07002101 // request setCrop_legacy to be applied with the next resize
2102 Transaction()
2103 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2104 .setGeometryAppliesWithResize(layer)
2105 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002106 {
2107 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002108 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002109 }
2110
Marissa Wallf58c14b2018-07-24 10:50:43 -07002111 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002112 {
2113 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002114 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002115 }
2116
2117 Transaction().setSize(layer, 16, 16).apply();
2118 {
2119 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002120 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002121 }
2122
2123 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002124 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002125 {
2126 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002127 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002128 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2129 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2130 }
2131}
2132
Alec Mouri80863a62019-01-17 15:19:35 -08002133TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002134 sp<SurfaceControl> layer;
2135 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002136 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002137
Marissa Wallf58c14b2018-07-24 10:50:43 -07002138 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002139 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002140 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002141 .setSize(layer, 16, 16)
2142 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2143 .setGeometryAppliesWithResize(layer)
2144 .apply();
2145 {
2146 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002147 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002148 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2149 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2150 }
2151
2152 // XXX crop is never latched without other geometry change (b/69315677)
2153 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002154 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002155 Transaction().setPosition(layer, 0, 0).apply();
2156 {
2157 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002158 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2160 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2161 }
2162}
2163
Alec Mouri80863a62019-01-17 15:19:35 -08002164TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002165 sp<SurfaceControl> layer;
2166 ASSERT_NO_FATAL_FAILURE(
2167 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2168 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2169 const Rect frame(8, 8, 24, 24);
2170
2171 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002172 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002173 shot->expectColor(frame, Color::RED);
2174 shot->expectBorder(frame, Color::BLACK);
2175}
2176
Alec Mouri80863a62019-01-17 15:19:35 -08002177TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002178 sp<SurfaceControl> layer;
2179 ASSERT_NO_FATAL_FAILURE(
2180 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2181 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2182
Marissa Wall61c58622018-07-18 10:12:20 -07002183 {
Marissa Wall861616d2018-10-22 12:52:23 -07002184 SCOPED_TRACE("empty rect");
2185 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002186 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002187 }
2188
Marissa Wall61c58622018-07-18 10:12:20 -07002189 {
Marissa Wall861616d2018-10-22 12:52:23 -07002190 SCOPED_TRACE("negative rect");
2191 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002192 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002193 }
2194}
2195
Alec Mouri80863a62019-01-17 15:19:35 -08002196TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002197 sp<SurfaceControl> layer;
2198 ASSERT_NO_FATAL_FAILURE(
2199 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2200 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2201
2202 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002203 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002204 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2205 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2206}
2207
Alec Mouri80863a62019-01-17 15:19:35 -08002208TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002209 sp<SurfaceControl> parent, child;
2210 ASSERT_NO_FATAL_FAILURE(
2211 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2212 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2213 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2214
2215 ASSERT_NO_FATAL_FAILURE(
2216 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2217 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2218
2219 Transaction().reparent(child, parent->getHandle()).apply();
2220
2221 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002222 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002223 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2224 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2225}
2226
Alec Mouri80863a62019-01-17 15:19:35 -08002227TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002228 sp<SurfaceControl> parent, child;
2229 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2230 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2231
2232 ASSERT_NO_FATAL_FAILURE(
2233 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2234 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2235
2236 Transaction().reparent(child, parent->getHandle()).apply();
2237
2238 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002239 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002240 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2241 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2242}
2243
Alec Mouri80863a62019-01-17 15:19:35 -08002244TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002245 sp<SurfaceControl> layer;
2246 ASSERT_NO_FATAL_FAILURE(
2247 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2248 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2249 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2250
2251 std::this_thread::sleep_for(500ms);
2252
2253 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2254
Alec Mouri80863a62019-01-17 15:19:35 -08002255 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002256 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2257 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2258}
2259
Alec Mouri80863a62019-01-17 15:19:35 -08002260TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002261 sp<SurfaceControl> parent, child;
2262 ASSERT_NO_FATAL_FAILURE(
2263 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2264 ASSERT_NO_FATAL_FAILURE(
2265 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2266 Transaction().reparent(child, parent->getHandle()).apply();
2267
2268 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2269 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2270
2271 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2272 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2273
Alec Mouri80863a62019-01-17 15:19:35 -08002274 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002275 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2276 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2277 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2278}
2279
Alec Mouri80863a62019-01-17 15:19:35 -08002280TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002281 sp<SurfaceControl> layer;
2282 ASSERT_NO_FATAL_FAILURE(
2283 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2284
2285 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2286
Alec Mouri80863a62019-01-17 15:19:35 -08002287 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002288 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2289 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2290}
2291
Alec Mouri80863a62019-01-17 15:19:35 -08002292TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002293 sp<SurfaceControl> layer;
2294 ASSERT_NO_FATAL_FAILURE(
2295 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2296
2297 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2298
2299 {
2300 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002301 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002302 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2303 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2304 }
2305
2306 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2307
2308 {
2309 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002310 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002311 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2312 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2313 }
2314
2315 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2316
2317 {
2318 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002319 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002320 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2321 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2322 }
2323}
2324
Alec Mouri80863a62019-01-17 15:19:35 -08002325TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002326 sp<SurfaceControl> layer1;
2327 ASSERT_NO_FATAL_FAILURE(
2328 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2329
2330 sp<SurfaceControl> layer2;
2331 ASSERT_NO_FATAL_FAILURE(
2332 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2333
2334 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2335
Marissa Wall861616d2018-10-22 12:52:23 -07002336 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002337 {
2338 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002339 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002340 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2341 }
2342
2343 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2344
Marissa Wall861616d2018-10-22 12:52:23 -07002345 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002346 {
2347 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002348 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002349 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2350 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2351 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2352 }
2353
2354 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2355 {
2356 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002357 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002358 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2359 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2360 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2361 }
2362
2363 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2364
2365 {
2366 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002367 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002368 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2369 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2370 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2371 }
2372}
2373
Alec Mouri80863a62019-01-17 15:19:35 -08002374TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002375 sp<SurfaceControl> layer;
2376 ASSERT_NO_FATAL_FAILURE(
2377 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2378
2379 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2380 Color::BLUE, Color::WHITE));
2381
Marissa Wall861616d2018-10-22 12:52:23 -07002382 Transaction()
2383 .setFrame(layer, Rect(0, 0, 32, 32))
2384 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2385 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002386
Alec Mouri80863a62019-01-17 15:19:35 -08002387 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2388 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002389}
2390
Alec Mouri80863a62019-01-17 15:19:35 -08002391TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002392 sp<SurfaceControl> layer;
2393 ASSERT_NO_FATAL_FAILURE(
2394 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2395
2396 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2397 Color::BLUE, Color::WHITE));
2398
Marissa Wall861616d2018-10-22 12:52:23 -07002399 Transaction()
2400 .setFrame(layer, Rect(0, 0, 32, 32))
2401 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2402 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002403
Alec Mouri80863a62019-01-17 15:19:35 -08002404 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2405 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002406}
2407
Alec Mouri80863a62019-01-17 15:19:35 -08002408TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_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_FLIP_V)
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::WHITE, Color::RED,
2422 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002423}
2424
2425TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2426 sp<SurfaceControl> layer;
2427 ASSERT_NO_FATAL_FAILURE(
2428 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2429
2430 Transaction().setTransformToDisplayInverse(layer, false).apply();
2431
2432 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2433
2434 Transaction().setTransformToDisplayInverse(layer, true).apply();
2435}
2436
Alec Mouri80863a62019-01-17 15:19:35 -08002437TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002438 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002439 Transaction transaction;
2440 ASSERT_NO_FATAL_FAILURE(
2441 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2442
2443 sp<GraphicBuffer> buffer =
2444 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2445 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2446 BufferUsage::COMPOSER_OVERLAY,
2447 "test");
2448 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2449
2450 sp<Fence> fence;
2451 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2452 GTEST_SUCCEED() << "test not supported";
2453 return;
2454 }
2455
2456 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2457
2458 status_t status = fence->wait(1000);
2459 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2460 std::this_thread::sleep_for(200ms);
2461
Alec Mouri80863a62019-01-17 15:19:35 -08002462 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002463 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2464 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2465}
2466
Alec Mouri80863a62019-01-17 15:19:35 -08002467TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002468 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002469 ASSERT_NO_FATAL_FAILURE(
2470 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2471
2472 sp<GraphicBuffer> buffer =
2473 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2474 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2475 BufferUsage::COMPOSER_OVERLAY,
2476 "test");
2477 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2478
Marissa Wallfda30bb2018-10-12 11:34:28 -07002479 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002480
2481 Transaction()
2482 .setBuffer(layer, buffer)
2483 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002484 .apply();
2485
Alec Mouri80863a62019-01-17 15:19:35 -08002486 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002487 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2488 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2489}
2490
Valerie Haua72e2812019-01-23 13:40:39 -08002491TEST_P(LayerRenderTypeTransactionTest, SetColorDataspace_ColorLayer_NoEffect) {
2492 sp<SurfaceControl> layer;
2493 ASSERT_NO_FATAL_FAILURE(
2494 layer = createLayer("test", 0, 0, ISurfaceComposerClient::eFXSurfaceColor));
2495 half3 color;
2496 color.r = 1.0f;
2497 color.g = 0.0f;
2498 color.b = 0.0f;
2499 Transaction()
2500 .setCrop_legacy(layer, Rect(0, 0, 32, 32))
2501 .setColor(layer, color)
2502 .setDataspace(layer, ui::Dataspace::UNKNOWN)
2503 .setColorDataspace(layer, ui::Dataspace::BT2020_ITU)
2504 .apply();
2505
2506 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
2507}
2508
2509TEST_P(LayerRenderTypeTransactionTest, SetColorDataspace_BufferQueue_NoEffect) {
2510 sp<SurfaceControl> layer;
2511 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2512 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2513
2514 Transaction()
2515 .setDataspace(layer, ui::Dataspace::UNKNOWN)
2516 .setColorDataspace(layer, ui::Dataspace::BT2020_ITU)
2517 .apply();
2518
2519 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
2520}
2521
2522TEST_P(LayerRenderTypeTransactionTest, SetColorDataspace_BufferState_ColorLayer) {
2523 sp<SurfaceControl> layer;
2524 ASSERT_NO_FATAL_FAILURE(
2525 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2526
2527 half3 color;
2528 color.r = 1.0f;
2529 color.g = 0.0f;
2530 color.b = 0.0f;
2531 Transaction()
2532 .setFrame(layer, Rect(0, 0, 32, 32))
2533 .setColor(layer, color)
2534 .setColorDataspace(layer, ui::Dataspace::BT2020_ITU)
2535 .apply();
2536 auto shot = screenshot();
2537 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2538 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2539}
2540
2541TEST_P(LayerRenderTypeTransactionTest, SetColorDataspace_BufferState_NoColorLayer) {
2542 sp<SurfaceControl> layer;
2543 ASSERT_NO_FATAL_FAILURE(
2544 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2545 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2546
2547 Transaction()
2548 .setFrame(layer, Rect(0, 0, 32, 32))
2549 .setDataspace(layer, ui::Dataspace::UNKNOWN)
2550 .setColorDataspace(layer, ui::Dataspace::DCI_P3)
2551 .apply();
2552
2553 screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED);
2554}
2555
Alec Mouri80863a62019-01-17 15:19:35 -08002556TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002557 sp<SurfaceControl> layer;
2558 ASSERT_NO_FATAL_FAILURE(
2559 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2560
2561 sp<GraphicBuffer> buffer =
2562 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2563 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2564 BufferUsage::COMPOSER_OVERLAY,
2565 "test");
2566 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2567
2568 Transaction()
2569 .setBuffer(layer, buffer)
2570 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002571 .apply();
2572
Alec Mouri80863a62019-01-17 15:19:35 -08002573 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002574 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2575 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2576}
2577
Alec Mouri80863a62019-01-17 15:19:35 -08002578TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002579 sp<SurfaceControl> layer;
2580 ASSERT_NO_FATAL_FAILURE(
2581 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2582
2583 sp<GraphicBuffer> buffer =
2584 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2585 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2586 BufferUsage::COMPOSER_OVERLAY,
2587 "test");
2588 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2589
2590 HdrMetadata hdrMetadata;
2591 hdrMetadata.validTypes = 0;
2592 Transaction()
2593 .setBuffer(layer, buffer)
2594 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002595 .apply();
2596
Alec Mouri80863a62019-01-17 15:19:35 -08002597 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002598 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2599 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2600}
2601
Alec Mouri80863a62019-01-17 15:19:35 -08002602TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002603 sp<SurfaceControl> layer;
2604 ASSERT_NO_FATAL_FAILURE(
2605 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2606
2607 sp<GraphicBuffer> buffer =
2608 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2609 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2610 BufferUsage::COMPOSER_OVERLAY,
2611 "test");
2612 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2613
2614 Region region;
2615 region.set(32, 32);
2616 Transaction()
2617 .setBuffer(layer, buffer)
2618 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002619 .apply();
2620
Alec Mouri80863a62019-01-17 15:19:35 -08002621 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002622 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2623 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2624}
2625
Alec Mouri80863a62019-01-17 15:19:35 -08002626TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002627 sp<SurfaceControl> layer;
2628 ASSERT_NO_FATAL_FAILURE(
2629 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2630
2631 sp<GraphicBuffer> buffer =
2632 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2633 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2634 BufferUsage::COMPOSER_OVERLAY,
2635 "test");
2636 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2637
2638 Transaction()
2639 .setBuffer(layer, buffer)
2640 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002641 .apply();
2642
Alec Mouri80863a62019-01-17 15:19:35 -08002643 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002644 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2645 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2646}
2647
2648TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2649 sp<SurfaceControl> layer;
2650 ASSERT_NO_FATAL_FAILURE(
2651 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2652
2653 // verify this doesn't cause a crash
2654 Transaction().setSidebandStream(layer, nullptr).apply();
2655}
2656
Marissa Wallebc2c052019-01-16 19:16:55 -08002657TEST_F(LayerTransactionTest, CacheBuffer_BufferState) {
2658 sp<GraphicBuffer> buffer =
2659 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2660 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2661 BufferUsage::COMPOSER_OVERLAY,
2662 "test");
2663
2664 int32_t bufferId = -1;
2665 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2666 ASSERT_GE(bufferId, 0);
2667
2668 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2669}
2670
2671TEST_F(LayerTransactionTest, CacheBuffers_BufferState) {
2672 std::vector<int32_t> bufferIds;
2673 int32_t bufferCount = 20;
2674
2675 for (int i = 0; i < bufferCount; i++) {
2676 sp<GraphicBuffer> buffer =
2677 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2678 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2679 BufferUsage::COMPOSER_OVERLAY,
2680 "test");
2681 int32_t bufferId = -1;
2682 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2683 if (bufferId < 0) {
2684 EXPECT_GE(bufferId, 0);
2685 break;
2686 }
2687 bufferIds.push_back(bufferId);
2688 }
2689
2690 for (int32_t bufferId : bufferIds) {
2691 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2692 }
2693}
2694
2695TEST_F(LayerTransactionTest, CacheBufferInvalid_BufferState) {
2696 sp<GraphicBuffer> buffer = nullptr;
2697
2698 int32_t bufferId = -1;
2699 ASSERT_NE(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2700 ASSERT_LT(bufferId, 0);
2701}
2702
2703TEST_F(LayerTransactionTest, UncacheBufferTwice_BufferState) {
2704 sp<GraphicBuffer> buffer =
2705 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2706 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2707 BufferUsage::COMPOSER_OVERLAY,
2708 "test");
2709
2710 int32_t bufferId = -1;
2711 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2712 ASSERT_GE(bufferId, 0);
2713
2714 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2715 mClient->uncacheBuffer(bufferId);
2716}
2717
2718TEST_F(LayerTransactionTest, UncacheBufferInvalidId_BufferState) {
2719 mClient->uncacheBuffer(-1);
2720 mClient->uncacheBuffer(0);
2721 mClient->uncacheBuffer(1);
2722 mClient->uncacheBuffer(5);
2723 mClient->uncacheBuffer(1000);
2724}
2725
2726TEST_F(LayerTransactionTest, SetCachedBuffer_BufferState) {
2727 sp<SurfaceControl> layer;
2728 ASSERT_NO_FATAL_FAILURE(
2729 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2730
2731 sp<GraphicBuffer> buffer =
2732 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2733 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2734 BufferUsage::COMPOSER_OVERLAY,
2735 "test");
2736
2737 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2738
2739 int32_t bufferId = -1;
2740 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(buffer, &bufferId));
2741 ASSERT_GE(bufferId, 0);
2742
2743 Transaction().setCachedBuffer(layer, bufferId).apply();
2744
2745 auto shot = screenshot();
2746 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2747 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2748
2749 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2750}
2751
2752TEST_F(LayerTransactionTest, SetCachedBufferDelayed_BufferState) {
2753 sp<SurfaceControl> layer;
2754 ASSERT_NO_FATAL_FAILURE(
2755 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2756
2757 sp<GraphicBuffer> cachedBuffer =
2758 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2759 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2760 BufferUsage::COMPOSER_OVERLAY,
2761 "test");
2762 int32_t bufferId = -1;
2763 ASSERT_EQ(NO_ERROR, mClient->cacheBuffer(cachedBuffer, &bufferId));
2764 ASSERT_GE(bufferId, 0);
2765
2766 sp<GraphicBuffer> buffer =
2767 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2768 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2769 BufferUsage::COMPOSER_OVERLAY,
2770 "test");
2771 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::BLUE);
2772 Transaction().setBuffer(layer, buffer).apply();
2773 {
2774 SCOPED_TRACE("Uncached buffer");
2775
2776 auto shot = screenshot();
2777 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2778 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2779 }
2780
2781 fillGraphicBufferColor(cachedBuffer, Rect(0, 0, 32, 32), Color::RED);
2782 Transaction().setCachedBuffer(layer, bufferId).apply();
2783 {
2784 SCOPED_TRACE("Cached buffer");
2785
2786 auto shot = screenshot();
2787 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2788 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2789 }
2790
2791 ASSERT_EQ(NO_ERROR, mClient->uncacheBuffer(bufferId));
2792}
2793
Robert Carr54cf5b12019-01-25 14:02:28 -08002794TEST_F(LayerTransactionTest, ReparentToSelf) {
2795 sp<SurfaceControl> layer;
2796 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2797 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2798 Transaction().reparent(layer, layer->getHandle()).apply();
2799
2800 {
2801 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2802 // to still be functioning.
2803 SCOPED_TRACE("after reparent to self");
2804 const Rect rect(0, 0, 32, 32);
2805 auto shot = screenshot();
2806 shot->expectColor(rect, Color::RED);
2807 shot->expectBorder(rect, Color::BLACK);
2808 }
2809}
2810
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002811class ColorTransformHelper {
2812public:
2813 static void DegammaColorSingle(half& s) {
2814 if (s <= 0.03928f)
2815 s = s / 12.92f;
2816 else
2817 s = pow((s + 0.055f) / 1.055f, 2.4f);
2818 }
2819
2820 static void DegammaColor(half3& color) {
2821 DegammaColorSingle(color.r);
2822 DegammaColorSingle(color.g);
2823 DegammaColorSingle(color.b);
2824 }
2825
2826 static void GammaColorSingle(half& s) {
2827 if (s <= 0.0031308f) {
2828 s = s * 12.92f;
2829 } else {
2830 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2831 }
2832 }
2833
2834 static void GammaColor(half3& color) {
2835 GammaColorSingle(color.r);
2836 GammaColorSingle(color.g);
2837 GammaColorSingle(color.b);
2838 }
2839
2840 static void applyMatrix(half3& color, const mat3& mat) {
2841 half3 ret = half3(0);
2842
2843 for (int i = 0; i < 3; i++) {
2844 for (int j = 0; j < 3; j++) {
2845 ret[i] = ret[i] + color[j] * mat[j][i];
2846 }
2847 }
2848 color = ret;
2849 }
2850};
2851
Alec Mouri80863a62019-01-17 15:19:35 -08002852TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002853 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002854 ASSERT_NO_FATAL_FAILURE(colorLayer =
2855 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2856 ISurfaceComposerClient::eFXSurfaceColor));
2857 Transaction()
2858 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2859 .setLayer(colorLayer, mLayerZBase + 1)
2860 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002861 {
2862 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002863 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002864 }
2865
2866 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002867 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002868 mat3 matrix;
2869 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2870 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2871 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002872
2873 // degamma before applying the matrix
2874 if (mColorManagementUsed) {
2875 ColorTransformHelper::DegammaColor(expected);
2876 }
2877
2878 ColorTransformHelper::applyMatrix(expected, matrix);
2879
2880 if (mColorManagementUsed) {
2881 ColorTransformHelper::GammaColor(expected);
2882 }
2883
2884 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2885 uint8_t(expected.b * 255), 255};
2886
2887 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2888 // channel) should be less than one
2889 const uint8_t tolerance = 1;
2890
Peiyong Lind3788632018-09-18 16:01:31 -07002891 Transaction().setColor(colorLayer, color)
2892 .setColorTransform(colorLayer, matrix, vec3()).apply();
2893 {
2894 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002895 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002896 }
2897}
2898
Alec Mouri80863a62019-01-17 15:19:35 -08002899TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002900 sp<SurfaceControl> parentLayer;
2901 sp<SurfaceControl> colorLayer;
2902 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2903 0 /* buffer height */,
2904 ISurfaceComposerClient::eFXSurfaceContainer));
2905 ASSERT_NO_FATAL_FAILURE(
2906 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2907 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2908
2909 Transaction()
2910 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2911 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2912 .setLayer(parentLayer, mLayerZBase + 1)
2913 .apply();
2914 {
2915 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002916 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002917 }
2918
2919 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2920 half3 expected = color;
2921 mat3 matrix;
2922 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2923 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2924 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2925
2926 // degamma before applying the matrix
2927 if (mColorManagementUsed) {
2928 ColorTransformHelper::DegammaColor(expected);
2929 }
2930
2931 ColorTransformHelper::applyMatrix(expected, matrix);
2932
2933 if (mColorManagementUsed) {
2934 ColorTransformHelper::GammaColor(expected);
2935 }
2936
2937 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2938 uint8_t(expected.b * 255), 255};
2939
2940 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2941 // channel) should be less than one
2942 const uint8_t tolerance = 1;
2943
2944 Transaction()
2945 .setColor(colorLayer, color)
2946 .setColorTransform(parentLayer, matrix, vec3())
2947 .apply();
2948 {
2949 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002950 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002951 }
2952}
2953
Alec Mouri80863a62019-01-17 15:19:35 -08002954TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002955 sp<SurfaceControl> parentLayer;
2956 sp<SurfaceControl> colorLayer;
2957 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2958 0 /* buffer height */,
2959 ISurfaceComposerClient::eFXSurfaceContainer));
2960 ASSERT_NO_FATAL_FAILURE(
2961 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2962 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2963
2964 Transaction()
2965 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2966 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2967 .setLayer(parentLayer, mLayerZBase + 1)
2968 .apply();
2969 {
2970 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002971 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002972 }
2973
2974 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2975 half3 expected = color;
2976 mat3 matrixChild;
2977 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2978 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2979 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2980 mat3 matrixParent;
2981 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2982 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2983 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2984
2985 // degamma before applying the matrix
2986 if (mColorManagementUsed) {
2987 ColorTransformHelper::DegammaColor(expected);
2988 }
2989
2990 ColorTransformHelper::applyMatrix(expected, matrixChild);
2991 ColorTransformHelper::applyMatrix(expected, matrixParent);
2992
2993 if (mColorManagementUsed) {
2994 ColorTransformHelper::GammaColor(expected);
2995 }
2996
2997 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2998 uint8_t(expected.b * 255), 255};
2999
3000 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3001 // channel) should be less than one
3002 const uint8_t tolerance = 1;
3003
3004 Transaction()
3005 .setColor(colorLayer, color)
3006 .setColorTransform(parentLayer, matrixParent, vec3())
3007 .setColorTransform(colorLayer, matrixChild, vec3())
3008 .apply();
3009 {
3010 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003011 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003012 }
3013}
3014
Marissa Wall80d94ad2019-01-18 16:04:36 -08003015struct CallbackData {
3016 CallbackData() = default;
3017 CallbackData(nsecs_t time, const sp<Fence>& fence,
3018 const std::vector<SurfaceControlStats>& stats)
3019 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3020
3021 nsecs_t latchTime;
3022 sp<Fence> presentFence;
3023 std::vector<SurfaceControlStats> surfaceControlStats;
3024};
3025
Marissa Wallfda30bb2018-10-12 11:34:28 -07003026class ExpectedResult {
3027public:
3028 enum Transaction {
3029 NOT_PRESENTED = 0,
3030 PRESENTED,
3031 };
3032
3033 enum Buffer {
3034 NOT_ACQUIRED = 0,
3035 ACQUIRED,
3036 };
3037
3038 enum PreviousBuffer {
3039 NOT_RELEASED = 0,
3040 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003041 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003042 };
3043
3044 void reset() {
3045 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3046 mExpectedSurfaceResults.clear();
3047 }
3048
3049 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003050 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003051 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3052 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003053 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003054 std::forward_as_tuple(bufferResult, previousBufferResult));
3055 }
3056
3057 void addSurfaces(ExpectedResult::Transaction transactionResult,
3058 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003059 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003060 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3061 for (const auto& layer : layers) {
3062 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3063 }
3064 }
3065
Marissa Wall17b4e452018-12-26 16:32:34 -08003066 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3067 mExpectedPresentTime = expectedPresentTime;
3068 }
3069
Marissa Wall80d94ad2019-01-18 16:04:36 -08003070 void verifyCallbackData(const CallbackData& callbackData) const {
3071 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003072 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3073 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003074 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003075 if (mExpectedPresentTime >= 0) {
3076 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3077 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3078 // if the panel is running at 30 hz, at the worst case, our expected time just
3079 // misses vsync and we have to wait another 33.3ms
3080 ASSERT_LE(presentFence->getSignalTime(),
3081 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3082 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003083 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003084 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003085 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3086 }
3087
Marissa Wall80d94ad2019-01-18 16:04:36 -08003088 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003089 << "wrong number of surfaces";
3090
Marissa Wall80d94ad2019-01-18 16:04:36 -08003091 for (const auto& stats : surfaceControlStats) {
3092 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3093
Marissa Wallfda30bb2018-10-12 11:34:28 -07003094 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3095 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3096 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003097 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003098 }
3099 }
3100
3101private:
3102 class ExpectedSurfaceResult {
3103 public:
3104 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3105 ExpectedResult::PreviousBuffer previousBufferResult)
3106 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3107
Marissa Wall80d94ad2019-01-18 16:04:36 -08003108 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3109 nsecs_t latchTime) const {
3110 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003111
3112 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3113 << "bad acquire time";
3114 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003115
3116 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3117 ASSERT_NE(previousReleaseFence, nullptr)
3118 << "failed to set release prev buffer fence";
3119 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3120 ASSERT_EQ(previousReleaseFence, nullptr)
3121 << "should not have set released prev buffer fence";
3122 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003123 }
3124
3125 private:
3126 ExpectedResult::Buffer mBufferResult;
3127 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3128 };
3129
Marissa Wall80d94ad2019-01-18 16:04:36 -08003130 struct SCHash {
3131 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3132 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003133 }
3134 };
3135 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003136 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003137 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003138};
3139
3140class CallbackHelper {
3141public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003142 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3143 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003144 if (!callbackContext) {
3145 ALOGE("failed to get callback context");
3146 }
3147 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3148 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003149 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003150 helper->mConditionVariable.notify_all();
3151 }
3152
Marissa Wall80d94ad2019-01-18 16:04:36 -08003153 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003154 std::unique_lock lock(mMutex);
3155
Marissa Wall80d94ad2019-01-18 16:04:36 -08003156 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003157 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3158 std::cv_status::timeout)
3159 << "did not receive callback";
3160 }
3161
Marissa Wall80d94ad2019-01-18 16:04:36 -08003162 *outData = std::move(mCallbackDataQueue.front());
3163 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003164 }
3165
3166 void verifyFinalState() {
3167 // Wait to see if there are extra callbacks
3168 std::this_thread::sleep_for(500ms);
3169
3170 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003171 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3172 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003173 }
3174
3175 void* getContext() { return static_cast<void*>(this); }
3176
3177 std::mutex mMutex;
3178 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003179 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180};
3181
3182class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003183public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003184 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003185 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003186 }
3187
Marissa Wall713b63f2018-10-17 15:42:43 -07003188 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
3189 const sp<SurfaceControl>& layer = nullptr) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003190 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003191 sp<GraphicBuffer> buffer;
3192 sp<Fence> fence;
3193 int err = getBuffer(&buffer, &fence);
3194 if (err != NO_ERROR) {
3195 return err;
3196 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003197
Marissa Wall861616d2018-10-22 12:52:23 -07003198 transaction.setBuffer(layer, buffer).setAcquireFence(layer, fence);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003199 }
3200
3201 transaction.addTransactionCompletedCallback(callbackHelper->function,
3202 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003204 }
3205
Marissa Wall861616d2018-10-22 12:52:23 -07003206 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3207 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003208 CallbackData callbackData;
3209 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3210 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003211
3212 if (finalState) {
3213 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3214 }
3215 }
3216
Marissa Wall861616d2018-10-22 12:52:23 -07003217 static void waitForCallbacks(CallbackHelper& helper,
3218 const std::vector<ExpectedResult>& expectedResults,
3219 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003220 for (const auto& expectedResult : expectedResults) {
3221 waitForCallback(helper, expectedResult);
3222 }
3223 if (finalState) {
3224 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3225 }
3226 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003227};
3228
3229TEST_F(LayerCallbackTest, Basic) {
3230 sp<SurfaceControl> layer;
3231 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3232
3233 Transaction transaction;
3234 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003235 int err = fillTransaction(transaction, &callback, layer);
3236 if (err) {
3237 GTEST_SUCCEED() << "test not supported";
3238 return;
3239 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003240
3241 transaction.apply();
3242
3243 ExpectedResult expected;
3244 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3245 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3246}
3247
3248TEST_F(LayerCallbackTest, NoBuffer) {
3249 sp<SurfaceControl> layer;
3250 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3251
3252 Transaction transaction;
3253 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003254 int err = fillTransaction(transaction, &callback);
3255 if (err) {
3256 GTEST_SUCCEED() << "test not supported";
3257 return;
3258 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259
Marissa Wall861616d2018-10-22 12:52:23 -07003260 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003261
3262 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003263 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3264 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003265 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3266}
3267
3268TEST_F(LayerCallbackTest, NoStateChange) {
3269 Transaction transaction;
3270 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003271 int err = fillTransaction(transaction, &callback);
3272 if (err) {
3273 GTEST_SUCCEED() << "test not supported";
3274 return;
3275 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003276
3277 transaction.apply();
3278
3279 ExpectedResult expected;
3280 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3281}
3282
3283TEST_F(LayerCallbackTest, OffScreen) {
3284 sp<SurfaceControl> layer;
3285 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3286
3287 Transaction transaction;
3288 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003289 int err = fillTransaction(transaction, &callback, layer);
3290 if (err) {
3291 GTEST_SUCCEED() << "test not supported";
3292 return;
3293 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003294
Marissa Wall861616d2018-10-22 12:52:23 -07003295 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003296
3297 ExpectedResult expected;
3298 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3299 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3300}
3301
3302TEST_F(LayerCallbackTest, Merge) {
3303 sp<SurfaceControl> layer1, layer2;
3304 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3305 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3306
3307 Transaction transaction1, transaction2;
3308 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003309 int err = fillTransaction(transaction1, &callback1, layer1);
3310 if (err) {
3311 GTEST_SUCCEED() << "test not supported";
3312 return;
3313 }
3314 err = fillTransaction(transaction2, &callback2, layer2);
3315 if (err) {
3316 GTEST_SUCCEED() << "test not supported";
3317 return;
3318 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003319
Marissa Wall861616d2018-10-22 12:52:23 -07003320 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3321 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003322
3323 ExpectedResult expected;
3324 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3325 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3326 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3327}
3328
3329TEST_F(LayerCallbackTest, Merge_SameCallback) {
3330 sp<SurfaceControl> layer1, layer2;
3331 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3332 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3333
3334 Transaction transaction1, transaction2;
3335 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003336 int err = fillTransaction(transaction1, &callback, layer1);
3337 if (err) {
3338 GTEST_SUCCEED() << "test not supported";
3339 return;
3340 }
3341 err = fillTransaction(transaction2, &callback, layer2);
3342 if (err) {
3343 GTEST_SUCCEED() << "test not supported";
3344 return;
3345 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003346
3347 transaction2.merge(std::move(transaction1)).apply();
3348
3349 ExpectedResult expected;
3350 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3351 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3352 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3353}
3354
3355TEST_F(LayerCallbackTest, Merge_SameLayer) {
3356 sp<SurfaceControl> layer;
3357 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3358
3359 Transaction transaction1, transaction2;
3360 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003361 int err = fillTransaction(transaction1, &callback1, layer);
3362 if (err) {
3363 GTEST_SUCCEED() << "test not supported";
3364 return;
3365 }
3366 err = fillTransaction(transaction2, &callback2, layer);
3367 if (err) {
3368 GTEST_SUCCEED() << "test not supported";
3369 return;
3370 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003371
3372 transaction2.merge(std::move(transaction1)).apply();
3373
3374 ExpectedResult expected;
3375 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3376 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3377 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3378}
3379
Marissa Wallfda30bb2018-10-12 11:34:28 -07003380TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3381 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3382 client2(new SurfaceComposerClient);
3383
3384 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3385 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3386
3387 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003388 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003389 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003390 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003391 ISurfaceComposerClient::eFXSurfaceBufferState));
3392
3393 Transaction transaction1, transaction2;
3394 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003395 int err = fillTransaction(transaction1, &callback1, layer1);
3396 if (err) {
3397 GTEST_SUCCEED() << "test not supported";
3398 return;
3399 }
3400 err = fillTransaction(transaction2, &callback2, layer2);
3401 if (err) {
3402 GTEST_SUCCEED() << "test not supported";
3403 return;
3404 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003405
Marissa Wall861616d2018-10-22 12:52:23 -07003406 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3407 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003408
3409 ExpectedResult expected;
3410 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3411 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3412 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3413}
3414
3415TEST_F(LayerCallbackTest, MultipleTransactions) {
3416 sp<SurfaceControl> layer;
3417 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3418
3419 Transaction transaction;
3420 CallbackHelper callback;
3421 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003422 int err = fillTransaction(transaction, &callback, layer);
3423 if (err) {
3424 GTEST_SUCCEED() << "test not supported";
3425 return;
3426 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003427
3428 transaction.apply();
3429
3430 ExpectedResult expected;
3431 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003432 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003433 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3434 : ExpectedResult::PreviousBuffer::RELEASED);
3435 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3436 }
3437 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3438}
3439
3440TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
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 ExpectedResult expected;
3448
3449 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003450 int err = fillTransaction(transaction, &callback, layer);
3451 if (err) {
3452 GTEST_SUCCEED() << "test not supported";
3453 return;
3454 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003455 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3456 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003457 int err = fillTransaction(transaction, &callback);
3458 if (err) {
3459 GTEST_SUCCEED() << "test not supported";
3460 return;
3461 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003462 }
3463
3464 transaction.apply();
3465
3466 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3467 }
3468 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3469}
3470
3471TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3472 sp<SurfaceControl> layer;
3473 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3474
3475 Transaction transaction;
3476 CallbackHelper callback;
3477 for (size_t i = 0; i < 10; i++) {
3478 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003479 int err = fillTransaction(transaction, &callback, layer);
3480 if (err) {
3481 GTEST_SUCCEED() << "test not supported";
3482 return;
3483 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003484 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003485 int err = fillTransaction(transaction, &callback);
3486 if (err) {
3487 GTEST_SUCCEED() << "test not supported";
3488 return;
3489 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003490 }
3491
Marissa Wall861616d2018-10-22 12:52:23 -07003492 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003493
3494 ExpectedResult expected;
3495 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3496 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003497 layer,
3498 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3499 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003500 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3501 }
3502 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3503}
3504
3505TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3506 sp<SurfaceControl> layer1, layer2;
3507 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3508 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3509
3510 Transaction transaction1, transaction2;
3511 CallbackHelper callback1, callback2;
3512 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003513 int err = fillTransaction(transaction1, &callback1, layer1);
3514 if (err) {
3515 GTEST_SUCCEED() << "test not supported";
3516 return;
3517 }
3518 err = fillTransaction(transaction2, &callback2, layer2);
3519 if (err) {
3520 GTEST_SUCCEED() << "test not supported";
3521 return;
3522 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003523
Marissa Wall861616d2018-10-22 12:52:23 -07003524 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3525 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003526
3527 ExpectedResult expected;
3528 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003529 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003530 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3531 : ExpectedResult::PreviousBuffer::RELEASED);
3532 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3533 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3534 }
3535 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3536 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3537}
3538
3539TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3540 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3541 client2(new SurfaceComposerClient);
3542 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3543 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3544
3545 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003546 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003547 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003548 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003549 ISurfaceComposerClient::eFXSurfaceBufferState));
3550
3551 Transaction transaction1, transaction2;
3552 CallbackHelper callback1, callback2;
3553 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003554 int err = fillTransaction(transaction1, &callback1, layer1);
3555 if (err) {
3556 GTEST_SUCCEED() << "test not supported";
3557 return;
3558 }
3559 err = fillTransaction(transaction2, &callback2, layer2);
3560 if (err) {
3561 GTEST_SUCCEED() << "test not supported";
3562 return;
3563 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003564
Marissa Wall861616d2018-10-22 12:52:23 -07003565 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3566 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003567
3568 ExpectedResult expected;
3569 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003570 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003571 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3572 : ExpectedResult::PreviousBuffer::RELEASED);
3573 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3574 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3575 }
3576 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3577 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3578}
3579
3580TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3581 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3582 client2(new SurfaceComposerClient);
3583 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3584 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3585
3586 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003587 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003588 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003589 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003590 ISurfaceComposerClient::eFXSurfaceBufferState));
3591
3592 Transaction transaction1, transaction2;
3593 CallbackHelper callback1, callback2;
3594
3595 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003596 int err = fillTransaction(transaction1, &callback1, layer1);
3597 if (err) {
3598 GTEST_SUCCEED() << "test not supported";
3599 return;
3600 }
3601 err = fillTransaction(transaction2, &callback2, layer2);
3602 if (err) {
3603 GTEST_SUCCEED() << "test not supported";
3604 return;
3605 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003606
Marissa Wall861616d2018-10-22 12:52:23 -07003607 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3608 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003609
3610 ExpectedResult expected;
3611 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3612 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3613 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3614 expected.reset();
3615
3616 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003617 err = fillTransaction(transaction1, &callback1);
3618 if (err) {
3619 GTEST_SUCCEED() << "test not supported";
3620 return;
3621 }
3622 err = fillTransaction(transaction2, &callback2);
3623 if (err) {
3624 GTEST_SUCCEED() << "test not supported";
3625 return;
3626 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003627
3628 transaction2.merge(std::move(transaction1)).apply();
3629
3630 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3631 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3632}
3633
3634TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3635 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3636 client2(new SurfaceComposerClient);
3637
3638 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3639 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3640
3641 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003642 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003643 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003644 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003645 ISurfaceComposerClient::eFXSurfaceBufferState));
3646
3647 Transaction transaction1, transaction2;
3648 CallbackHelper callback1, callback2;
3649
3650 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003651 int err = fillTransaction(transaction1, &callback1, layer1);
3652 if (err) {
3653 GTEST_SUCCEED() << "test not supported";
3654 return;
3655 }
3656 err = fillTransaction(transaction2, &callback2, layer2);
3657 if (err) {
3658 GTEST_SUCCEED() << "test not supported";
3659 return;
3660 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003661
Marissa Wall861616d2018-10-22 12:52:23 -07003662 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3663 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003664
3665 ExpectedResult expected;
3666 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3667 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3668 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3669 expected.reset();
3670
3671 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003672 err = fillTransaction(transaction1, &callback1);
3673 if (err) {
3674 GTEST_SUCCEED() << "test not supported";
3675 return;
3676 }
3677 err = fillTransaction(transaction2, &callback2);
3678 if (err) {
3679 GTEST_SUCCEED() << "test not supported";
3680 return;
3681 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003682
Marissa Wall861616d2018-10-22 12:52:23 -07003683 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003684
Marissa Wall713b63f2018-10-17 15:42:43 -07003685 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3686 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003687 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3688 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3689}
3690
3691TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3692 sp<SurfaceControl> layer;
3693 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3694
3695 Transaction transaction;
3696 CallbackHelper callback;
3697 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003698 for (auto& expected : expectedResults) {
3699 expected.reset();
3700 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003701 ExpectedResult::Buffer::ACQUIRED,
3702 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003703
Marissa Wall713b63f2018-10-17 15:42:43 -07003704 int err = fillTransaction(transaction, &callback, layer);
3705 if (err) {
3706 GTEST_SUCCEED() << "test not supported";
3707 return;
3708 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003709
3710 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003711 }
3712 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3713}
3714
3715TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3716 sp<SurfaceControl> layer;
3717 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3718
Marissa Wall713b63f2018-10-17 15:42:43 -07003719 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003720 Transaction transaction;
3721 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003722 int err = fillTransaction(transaction, &callback, layer);
3723 if (err) {
3724 GTEST_SUCCEED() << "test not supported";
3725 return;
3726 }
3727
3728 transaction.apply();
3729
3730 ExpectedResult expected;
3731 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3732 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3733
3734 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003735 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003736 for (auto& expected : expectedResults) {
3737 expected.reset();
3738
Marissa Wall713b63f2018-10-17 15:42:43 -07003739 err = fillTransaction(transaction, &callback);
3740 if (err) {
3741 GTEST_SUCCEED() << "test not supported";
3742 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003743 }
3744
3745 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003746 }
3747 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3748}
3749
3750TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3751 sp<SurfaceControl> layer;
3752 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3753
3754 // Normal call to set up test
3755 Transaction transaction;
3756 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003757 int err = fillTransaction(transaction, &callback, layer);
3758 if (err) {
3759 GTEST_SUCCEED() << "test not supported";
3760 return;
3761 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003762
Marissa Wall861616d2018-10-22 12:52:23 -07003763 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003764
3765 ExpectedResult expectedResult;
3766 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3767 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3768
3769 // Test
3770 std::vector<ExpectedResult> expectedResults(50);
3771 for (auto& expected : expectedResults) {
3772 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003773 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3774 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003775
Marissa Wall713b63f2018-10-17 15:42:43 -07003776 err = fillTransaction(transaction, &callback);
3777 if (err) {
3778 GTEST_SUCCEED() << "test not supported";
3779 return;
3780 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003781
Marissa Wall861616d2018-10-22 12:52:23 -07003782 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003783 }
3784 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3785}
3786
Marissa Wall17b4e452018-12-26 16:32:34 -08003787TEST_F(LayerCallbackTest, DesiredPresentTime) {
3788 sp<SurfaceControl> layer;
3789 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3790
3791 Transaction transaction;
3792 CallbackHelper callback;
3793 int err = fillTransaction(transaction, &callback, layer);
3794 if (err) {
3795 GTEST_SUCCEED() << "test not supported";
3796 return;
3797 }
3798
3799 // Try to present 100ms in the future
3800 nsecs_t time = systemTime() + (100 * 1e6);
3801
3802 transaction.setDesiredPresentTime(time);
3803 transaction.apply();
3804
3805 ExpectedResult expected;
3806 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3807 expected.addExpectedPresentTime(time);
3808 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3809}
3810
3811TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3812 sp<SurfaceControl> layer;
3813 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3814
3815 Transaction transaction;
3816 CallbackHelper callback1;
3817 int err = fillTransaction(transaction, &callback1, layer);
3818 if (err) {
3819 GTEST_SUCCEED() << "test not supported";
3820 return;
3821 }
3822
3823 // Try to present 100ms in the future
3824 nsecs_t time = systemTime() + (100 * 1e6);
3825
3826 transaction.setDesiredPresentTime(time);
3827 transaction.apply();
3828
3829 ExpectedResult expected1;
3830 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3831 expected1.addExpectedPresentTime(time);
3832
3833 CallbackHelper callback2;
3834 err = fillTransaction(transaction, &callback2, layer);
3835 if (err) {
3836 GTEST_SUCCEED() << "test not supported";
3837 return;
3838 }
3839
3840 // Try to present 33ms after the first frame
3841 time += (33.3 * 1e6);
3842
3843 transaction.setDesiredPresentTime(time);
3844 transaction.apply();
3845
3846 ExpectedResult expected2;
3847 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3848 ExpectedResult::Buffer::ACQUIRED,
3849 ExpectedResult::PreviousBuffer::RELEASED);
3850 expected2.addExpectedPresentTime(time);
3851
3852 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3853 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3854}
3855
3856TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3857 sp<SurfaceControl> layer;
3858 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3859
3860 Transaction transaction;
3861 CallbackHelper callback1;
3862 int err = fillTransaction(transaction, &callback1, layer);
3863 if (err) {
3864 GTEST_SUCCEED() << "test not supported";
3865 return;
3866 }
3867
3868 // Try to present 100ms in the future
3869 nsecs_t time = systemTime() + (100 * 1e6);
3870
3871 transaction.setDesiredPresentTime(time);
3872 transaction.apply();
3873
3874 ExpectedResult expected1;
3875 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3876 expected1.addExpectedPresentTime(time);
3877
3878 CallbackHelper callback2;
3879 err = fillTransaction(transaction, &callback2, layer);
3880 if (err) {
3881 GTEST_SUCCEED() << "test not supported";
3882 return;
3883 }
3884
3885 // Try to present 33ms before the previous frame
3886 time -= (33.3 * 1e6);
3887
3888 transaction.setDesiredPresentTime(time);
3889 transaction.apply();
3890
3891 ExpectedResult expected2;
3892 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3893 ExpectedResult::Buffer::ACQUIRED,
3894 ExpectedResult::PreviousBuffer::RELEASED);
3895
3896 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3897 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3898}
3899
3900TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3901 sp<SurfaceControl> layer;
3902 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3903
3904 Transaction transaction;
3905 CallbackHelper callback;
3906 int err = fillTransaction(transaction, &callback, layer);
3907 if (err) {
3908 GTEST_SUCCEED() << "test not supported";
3909 return;
3910 }
3911
3912 // Try to present 100ms in the past
3913 nsecs_t time = systemTime() - (100 * 1e6);
3914
3915 transaction.setDesiredPresentTime(time);
3916 transaction.apply();
3917
3918 ExpectedResult expected;
3919 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3920 expected.addExpectedPresentTime(systemTime());
3921 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3922}
3923
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003924class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003925protected:
3926 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003927 LayerTransactionTest::SetUp();
3928 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003929
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003930 const auto display = SurfaceComposerClient::getInternalDisplayToken();
3931 ASSERT_FALSE(display == nullptr);
3932
Mathias Agopianc666cae2012-07-25 18:56:13 -07003933 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003934 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003935
3936 ssize_t displayWidth = info.w;
3937 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003938
3939 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003940 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3941 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003942 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003943 ASSERT_TRUE(mBGSurfaceControl->isValid());
3944 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3945
3946 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003947 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
3948
Peiyong Lin566a3b42018-01-09 18:22:43 -08003949 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003950 ASSERT_TRUE(mFGSurfaceControl->isValid());
3951
3952 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
3953
3954 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07003955 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003956 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003957 ASSERT_TRUE(mSyncSurfaceControl->isValid());
3958
3959 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3960
Robert Carr4cdc58f2017-08-23 14:22:20 -07003961 asTransaction([&](Transaction& t) {
3962 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003963
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003964 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07003965
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003966 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
3967 .setPosition(mFGSurfaceControl, 64, 64)
3968 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003969
Chia-I Wu1078bbb2017-10-20 11:29:02 -07003970 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
3971 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
3972 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07003973 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003974 }
3975
3976 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07003977 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003978 mBGSurfaceControl = 0;
3979 mFGSurfaceControl = 0;
3980 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003981 }
3982
3983 void waitForPostedBuffers() {
3984 // Since the sync surface is in synchronous mode (i.e. double buffered)
3985 // posting three buffers to it should ensure that at least two
3986 // SurfaceFlinger::handlePageFlip calls have been made, which should
3987 // guaranteed that a buffer posted to another Surface has been retired.
3988 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3989 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3990 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
3991 }
3992
Robert Carr4cdc58f2017-08-23 14:22:20 -07003993 void asTransaction(const std::function<void(Transaction&)>& exec) {
3994 Transaction t;
3995 exec(t);
3996 t.apply(true);
3997 }
3998
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003999 sp<SurfaceControl> mBGSurfaceControl;
4000 sp<SurfaceControl> mFGSurfaceControl;
4001
4002 // This surface is used to ensure that the buffers posted to
4003 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4004 sp<SurfaceControl> mSyncSurfaceControl;
4005};
4006
Robert Carr7f619b22017-11-06 12:56:35 -08004007TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004008
chaviw0e3479f2018-09-10 16:49:30 -07004009 std::unique_ptr<ScreenCapture> sc;
4010
4011 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004012 fillSurfaceRGBA8(relative, 10, 10, 10);
4013 waitForPostedBuffers();
4014
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004015 Transaction{}
4016 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004017 .setPosition(relative, 64, 64)
4018 .apply();
4019
4020 {
4021 // The relative should be on top of the FG control.
4022 ScreenCapture::captureScreen(&sc);
4023 sc->checkPixel(64, 64, 10, 10, 10);
4024 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004025 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004026
4027 {
4028 // Nothing should change at this point.
4029 ScreenCapture::captureScreen(&sc);
4030 sc->checkPixel(64, 64, 10, 10, 10);
4031 }
4032
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004033 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004034
4035 {
4036 // Ensure that the relative was actually hidden, rather than
4037 // being left in the detached but visible state.
4038 ScreenCapture::captureScreen(&sc);
4039 sc->expectFGColor(64, 64);
4040 }
4041}
4042
Robert Carr8d5227b2017-03-16 15:41:03 -07004043class GeometryLatchingTest : public LayerUpdateTest {
4044protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004045 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004046 SCOPED_TRACE(trace);
4047 ScreenCapture::captureScreen(&sc);
4048 // We find the leading edge of the FG surface.
4049 sc->expectFGColor(127, 127);
4050 sc->expectBGColor(128, 128);
4051 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004052
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004053 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004054
4055 void unlockFGBuffer() {
4056 sp<Surface> s = mFGSurfaceControl->getSurface();
4057 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4058 waitForPostedBuffers();
4059 }
4060
Robert Carr8d5227b2017-03-16 15:41:03 -07004061 void completeFGResize() {
4062 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4063 waitForPostedBuffers();
4064 }
4065 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004066 asTransaction([&](Transaction& t) {
4067 t.setSize(mFGSurfaceControl, 64, 64);
4068 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004069 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004070 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004071
4072 EXPECT_INITIAL_STATE("After restoring initial state");
4073 }
chaviw0e3479f2018-09-10 16:49:30 -07004074 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004075};
4076
Robert Carr8d5227b2017-03-16 15:41:03 -07004077class CropLatchingTest : public GeometryLatchingTest {
4078protected:
4079 void EXPECT_CROPPED_STATE(const char* trace) {
4080 SCOPED_TRACE(trace);
4081 ScreenCapture::captureScreen(&sc);
4082 // The edge should be moved back one pixel by our crop.
4083 sc->expectFGColor(126, 126);
4084 sc->expectBGColor(127, 127);
4085 sc->expectBGColor(128, 128);
4086 }
chaviw59f5c562017-06-28 16:39:06 -07004087
4088 void EXPECT_RESIZE_STATE(const char* trace) {
4089 SCOPED_TRACE(trace);
4090 ScreenCapture::captureScreen(&sc);
4091 // The FG is now resized too 128,128 at 64,64
4092 sc->expectFGColor(64, 64);
4093 sc->expectFGColor(191, 191);
4094 sc->expectBGColor(192, 192);
4095 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004096};
4097
Pablo Ceballos05289c22016-04-14 15:49:55 -07004098TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004099 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004100 {
4101 SCOPED_TRACE("before anything");
4102 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004103 sc->expectBGColor(32, 32);
4104 sc->expectFGColor(96, 96);
4105 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004106 }
4107
4108 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004109 asTransaction([&](Transaction& t) {
4110 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004111 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4112 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004113 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004114
Robert Carr4cdc58f2017-08-23 14:22:20 -07004115 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004116 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004117 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4118 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004119 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004120
4121 {
4122 SCOPED_TRACE("before any trigger");
4123 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004124 sc->expectBGColor(32, 32);
4125 sc->expectFGColor(96, 96);
4126 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004127 }
4128
4129 // should trigger the first deferred transaction, but not the second one
4130 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4131 {
4132 SCOPED_TRACE("after first trigger");
4133 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004134 sc->expectBGColor(32, 32);
4135 sc->checkPixel(96, 96, 162, 63, 96);
4136 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004137 }
4138
4139 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004140 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004141
4142 // trigger the second deferred transaction
4143 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4144 {
4145 SCOPED_TRACE("after second trigger");
4146 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004147 sc->expectBGColor(32, 32);
4148 sc->expectBGColor(96, 96);
4149 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004150 }
4151}
4152
Robert Carre392b552017-09-19 12:16:05 -07004153TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004154 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004155
4156 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004157 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4158 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4159 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4160 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004161 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004162 SurfaceComposerClient::Transaction{}
4163 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4164 .show(childNoBuffer)
4165 .show(childBuffer)
4166 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004167 {
4168 ScreenCapture::captureScreen(&sc);
4169 sc->expectChildColor(73, 73);
4170 sc->expectFGColor(74, 74);
4171 }
Vishnu Nair60356342018-11-13 13:00:45 -08004172 SurfaceComposerClient::Transaction{}
4173 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4174 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004175 {
4176 ScreenCapture::captureScreen(&sc);
4177 sc->expectChildColor(73, 73);
4178 sc->expectChildColor(74, 74);
4179 }
4180}
4181
Robert Carr2c5f6d22017-09-26 12:30:35 -07004182TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004183 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004184 {
4185 SCOPED_TRACE("before move");
4186 ScreenCapture::captureScreen(&sc);
4187 sc->expectBGColor(0, 12);
4188 sc->expectFGColor(75, 75);
4189 sc->expectBGColor(145, 145);
4190 }
4191
4192 Transaction t1, t2;
4193 t1.setPosition(mFGSurfaceControl, 128, 128);
4194 t2.setPosition(mFGSurfaceControl, 0, 0);
4195 // We expect that the position update from t2 now
4196 // overwrites the position update from t1.
4197 t1.merge(std::move(t2));
4198 t1.apply();
4199
4200 {
4201 ScreenCapture::captureScreen(&sc);
4202 sc->expectFGColor(1, 1);
4203 }
4204}
4205
Robert Carr1f0a16a2016-10-24 16:27:39 -07004206class ChildLayerTest : public LayerUpdateTest {
4207protected:
4208 void SetUp() override {
4209 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004210 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4211 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004212 fillSurfaceRGBA8(mChild, 200, 200, 200);
4213
4214 {
4215 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004216 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004217 mCapture->expectChildColor(64, 64);
4218 }
4219 }
4220 void TearDown() override {
4221 LayerUpdateTest::TearDown();
4222 mChild = 0;
4223 }
4224
4225 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004226 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004227};
4228
4229TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004230 asTransaction([&](Transaction& t) {
4231 t.show(mChild);
4232 t.setPosition(mChild, 10, 10);
4233 t.setPosition(mFGSurfaceControl, 64, 64);
4234 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004235
4236 {
chaviw0e3479f2018-09-10 16:49:30 -07004237 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004238 // Top left of foreground must now be visible
4239 mCapture->expectFGColor(64, 64);
4240 // But 10 pixels in we should see the child surface
4241 mCapture->expectChildColor(74, 74);
4242 // And 10 more pixels we should be back to the foreground surface
4243 mCapture->expectFGColor(84, 84);
4244 }
4245
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004246 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004247
4248 {
chaviw0e3479f2018-09-10 16:49:30 -07004249 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004250 // Top left of foreground should now be at 0, 0
4251 mCapture->expectFGColor(0, 0);
4252 // But 10 pixels in we should see the child surface
4253 mCapture->expectChildColor(10, 10);
4254 // And 10 more pixels we should be back to the foreground surface
4255 mCapture->expectFGColor(20, 20);
4256 }
4257}
4258
Robert Carr41b08b52017-06-01 16:11:34 -07004259TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004260 asTransaction([&](Transaction& t) {
4261 t.show(mChild);
4262 t.setPosition(mChild, 0, 0);
4263 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004264 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004265 });
Robert Carr41b08b52017-06-01 16:11:34 -07004266
4267 {
chaviw0e3479f2018-09-10 16:49:30 -07004268 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004269 mCapture->expectChildColor(0, 0);
4270 mCapture->expectChildColor(4, 4);
4271 mCapture->expectBGColor(5, 5);
4272 }
4273}
4274
Robert Carr1f0a16a2016-10-24 16:27:39 -07004275TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004276 asTransaction([&](Transaction& t) {
4277 t.show(mChild);
4278 t.setPosition(mFGSurfaceControl, 0, 0);
4279 t.setPosition(mChild, 63, 63);
4280 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004281
4282 {
chaviw0e3479f2018-09-10 16:49:30 -07004283 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004284 mCapture->expectFGColor(0, 0);
4285 // Last pixel in foreground should now be the child.
4286 mCapture->expectChildColor(63, 63);
4287 // But the child should be constrained and the next pixel
4288 // must be the background
4289 mCapture->expectBGColor(64, 64);
4290 }
4291}
4292
4293TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004294 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004295
4296 // Find the boundary between the parent and child
4297 {
chaviw0e3479f2018-09-10 16:49:30 -07004298 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004299 mCapture->expectChildColor(9, 9);
4300 mCapture->expectFGColor(10, 10);
4301 }
4302
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004303 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004304
4305 // The boundary should be twice as far from the origin now.
4306 // The pixels from the last test should all be child now
4307 {
chaviw0e3479f2018-09-10 16:49:30 -07004308 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004309 mCapture->expectChildColor(9, 9);
4310 mCapture->expectChildColor(10, 10);
4311 mCapture->expectChildColor(19, 19);
4312 mCapture->expectFGColor(20, 20);
4313 }
4314}
Robert Carr9524cb32017-02-13 11:32:32 -08004315
Robert Carr6452f122017-03-21 10:41:29 -07004316TEST_F(ChildLayerTest, ChildLayerAlpha) {
4317 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4318 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4319 fillSurfaceRGBA8(mChild, 0, 254, 0);
4320 waitForPostedBuffers();
4321
Robert Carr4cdc58f2017-08-23 14:22:20 -07004322 asTransaction([&](Transaction& t) {
4323 t.show(mChild);
4324 t.setPosition(mChild, 0, 0);
4325 t.setPosition(mFGSurfaceControl, 0, 0);
4326 });
Robert Carr6452f122017-03-21 10:41:29 -07004327
4328 {
chaviw0e3479f2018-09-10 16:49:30 -07004329 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004330 // Unblended child color
4331 mCapture->checkPixel(0, 0, 0, 254, 0);
4332 }
4333
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004334 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004335
4336 {
chaviw0e3479f2018-09-10 16:49:30 -07004337 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004338 // Child and BG blended.
4339 mCapture->checkPixel(0, 0, 127, 127, 0);
4340 }
4341
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004342 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004343
4344 {
chaviw0e3479f2018-09-10 16:49:30 -07004345 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004346 // Child and BG blended.
4347 mCapture->checkPixel(0, 0, 95, 64, 95);
4348 }
4349}
4350
Robert Carr9524cb32017-02-13 11:32:32 -08004351TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004352 asTransaction([&](Transaction& t) {
4353 t.show(mChild);
4354 t.setPosition(mChild, 10, 10);
4355 t.setPosition(mFGSurfaceControl, 64, 64);
4356 });
Robert Carr9524cb32017-02-13 11:32:32 -08004357
4358 {
chaviw0e3479f2018-09-10 16:49:30 -07004359 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004360 // Top left of foreground must now be visible
4361 mCapture->expectFGColor(64, 64);
4362 // But 10 pixels in we should see the child surface
4363 mCapture->expectChildColor(74, 74);
4364 // And 10 more pixels we should be back to the foreground surface
4365 mCapture->expectFGColor(84, 84);
4366 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004367
4368 asTransaction([&](Transaction& t) {
4369 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4370 });
4371
Robert Carr9524cb32017-02-13 11:32:32 -08004372 {
chaviw0e3479f2018-09-10 16:49:30 -07004373 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004374 mCapture->expectFGColor(64, 64);
4375 // In reparenting we should have exposed the entire foreground surface.
4376 mCapture->expectFGColor(74, 74);
4377 // And the child layer should now begin at 10, 10 (since the BG
4378 // layer is at (0, 0)).
4379 mCapture->expectBGColor(9, 9);
4380 mCapture->expectChildColor(10, 10);
4381 }
4382}
4383
Robert Carr2e102c92018-10-23 12:11:15 -07004384TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4385 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004386 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004387 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4388
4389 {
4390 SCOPED_TRACE("Grandchild visible");
4391 ScreenCapture::captureScreen(&mCapture);
4392 mCapture->checkPixel(64, 64, 111, 111, 111);
4393 }
4394
4395 mChild->clear();
4396
4397 {
4398 SCOPED_TRACE("After destroying child");
4399 ScreenCapture::captureScreen(&mCapture);
4400 mCapture->expectFGColor(64, 64);
4401 }
4402
4403 asTransaction([&](Transaction& t) {
4404 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4405 });
4406
4407 {
4408 SCOPED_TRACE("After reparenting grandchild");
4409 ScreenCapture::captureScreen(&mCapture);
4410 mCapture->checkPixel(64, 64, 111, 111, 111);
4411 }
4412}
4413
chaviw161410b02017-07-27 10:46:08 -07004414TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004415 asTransaction([&](Transaction& t) {
4416 t.show(mChild);
4417 t.setPosition(mChild, 10, 10);
4418 t.setPosition(mFGSurfaceControl, 64, 64);
4419 });
Robert Carr9524cb32017-02-13 11:32:32 -08004420
4421 {
chaviw0e3479f2018-09-10 16:49:30 -07004422 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004423 // Top left of foreground must now be visible
4424 mCapture->expectFGColor(64, 64);
4425 // But 10 pixels in we should see the child surface
4426 mCapture->expectChildColor(74, 74);
4427 // And 10 more pixels we should be back to the foreground surface
4428 mCapture->expectFGColor(84, 84);
4429 }
4430
chaviw0e3479f2018-09-10 16:49:30 -07004431
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004432 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004433
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004434 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004435
chaviw161410b02017-07-27 10:46:08 -07004436 // Since the child has the same client as the parent, it will not get
4437 // detached and will be hidden.
4438 {
chaviw0e3479f2018-09-10 16:49:30 -07004439 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004440 mCapture->expectFGColor(64, 64);
4441 mCapture->expectFGColor(74, 74);
4442 mCapture->expectFGColor(84, 84);
4443 }
4444}
4445
4446TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4447 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004448 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004449 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4450 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004451
chaviw161410b02017-07-27 10:46:08 -07004452 ASSERT_TRUE(mChildNewClient->isValid());
4453
4454 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4455
Robert Carr4cdc58f2017-08-23 14:22:20 -07004456 asTransaction([&](Transaction& t) {
4457 t.hide(mChild);
4458 t.show(mChildNewClient);
4459 t.setPosition(mChildNewClient, 10, 10);
4460 t.setPosition(mFGSurfaceControl, 64, 64);
4461 });
chaviw161410b02017-07-27 10:46:08 -07004462
4463 {
chaviw0e3479f2018-09-10 16:49:30 -07004464 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004465 // Top left of foreground must now be visible
4466 mCapture->expectFGColor(64, 64);
4467 // But 10 pixels in we should see the child surface
4468 mCapture->expectChildColor(74, 74);
4469 // And 10 more pixels we should be back to the foreground surface
4470 mCapture->expectFGColor(84, 84);
4471 }
4472
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004473 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004474
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004475 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004476
Robert Carr9524cb32017-02-13 11:32:32 -08004477 // Nothing should have changed.
4478 {
chaviw0e3479f2018-09-10 16:49:30 -07004479 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004480 mCapture->expectFGColor(64, 64);
4481 mCapture->expectChildColor(74, 74);
4482 mCapture->expectFGColor(84, 84);
4483 }
4484}
4485
chaviw5aedec92018-10-22 10:40:38 -07004486TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4487 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4488 sp<SurfaceControl> childNewClient =
4489 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4490 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4491
4492 ASSERT_TRUE(childNewClient != nullptr);
4493 ASSERT_TRUE(childNewClient->isValid());
4494
4495 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4496
4497 Transaction()
4498 .hide(mChild)
4499 .show(childNewClient)
4500 .setPosition(childNewClient, 10, 10)
4501 .setPosition(mFGSurfaceControl, 64, 64)
4502 .apply();
4503
4504 {
4505 mCapture = screenshot();
4506 // Top left of foreground must now be visible
4507 mCapture->expectFGColor(64, 64);
4508 // But 10 pixels in we should see the child surface
4509 mCapture->expectChildColor(74, 74);
4510 // And 10 more pixels we should be back to the foreground surface
4511 mCapture->expectFGColor(84, 84);
4512 }
4513
4514 Transaction().detachChildren(mFGSurfaceControl).apply();
4515 Transaction().hide(childNewClient).apply();
4516
4517 // Nothing should have changed.
4518 {
4519 mCapture = screenshot();
4520 mCapture->expectFGColor(64, 64);
4521 mCapture->expectChildColor(74, 74);
4522 mCapture->expectFGColor(84, 84);
4523 }
4524
4525 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4526 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4527 32);
4528 Transaction()
4529 .setLayer(newParentSurface, INT32_MAX - 1)
4530 .show(newParentSurface)
4531 .setPosition(newParentSurface, 20, 20)
4532 .reparent(childNewClient, newParentSurface->getHandle())
4533 .apply();
4534 {
4535 mCapture = screenshot();
4536 // Child is now hidden.
4537 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4538 }
4539}
4540
Robert Carr9b429f42017-04-17 14:56:57 -07004541TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004542 asTransaction([&](Transaction& t) {
4543 t.show(mChild);
4544 t.setPosition(mChild, 0, 0);
4545 t.setPosition(mFGSurfaceControl, 0, 0);
4546 });
Robert Carr9b429f42017-04-17 14:56:57 -07004547
4548 {
chaviw0e3479f2018-09-10 16:49:30 -07004549 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004550 // We've positioned the child in the top left.
4551 mCapture->expectChildColor(0, 0);
4552 // But it's only 10x10.
4553 mCapture->expectFGColor(10, 10);
4554 }
4555
Robert Carr4cdc58f2017-08-23 14:22:20 -07004556 asTransaction([&](Transaction& t) {
4557 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4558 // We cause scaling by 2.
4559 t.setSize(mFGSurfaceControl, 128, 128);
4560 });
Robert Carr9b429f42017-04-17 14:56:57 -07004561
4562 {
chaviw0e3479f2018-09-10 16:49:30 -07004563 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004564 // We've positioned the child in the top left.
4565 mCapture->expectChildColor(0, 0);
4566 mCapture->expectChildColor(10, 10);
4567 mCapture->expectChildColor(19, 19);
4568 // And now it should be scaled all the way to 20x20
4569 mCapture->expectFGColor(20, 20);
4570 }
4571}
4572
Robert Carr1725eee2017-04-26 18:32:15 -07004573// Regression test for b/37673612
4574TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004575 asTransaction([&](Transaction& t) {
4576 t.show(mChild);
4577 t.setPosition(mChild, 0, 0);
4578 t.setPosition(mFGSurfaceControl, 0, 0);
4579 });
Robert Carr1725eee2017-04-26 18:32:15 -07004580
4581 {
chaviw0e3479f2018-09-10 16:49:30 -07004582 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004583 // We've positioned the child in the top left.
4584 mCapture->expectChildColor(0, 0);
4585 // But it's only 10x10.
4586 mCapture->expectFGColor(10, 10);
4587 }
Robert Carr1725eee2017-04-26 18:32:15 -07004588 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4589 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004590 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004591 sp<Surface> s = mFGSurfaceControl->getSurface();
4592 auto anw = static_cast<ANativeWindow*>(s.get());
4593 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4594 native_window_set_buffers_dimensions(anw, 64, 128);
4595 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4596 waitForPostedBuffers();
4597
4598 {
4599 // The child should still be in the same place and not have any strange scaling as in
4600 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004601 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004602 mCapture->expectChildColor(0, 0);
4603 mCapture->expectFGColor(10, 10);
4604 }
4605}
4606
Dan Stoza412903f2017-04-27 13:42:17 -07004607TEST_F(ChildLayerTest, Bug36858924) {
4608 // Destroy the child layer
4609 mChild.clear();
4610
4611 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004612 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4613 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004614
4615 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004616 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004617 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4618 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004619 t.show(mChild);
4620 });
Dan Stoza412903f2017-04-27 13:42:17 -07004621
4622 // Render the foreground surface a few times
4623 //
4624 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4625 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4626 // never acquire/release the first buffer
4627 ALOGI("Filling 1");
4628 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4629 ALOGI("Filling 2");
4630 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4631 ALOGI("Filling 3");
4632 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4633 ALOGI("Filling 4");
4634 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4635}
4636
chaviwf1961f72017-09-18 16:41:07 -07004637TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004638 asTransaction([&](Transaction& t) {
4639 t.show(mChild);
4640 t.setPosition(mChild, 10, 10);
4641 t.setPosition(mFGSurfaceControl, 64, 64);
4642 });
chaviw06178942017-07-27 10:25:59 -07004643
4644 {
chaviw0e3479f2018-09-10 16:49:30 -07004645 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004646 // Top left of foreground must now be visible
4647 mCapture->expectFGColor(64, 64);
4648 // But 10 pixels in we should see the child surface
4649 mCapture->expectChildColor(74, 74);
4650 // And 10 more pixels we should be back to the foreground surface
4651 mCapture->expectFGColor(84, 84);
4652 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004653
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004654 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004655
chaviw06178942017-07-27 10:25:59 -07004656 {
chaviw0e3479f2018-09-10 16:49:30 -07004657 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004658 mCapture->expectFGColor(64, 64);
4659 // In reparenting we should have exposed the entire foreground surface.
4660 mCapture->expectFGColor(74, 74);
4661 // And the child layer should now begin at 10, 10 (since the BG
4662 // layer is at (0, 0)).
4663 mCapture->expectBGColor(9, 9);
4664 mCapture->expectChildColor(10, 10);
4665 }
4666}
4667
chaviwf1961f72017-09-18 16:41:07 -07004668TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004669 asTransaction([&](Transaction& t) {
4670 t.show(mChild);
4671 t.setPosition(mChild, 10, 10);
4672 t.setPosition(mFGSurfaceControl, 64, 64);
4673 });
chaviwf1961f72017-09-18 16:41:07 -07004674
4675 {
chaviw0e3479f2018-09-10 16:49:30 -07004676 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004677 // Top left of foreground must now be visible
4678 mCapture->expectFGColor(64, 64);
4679 // But 10 pixels in we should see the child surface
4680 mCapture->expectChildColor(74, 74);
4681 // And 10 more pixels we should be back to the foreground surface
4682 mCapture->expectFGColor(84, 84);
4683 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004684 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004685 {
chaviw0e3479f2018-09-10 16:49:30 -07004686 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004687 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004688 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004689 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004690 mCapture->expectFGColor(84, 84);
4691 }
4692}
4693
4694TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004695 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004696 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004697 ASSERT_TRUE(newSurface->isValid());
4698
4699 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004700 asTransaction([&](Transaction& t) {
4701 t.hide(mChild);
4702 t.show(newSurface);
4703 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004704 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004705 t.setPosition(mFGSurfaceControl, 64, 64);
4706 });
chaviwf1961f72017-09-18 16:41:07 -07004707
4708 {
chaviw0e3479f2018-09-10 16:49:30 -07004709 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004710 // Top left of foreground must now be visible
4711 mCapture->expectFGColor(64, 64);
4712 // At 10, 10 we should see the new surface
4713 mCapture->checkPixel(10, 10, 63, 195, 63);
4714 }
4715
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004716 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004717
4718 {
chaviw0e3479f2018-09-10 16:49:30 -07004719 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004720 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4721 // mFGSurface, putting it at 74, 74.
4722 mCapture->expectFGColor(64, 64);
4723 mCapture->checkPixel(74, 74, 63, 195, 63);
4724 mCapture->expectFGColor(84, 84);
4725 }
4726}
4727
chaviwc9674332017-08-28 12:32:18 -07004728TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004729 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4730 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004731 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4732
4733 {
chaviw0e3479f2018-09-10 16:49:30 -07004734 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004735 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4736 // which begins at 64, 64
4737 mCapture->checkPixel(64, 64, 50, 50, 50);
4738 }
4739}
4740
Robert Carr503c7042017-09-27 15:06:08 -07004741TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004742 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004743 fillSurfaceRGBA8(relative, 255, 255, 255);
4744
4745 Transaction t;
4746 t.setLayer(relative, INT32_MAX)
4747 .setRelativeLayer(mChild, relative->getHandle(), 1)
4748 .setPosition(mFGSurfaceControl, 0, 0)
4749 .apply(true);
4750
4751 // We expect that the child should have been elevated above our
4752 // INT_MAX layer even though it's not a child of it.
4753 {
chaviw0e3479f2018-09-10 16:49:30 -07004754 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004755 mCapture->expectChildColor(0, 0);
4756 mCapture->expectChildColor(9, 9);
4757 mCapture->checkPixel(10, 10, 255, 255, 255);
4758 }
4759}
Vishnu Nair60356342018-11-13 13:00:45 -08004760class BoundlessLayerTest : public LayerUpdateTest {
4761protected:
4762 std::unique_ptr<ScreenCapture> mCapture;
4763};
4764
4765// Verify setting a size on a buffer layer has no effect.
4766TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4767 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004768 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4769 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004770 ASSERT_TRUE(bufferLayer->isValid());
4771 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4772 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4773 {
4774 mCapture = screenshot();
4775 // Top left of background must now be visible
4776 mCapture->expectBGColor(0, 0);
4777 // Foreground Surface bounds must be color layer
4778 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4779 // Buffer layer should not extend past buffer bounds
4780 mCapture->expectFGColor(95, 95);
4781 }
4782}
4783
4784// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4785// which will crop the color layer.
4786TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4787 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004788 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4789 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004790 ASSERT_TRUE(colorLayer->isValid());
4791 asTransaction([&](Transaction& t) {
4792 t.setColor(colorLayer, half3{0, 0, 0});
4793 t.show(colorLayer);
4794 });
4795 {
4796 mCapture = screenshot();
4797 // Top left of background must now be visible
4798 mCapture->expectBGColor(0, 0);
4799 // Foreground Surface bounds must be color layer
4800 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4801 // Color layer should not extend past foreground bounds
4802 mCapture->expectBGColor(129, 129);
4803 }
4804}
4805
4806// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4807// a crop which will be used to crop the color layer.
4808TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004809 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4810 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004811 ASSERT_TRUE(cropLayer->isValid());
4812 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004813 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4814 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004815 ASSERT_TRUE(colorLayer->isValid());
4816 asTransaction([&](Transaction& t) {
4817 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4818 t.setColor(colorLayer, half3{0, 0, 0});
4819 t.show(cropLayer);
4820 t.show(colorLayer);
4821 });
4822 {
4823 mCapture = screenshot();
4824 // Top left of background must now be visible
4825 mCapture->expectBGColor(0, 0);
4826 // Top left of foreground must now be visible
4827 mCapture->expectFGColor(64, 64);
4828 // 5 pixels from the foreground we should see the child surface
4829 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4830 // 10 pixels from the foreground we should be back to the foreground surface
4831 mCapture->expectFGColor(74, 74);
4832 }
4833}
4834
4835// Verify for boundless layer with no children, their transforms have no effect.
4836TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4837 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004838 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4839 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004840 ASSERT_TRUE(colorLayer->isValid());
4841 asTransaction([&](Transaction& t) {
4842 t.setPosition(colorLayer, 320, 320);
4843 t.setMatrix(colorLayer, 2, 0, 0, 2);
4844 t.setColor(colorLayer, half3{0, 0, 0});
4845 t.show(colorLayer);
4846 });
4847 {
4848 mCapture = screenshot();
4849 // Top left of background must now be visible
4850 mCapture->expectBGColor(0, 0);
4851 // Foreground Surface bounds must be color layer
4852 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4853 // Color layer should not extend past foreground bounds
4854 mCapture->expectBGColor(129, 129);
4855 }
4856}
4857
4858// Verify for boundless layer with children, their transforms have an effect.
4859TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4860 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004861 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4862 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004863 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4864 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004865 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4866 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004867 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4868 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004869 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4870 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004871 ASSERT_TRUE(colorLayer->isValid());
4872 asTransaction([&](Transaction& t) {
4873 t.setPosition(boundlessLayerRightShift, 32, 0);
4874 t.show(boundlessLayerRightShift);
4875 t.setPosition(boundlessLayerDownShift, 0, 32);
4876 t.show(boundlessLayerDownShift);
4877 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4878 t.setColor(colorLayer, half3{0, 0, 0});
4879 t.show(colorLayer);
4880 });
4881 {
4882 mCapture = screenshot();
4883 // Top left of background must now be visible
4884 mCapture->expectBGColor(0, 0);
4885 // Top left of foreground must now be visible
4886 mCapture->expectFGColor(64, 64);
4887 // Foreground Surface bounds must be color layer
4888 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4889 // Color layer should not extend past foreground bounds
4890 mCapture->expectBGColor(129, 129);
4891 }
4892}
4893
4894// Verify child layers do not get clipped if they temporarily move into the negative
4895// coordinate space as the result of an intermediate transformation.
4896TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4897 sp<SurfaceControl> boundlessLayer =
4898 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4899 0 /* flags */, mFGSurfaceControl.get());
4900 ASSERT_TRUE(boundlessLayer != nullptr);
4901 ASSERT_TRUE(boundlessLayer->isValid());
4902 sp<SurfaceControl> colorLayer =
4903 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4904 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4905 ASSERT_TRUE(colorLayer != nullptr);
4906 ASSERT_TRUE(colorLayer->isValid());
4907 asTransaction([&](Transaction& t) {
4908 // shift child layer off bounds. If this layer was not boundless, we will
4909 // expect the child layer to be cropped.
4910 t.setPosition(boundlessLayer, 32, 32);
4911 t.show(boundlessLayer);
4912 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4913 // undo shift by parent
4914 t.setPosition(colorLayer, -32, -32);
4915 t.setColor(colorLayer, half3{0, 0, 0});
4916 t.show(colorLayer);
4917 });
4918 {
4919 mCapture = screenshot();
4920 // Top left of background must now be visible
4921 mCapture->expectBGColor(0, 0);
4922 // Foreground Surface bounds must be color layer
4923 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4924 // Color layer should not extend past foreground bounds
4925 mCapture->expectBGColor(129, 129);
4926 }
4927}
4928
4929// Verify for boundless root layers with children, their transforms have an effect.
4930TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004931 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4932 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004933 ASSERT_TRUE(rootBoundlessLayer->isValid());
4934 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004935 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4936 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4937
Vishnu Nair60356342018-11-13 13:00:45 -08004938 ASSERT_TRUE(colorLayer->isValid());
4939 asTransaction([&](Transaction& t) {
4940 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4941 t.setPosition(rootBoundlessLayer, 32, 32);
4942 t.show(rootBoundlessLayer);
4943 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4944 t.setColor(colorLayer, half3{0, 0, 0});
4945 t.show(colorLayer);
4946 t.hide(mFGSurfaceControl);
4947 });
4948 {
4949 mCapture = screenshot();
4950 // Top left of background must now be visible
4951 mCapture->expectBGColor(0, 0);
4952 // Top left of foreground must now be visible
4953 mCapture->expectBGColor(31, 31);
4954 // Foreground Surface bounds must be color layer
4955 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
4956 // Color layer should not extend past foreground bounds
4957 mCapture->expectBGColor(97, 97);
4958 }
4959}
Robert Carr503c7042017-09-27 15:06:08 -07004960
chaviwa76b2712017-09-20 12:02:26 -07004961class ScreenCaptureTest : public LayerUpdateTest {
4962protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004963 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07004964};
4965
4966TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
4967 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004968 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004969 mCapture->expectBGColor(0, 0);
4970 // Doesn't capture FG layer which is at 64, 64
4971 mCapture->expectBGColor(64, 64);
4972}
4973
4974TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
4975 auto fgHandle = mFGSurfaceControl->getHandle();
4976
Vishnu Nair88a11f22018-11-28 18:30:57 -08004977 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
4978 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07004979 fillSurfaceRGBA8(child, 200, 200, 200);
4980
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004981 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07004982
4983 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004984 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07004985 mCapture->expectFGColor(10, 10);
4986 mCapture->expectChildColor(0, 0);
4987}
4988
Robert Carr578038f2018-03-09 12:25:24 -08004989TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
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());
Robert Carr578038f2018-03-09 12:25:24 -08004994 fillSurfaceRGBA8(child, 200, 200, 200);
4995
4996 SurfaceComposerClient::Transaction().show(child).apply(true);
4997
4998 // Captures mFGSurfaceControl's child
4999 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5000 mCapture->checkPixel(10, 10, 0, 0, 0);
5001 mCapture->expectChildColor(0, 0);
5002}
5003
chaviw50da5042018-04-09 13:49:37 -07005004TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005005 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5006 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005007
5008 fillSurfaceRGBA8(child, 200, 200, 200);
5009
5010 SurfaceComposerClient::Transaction().show(child).apply(true);
5011
5012 auto childHandle = child->getHandle();
5013
5014 // Captures child
5015 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5016 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5017 // Area outside of child's bounds is transparent.
5018 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5019}
5020
chaviw4b129c22018-04-09 16:19:43 -07005021TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5022 auto fgHandle = mFGSurfaceControl->getHandle();
5023
Vishnu Nair88a11f22018-11-28 18:30:57 -08005024 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5025 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5026 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005027 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005028 fillSurfaceRGBA8(child, 200, 200, 200);
5029 fillSurfaceRGBA8(relative, 100, 100, 100);
5030
5031 SurfaceComposerClient::Transaction()
5032 .show(child)
5033 // Set relative layer above fg layer so should be shown above when computing all layers.
5034 .setRelativeLayer(relative, fgHandle, 1)
5035 .show(relative)
5036 .apply(true);
5037
5038 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5039 ScreenCapture::captureLayers(&mCapture, fgHandle);
5040 mCapture->expectFGColor(10, 10);
5041 mCapture->expectChildColor(0, 0);
5042}
5043
5044TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5045 auto fgHandle = mFGSurfaceControl->getHandle();
5046
Vishnu Nair88a11f22018-11-28 18:30:57 -08005047 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5048 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5049 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5050 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005051 fillSurfaceRGBA8(child, 200, 200, 200);
5052 fillSurfaceRGBA8(relative, 100, 100, 100);
5053
5054 SurfaceComposerClient::Transaction()
5055 .show(child)
5056 // Set relative layer below fg layer but relative to child layer so it should be shown
5057 // above child layer.
5058 .setLayer(relative, -1)
5059 .setRelativeLayer(relative, child->getHandle(), 1)
5060 .show(relative)
5061 .apply(true);
5062
5063 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5064 // relative value should be taken into account, placing it above child layer.
5065 ScreenCapture::captureLayers(&mCapture, fgHandle);
5066 mCapture->expectFGColor(10, 10);
5067 // Relative layer is showing on top of child layer
5068 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5069}
Robert Carr578038f2018-03-09 12:25:24 -08005070
5071// In the following tests we verify successful skipping of a parent layer,
5072// so we use the same verification logic and only change how we mutate
5073// the parent layer to verify that various properties are ignored.
5074class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5075public:
5076 void SetUp() override {
5077 LayerUpdateTest::SetUp();
5078
Vishnu Nair88a11f22018-11-28 18:30:57 -08005079 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5080 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005081 fillSurfaceRGBA8(mChild, 200, 200, 200);
5082
5083 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5084 }
5085
5086 void verify() {
5087 auto fgHandle = mFGSurfaceControl->getHandle();
5088 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5089 mCapture->checkPixel(10, 10, 0, 0, 0);
5090 mCapture->expectChildColor(0, 0);
5091 }
5092
5093 std::unique_ptr<ScreenCapture> mCapture;
5094 sp<SurfaceControl> mChild;
5095};
5096
5097TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5098
5099 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5100
5101 // Even though the parent is hidden we should still capture the child.
5102 verify();
5103}
5104
5105TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005106 SurfaceComposerClient::Transaction()
5107 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5108 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005109
5110 // Even though the parent is cropped out we should still capture the child.
5111 verify();
5112}
5113
5114TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
5115
5116 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2);
5117
5118 // We should not inherit the parent scaling.
5119 verify();
5120}
5121
Robert Carr15eae092018-03-23 13:43:53 -07005122TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) {
5123 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5124
5125 // Even though the parent is hidden we should still capture the child.
5126 verify();
5127
5128 // Verify everything was properly hidden when rendering the full-screen.
5129 screenshot()->expectBGColor(0,0);
5130}
5131
5132
chaviwa76b2712017-09-20 12:02:26 -07005133TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5134 auto fgHandle = mFGSurfaceControl->getHandle();
5135
Vishnu Nair88a11f22018-11-28 18:30:57 -08005136 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5137 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005138 fillSurfaceRGBA8(child, 200, 200, 200);
5139
Vishnu Nair88a11f22018-11-28 18:30:57 -08005140 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5141 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005142
5143 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5144 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005145 .show(child)
5146 .setPosition(grandchild, 5, 5)
5147 .show(grandchild)
5148 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005149
5150 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005151 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005152 mCapture->expectFGColor(10, 10);
5153 mCapture->expectChildColor(0, 0);
5154 mCapture->checkPixel(5, 5, 50, 50, 50);
5155}
5156
5157TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005158 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5159 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005160 fillSurfaceRGBA8(child, 200, 200, 200);
5161 auto childHandle = child->getHandle();
5162
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005163 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005164
5165 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005166 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005167 mCapture->expectChildColor(0, 0);
5168 mCapture->expectChildColor(9, 9);
5169}
5170
5171TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005172 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5173 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005174 fillSurfaceRGBA8(child, 200, 200, 200);
5175 auto childHandle = child->getHandle();
5176
Vishnu Nair88a11f22018-11-28 18:30:57 -08005177 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5178 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005179 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5180
5181 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005182 .show(child)
5183 .setPosition(grandchild, 5, 5)
5184 .show(grandchild)
5185 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005186
5187 auto grandchildHandle = grandchild->getHandle();
5188
5189 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005190 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005191 mCapture->checkPixel(0, 0, 50, 50, 50);
5192 mCapture->checkPixel(4, 4, 50, 50, 50);
5193}
5194
chaviw7206d492017-11-10 16:16:12 -08005195TEST_F(ScreenCaptureTest, CaptureCrop) {
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
Marissa Wall861616d2018-10-22 12:52:23 -07005219 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005220 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005221 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5222 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005223 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005224 mCapture->checkPixel(30, 30, 0, 0, 0);
5225}
5226
5227TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005228 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005229 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5230 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
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));
5233 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005234
5235 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005236 .setLayer(redLayer, INT32_MAX - 1)
5237 .show(redLayer)
5238 .show(blueLayer)
5239 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005240
5241 auto redLayerHandle = redLayer->getHandle();
5242
5243 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005244 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5245 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5246 // red area below the blue area
5247 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5248 // red area to the right of the blue area
5249 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005250
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005251 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005252 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005253 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5254 // red area below the blue area
5255 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5256 // red area to the right of the blue area
5257 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005258 mCapture->checkPixel(30, 30, 0, 0, 0);
5259}
5260
5261TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005262 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005263
Marissa Wall61c58622018-07-18 10:12:20 -07005264 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005265
5266 auto redLayerHandle = redLayer->getHandle();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005267 redLayer->clear();
chaviw7206d492017-11-10 16:16:12 -08005268 SurfaceComposerClient::Transaction().apply(true);
5269
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005270 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005271
5272 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005273 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5274 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005275}
5276
chaviw8e3fe5d2018-02-22 10:55:42 -08005277
5278class DereferenceSurfaceControlTest : public LayerTransactionTest {
5279protected:
5280 void SetUp() override {
5281 LayerTransactionTest::SetUp();
5282 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005283 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005284 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005285 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005286 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5287 {
5288 SCOPED_TRACE("before anything");
5289 auto shot = screenshot();
5290 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5291 }
5292 }
5293 void TearDown() override {
5294 LayerTransactionTest::TearDown();
5295 bgLayer = 0;
5296 fgLayer = 0;
5297 }
5298
5299 sp<SurfaceControl> bgLayer;
5300 sp<SurfaceControl> fgLayer;
5301};
5302
5303TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5304 fgLayer = nullptr;
5305 {
5306 SCOPED_TRACE("after setting null");
5307 auto shot = screenshot();
5308 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5309 }
5310}
5311
5312TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5313 auto transaction = Transaction().show(fgLayer);
5314 fgLayer = nullptr;
5315 {
5316 SCOPED_TRACE("after setting null");
5317 auto shot = screenshot();
5318 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5319 }
5320}
5321
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005322} // namespace android