blob: 4b494d87de1516830b2aea47eb15fe9683ce5097 [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) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800198 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
199 }
200
201 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800202 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700203 SurfaceComposerClient::Transaction().apply(true);
204
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000205 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800206 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700207 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000208 }
209
210 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
211 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
212 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
213 SurfaceComposerClient::Transaction().apply(true);
214
215 sp<GraphicBuffer> outBuffer;
216 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
217 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700218 }
219
Robert Carr578038f2018-03-09 12:25:24 -0800220 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
221 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
222 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
223 SurfaceComposerClient::Transaction().apply(true);
224
225 sp<GraphicBuffer> outBuffer;
226 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
227 *sc = std::make_unique<ScreenCapture>(outBuffer);
228 }
229
Chia-I Wu718daf82017-10-20 11:57:17 -0700230 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000231 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
232 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700233 }
234
235 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000236 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700237 const bool leftBorder = rect.left > 0;
238 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000239 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
240 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700241
242 if (topBorder) {
243 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
244 if (leftBorder) {
245 top.left -= 1;
246 }
247 if (rightBorder) {
248 top.right += 1;
249 }
250 expectColor(top, color, tolerance);
251 }
252 if (leftBorder) {
253 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
254 expectColor(left, color, tolerance);
255 }
256 if (rightBorder) {
257 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
258 expectColor(right, color, tolerance);
259 }
260 if (bottomBorder) {
261 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
262 if (leftBorder) {
263 bottom.left -= 1;
264 }
265 if (rightBorder) {
266 bottom.right += 1;
267 }
268 expectColor(bottom, color, tolerance);
269 }
270 }
271
Chia-I Wu93853fe2017-11-02 08:30:27 -0700272 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
273 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
274 uint8_t tolerance = 0) {
275 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
276
277 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
278 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
279 // avoid checking borders due to unspecified filtering behavior
280 const int32_t offsetX = filtered ? 2 : 0;
281 const int32_t offsetY = filtered ? 2 : 0;
282 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
283 tolerance);
284 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
285 tolerance);
286 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
287 tolerance);
288 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
289 bottomRight, tolerance);
290 }
291
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700292 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000293 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
294 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700295 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
296 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700297 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
298 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700299 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700300 }
301 }
302
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700303 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700304
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700305 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700306
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700307 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700308
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800309 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000310 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700311 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700312
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000313 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700314
315private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000316 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800317 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700318};
319
Chia-I Wu718daf82017-10-20 11:57:17 -0700320class LayerTransactionTest : public ::testing::Test {
321protected:
322 void SetUp() override {
323 mClient = new SurfaceComposerClient;
324 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
325
326 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700327
328 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700329 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700330 }
331
chaviw0e3479f2018-09-10 16:49:30 -0700332 virtual void TearDown() {
333 mBlackBgSurface = 0;
334 mClient->dispose();
335 mClient = 0;
336 }
337
Marissa Wallfda30bb2018-10-12 11:34:28 -0700338 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
339 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800340 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
341 auto layer =
342 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700343
Vishnu Nair60356342018-11-13 13:00:45 -0800344 Transaction t;
345 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800346
347 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700348 if (error != NO_ERROR) {
349 ADD_FAILURE() << "failed to initialize SurfaceControl";
350 layer.clear();
351 }
352
353 return layer;
354 }
355
Vishnu Nair88a11f22018-11-28 18:30:57 -0800356 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
357 const char* name, uint32_t width, uint32_t height,
358 PixelFormat format, uint32_t flags,
359 SurfaceControl* parent = nullptr) {
360 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
361 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
362 return layer;
363 }
364
Marissa Wallfda30bb2018-10-12 11:34:28 -0700365 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800366 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
367 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700368 }
369
Marissa Wall61c58622018-07-18 10:12:20 -0700370 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700371 // wait for previous transactions (such as setSize) to complete
372 Transaction().apply(true);
373
374 ANativeWindow_Buffer buffer = {};
375 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
376
377 return buffer;
378 }
379
Marissa Wall61c58622018-07-18 10:12:20 -0700380 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700381 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
382
383 // wait for the newly posted buffer to be latched
384 waitForLayerBuffers();
385 }
386
Marissa Wall61c58622018-07-18 10:12:20 -0700387 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
388 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700389 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700390 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
391 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
392 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700393 }
394
Marissa Wall61c58622018-07-18 10:12:20 -0700395 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
396 int32_t bufferWidth, int32_t bufferHeight) {
397 sp<GraphicBuffer> buffer =
398 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
399 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
400 BufferUsage::COMPOSER_OVERLAY,
401 "test");
402 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700403 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700404 }
405
406 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
407 int32_t bufferWidth, int32_t bufferHeight) {
408 switch (mLayerType) {
409 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
410 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
411 break;
412 case ISurfaceComposerClient::eFXSurfaceBufferState:
413 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
414 break;
415 default:
416 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
417 }
418 }
419
420 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
421 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700422 const Color& topRight, const Color& bottomLeft,
423 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700424 switch (mLayerType) {
425 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
426 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
427 bottomLeft, bottomRight);
428 break;
429 case ISurfaceComposerClient::eFXSurfaceBufferState:
430 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
431 bottomLeft, bottomRight);
432 break;
433 default:
434 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
435 }
436 }
437
438 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
439 int32_t bufferHeight, const Color& topLeft,
440 const Color& topRight, const Color& bottomLeft,
441 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700442 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700443 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
444 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700445
Marissa Wall61c58622018-07-18 10:12:20 -0700446 const int32_t halfW = bufferWidth / 2;
447 const int32_t halfH = bufferHeight / 2;
448 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
449 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
450 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
451 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
452 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700453
Marissa Wall61c58622018-07-18 10:12:20 -0700454 postBufferQueueLayerBuffer(layer);
455 }
456
457 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
458 int32_t bufferHeight, const Color& topLeft,
459 const Color& topRight, const Color& bottomLeft,
460 const Color& bottomRight) {
461 sp<GraphicBuffer> buffer =
462 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
463 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
464 BufferUsage::COMPOSER_OVERLAY,
465 "test");
466
467 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
468
469 const int32_t halfW = bufferWidth / 2;
470 const int32_t halfH = bufferHeight / 2;
471 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
472 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
473 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
474 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
475
476 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700477 }
478
chaviw0e3479f2018-09-10 16:49:30 -0700479 std::unique_ptr<ScreenCapture> screenshot() {
480 std::unique_ptr<ScreenCapture> screenshot;
481 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700482 return screenshot;
483 }
484
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800485 void asTransaction(const std::function<void(Transaction&)>& exec) {
486 Transaction t;
487 exec(t);
488 t.apply(true);
489 }
490
Marissa Wall713b63f2018-10-17 15:42:43 -0700491 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
492 static BufferGenerator bufferGenerator;
493 return bufferGenerator.get(outBuffer, outFence);
494 }
495
Chia-I Wu718daf82017-10-20 11:57:17 -0700496 sp<SurfaceComposerClient> mClient;
497
498 sp<IBinder> mDisplay;
499 uint32_t mDisplayWidth;
500 uint32_t mDisplayHeight;
501 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700502 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700503
504 // leave room for ~256 layers
505 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
506
chaviw0e3479f2018-09-10 16:49:30 -0700507 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700508 bool mColorManagementUsed;
509
Chia-I Wu718daf82017-10-20 11:57:17 -0700510private:
511 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800512 mDisplay = mClient->getInternalDisplayToken();
513 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700514
515 // get display width/height
516 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800517 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700518 mDisplayWidth = info.w;
519 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700520 mDisplayRect =
521 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700522
523 // After a new buffer is queued, SurfaceFlinger is notified and will
524 // latch the new buffer on next vsync. Let's heuristically wait for 3
525 // vsyncs.
526 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
527
528 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700529
Vishnu Nair88a11f22018-11-28 18:30:57 -0800530 mBlackBgSurface =
531 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
532 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700533
Chia-I Wu718daf82017-10-20 11:57:17 -0700534 // set layer stack (b/68888219)
535 Transaction t;
536 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800537 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700538 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
539 t.setColor(mBlackBgSurface, half3{0, 0, 0});
540 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700541 t.apply();
542 }
543
chaviw0e3479f2018-09-10 16:49:30 -0700544 void waitForLayerBuffers() {
545 // Request an empty transaction to get applied synchronously to ensure the buffer is
546 // latched.
547 Transaction().apply(true);
548 usleep(mBufferPostDelay);
549 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700550
551 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800552
553 friend class LayerRenderPathTestHarness;
554};
555enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
556
557class LayerRenderPathTestHarness {
558public:
559 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
560 : mDelegate(delegate), mRenderPath(renderPath) {}
561
562 std::unique_ptr<ScreenCapture> getScreenCapture() {
563 switch (mRenderPath) {
564 case RenderPath::SCREENSHOT:
565 return mDelegate->screenshot();
566 case RenderPath::VIRTUAL_DISPLAY:
567
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800568 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800569 DisplayInfo mainDisplayInfo;
570 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
571
572 sp<IBinder> vDisplay;
573 sp<IGraphicBufferProducer> producer;
574 sp<IGraphicBufferConsumer> consumer;
575 sp<BufferItemConsumer> itemConsumer;
576 BufferQueue::createBufferQueue(&producer, &consumer);
577
578 consumer->setConsumerName(String8("Virtual disp consumer"));
579 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
580
581 itemConsumer = new BufferItemConsumer(consumer,
582 // Sample usage bits from screenrecord
583 GRALLOC_USAGE_HW_VIDEO_ENCODER |
584 GRALLOC_USAGE_SW_READ_OFTEN);
585
586 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
587 false /*secure*/);
588
589 SurfaceComposerClient::Transaction t;
590 t.setDisplaySurface(vDisplay, producer);
591 t.setDisplayLayerStack(vDisplay, 0);
592 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
593 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
594 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
595 t.apply();
596 SurfaceComposerClient::Transaction().apply(true);
597 BufferItem item;
598 itemConsumer->acquireBuffer(&item, 0, true);
599 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
600 itemConsumer->releaseBuffer(item);
601 SurfaceComposerClient::destroyDisplay(vDisplay);
602 return sc;
603 }
604 }
605
606protected:
607 LayerTransactionTest* mDelegate;
608 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700609};
610
Alec Mouri80863a62019-01-17 15:19:35 -0800611class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700612public:
Alec Mouri80863a62019-01-17 15:19:35 -0800613 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700614
615 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800616 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700617 // if the flags already have a layer type specified, return an error
618 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
619 return nullptr;
620 }
chaviwf66724d2018-11-28 16:35:21 -0800621 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700622 }
623
624 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
625 int32_t bufferHeight) {
626 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
627 bufferWidth, bufferHeight));
628 }
629
630 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
631 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
632 const Color& bottomLeft, const Color& bottomRight) {
633 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
634 bufferWidth, bufferHeight,
635 topLeft, topRight,
636 bottomLeft, bottomRight));
637 }
638
639protected:
640 uint32_t mLayerType;
641};
642
Alec Mouri80863a62019-01-17 15:19:35 -0800643class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
644 public ::testing::WithParamInterface<uint32_t> {
645public:
646 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
647};
648
649class LayerTypeAndRenderTypeTransactionTest
650 : public LayerTypeTransactionHarness,
651 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
652public:
653 LayerTypeAndRenderTypeTransactionTest()
654 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
655 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
656
657 std::unique_ptr<ScreenCapture> getScreenCapture() {
658 return mRenderPathHarness.getScreenCapture();
659 }
660
661protected:
662 LayerRenderPathTestHarness mRenderPathHarness;
663};
664
665// Environment for starting up binder threads. This is required for testing
666// virtual displays, as BufferQueue parameters may be queried over binder.
667class BinderEnvironment : public ::testing::Environment {
668public:
669 void SetUp() override { ProcessState::self()->startThreadPool(); }
670};
671
672::testing::Environment* const binderEnv =
673 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
674
675class LayerRenderTypeTransactionTest : public LayerTransactionTest,
676 public ::testing::WithParamInterface<RenderPath> {
677public:
678 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
679
680 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
681 void setRelativeZBasicHelper(uint32_t layerType);
682 void setRelativeZGroupHelper(uint32_t layerType);
683 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800684 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
685 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800686
687protected:
688 LayerRenderPathTestHarness mHarness;
689};
690
691INSTANTIATE_TEST_CASE_P(
692 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
693 ::testing::Combine(
694 ::testing::Values(
695 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
696 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
697 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
698
699INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
700 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
701
Marissa Wall61c58622018-07-18 10:12:20 -0700702INSTANTIATE_TEST_CASE_P(
703 LayerTypeTransactionTests, LayerTypeTransactionTest,
704 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
705 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
706
Alec Mouri80863a62019-01-17 15:19:35 -0800707TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700708 sp<SurfaceControl> layer;
709 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700710 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700711
712 {
713 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700714 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800715 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700716 shot->expectColor(rect, Color::RED);
717 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700718 }
719
720 Transaction().setPosition(layer, 5, 10).apply();
721 {
722 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700723 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800724 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700725 shot->expectColor(rect, Color::RED);
726 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700727 }
728}
729
Alec Mouri80863a62019-01-17 15:19:35 -0800730TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700731 sp<SurfaceControl> layer;
732 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700733 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700734
735 // GLES requires only 4 bits of subpixel precision during rasterization
736 // XXX GLES composition does not match HWC composition due to precision
737 // loss (b/69315223)
738 const float epsilon = 1.0f / 16.0f;
739 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
740 {
741 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800742 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700743 }
744
745 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
746 {
747 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800748 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700749 }
750}
751
Alec Mouri80863a62019-01-17 15:19:35 -0800752TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700753 sp<SurfaceControl> layer;
754 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700755 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700756
757 Transaction().setPosition(layer, -32, -32).apply();
758 {
759 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762
763 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
764 {
765 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800766 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700767 }
768}
769
Alec Mouri80863a62019-01-17 15:19:35 -0800770TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 sp<SurfaceControl> layer;
772 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700773 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700774
775 // partially out of bounds
776 Transaction().setPosition(layer, -30, -30).apply();
777 {
778 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800779 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700780 }
781
782 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
783 {
784 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800785 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
786 mDisplayHeight),
787 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700788 }
789}
790
Alec Mouri80863a62019-01-17 15:19:35 -0800791TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700792 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700793 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
794 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700795
796 // setPosition is applied immediately by default, with or without resize
797 // pending
798 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
799 {
800 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800801 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700802 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700803 shot->expectColor(rect, Color::RED);
804 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700805 }
806
Marissa Wall861616d2018-10-22 12:52:23 -0700807 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700808 {
809 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800810 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700811 }
812}
813
Alec Mouri80863a62019-01-17 15:19:35 -0800814TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700815 sp<SurfaceControl> layer;
816 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700817 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700818
819 // request setPosition to be applied with the next resize
820 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
821 {
822 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800823 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700824 }
825
826 Transaction().setPosition(layer, 15, 20).apply();
827 {
828 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800829 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700830 }
831
832 Transaction().setSize(layer, 64, 64).apply();
833 {
834 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800835 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700836 }
837
838 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700839 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700840 {
841 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800842 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700843 }
844}
845
Alec Mouri80863a62019-01-17 15:19:35 -0800846TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700847 sp<SurfaceControl> layer;
848 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700849 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700850
851 // setPosition is not immediate even with SCALE_TO_WINDOW override
852 Transaction()
853 .setPosition(layer, 5, 10)
854 .setSize(layer, 64, 64)
855 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
856 .setGeometryAppliesWithResize(layer)
857 .apply();
858 {
859 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862
Marissa Wall61c58622018-07-18 10:12:20 -0700863 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700864 {
865 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800866 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700867 }
868}
869
Alec Mouri80863a62019-01-17 15:19:35 -0800870TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700871 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700872 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
873 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700874
875 Transaction().setSize(layer, 64, 64).apply();
876 {
877 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800878 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700879 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700880 shot->expectColor(rect, Color::RED);
881 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700882 }
883
Marissa Wall861616d2018-10-22 12:52:23 -0700884 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700885 {
886 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800887 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700888 const Rect rect(0, 0, 64, 64);
889 shot->expectColor(rect, Color::RED);
890 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700891 }
892}
893
Alec Mouri80863a62019-01-17 15:19:35 -0800894TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700895 // cannot test robustness against invalid sizes (zero or really huge)
896}
897
Alec Mouri80863a62019-01-17 15:19:35 -0800898TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700899 sp<SurfaceControl> layer;
900 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700901 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700902
903 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
904 Transaction()
905 .setSize(layer, 64, 64)
906 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
907 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800908 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700909}
910
Alec Mouri80863a62019-01-17 15:19:35 -0800911TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700912 sp<SurfaceControl> layerR;
913 sp<SurfaceControl> layerG;
914 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700915 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700916 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700917 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700918
919 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
920 {
921 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800922 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700923 }
924
925 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
926 {
927 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800928 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700929 }
930}
931
Alec Mouri80863a62019-01-17 15:19:35 -0800932TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700933 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800934 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700935 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800936 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700937 sp<SurfaceControl> layerR;
938 sp<SurfaceControl> layerG;
939 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700940 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700941 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700942 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700943
chaviw0e3479f2018-09-10 16:49:30 -0700944 Transaction()
945 .reparent(layerR, parent->getHandle())
946 .reparent(layerG, parent->getHandle())
947 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700948 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
949 {
950 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800951 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700952 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700953 }
954
955 Transaction().setLayer(layerR, -3).apply();
956 {
957 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800958 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700959 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700960 }
961}
962
Alec Mouri80863a62019-01-17 15:19:35 -0800963void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700964 sp<SurfaceControl> layerR;
965 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700966 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
967 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
968 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
969 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700970
Marissa Wall861616d2018-10-22 12:52:23 -0700971 switch (layerType) {
972 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
973 Transaction()
974 .setPosition(layerG, 16, 16)
975 .setRelativeLayer(layerG, layerR->getHandle(), 1)
976 .apply();
977 break;
978 case ISurfaceComposerClient::eFXSurfaceBufferState:
979 Transaction()
980 .setFrame(layerR, Rect(0, 0, 32, 32))
981 .setFrame(layerG, Rect(16, 16, 48, 48))
982 .setRelativeLayer(layerG, layerR->getHandle(), 1)
983 .apply();
984 break;
985 default:
986 ASSERT_FALSE(true) << "Unsupported layer type";
987 }
Chia-I Wu49313302017-10-31 10:14:40 -0700988 {
989 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800990 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700991 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
992 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
993 }
994
995 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
996 {
997 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800998 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700999 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1000 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1001 }
1002}
1003
Alec Mouri80863a62019-01-17 15:19:35 -08001004TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001005 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1006}
1007
Alec Mouri80863a62019-01-17 15:19:35 -08001008TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001009 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1010}
1011
Marissa Wall61c58622018-07-18 10:12:20 -07001012TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001013 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001014 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001015 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001016 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001017 sp<SurfaceControl> layerR;
1018 sp<SurfaceControl> layerG;
1019 sp<SurfaceControl> layerB;
1020 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001021 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001022 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001023 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001024 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001025 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001026
chaviw0e3479f2018-09-10 16:49:30 -07001027 Transaction()
1028 .reparent(layerB, parent->getHandle())
1029 .apply();
1030
Chia-I Wuec2d9852017-11-21 09:21:01 -08001031 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1032 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1033
chaviw0e3479f2018-09-10 16:49:30 -07001034 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001035 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001036 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001037 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001038 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1039}
1040
Alec Mouri80863a62019-01-17 15:19:35 -08001041void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001042 sp<SurfaceControl> layerR;
1043 sp<SurfaceControl> layerG;
1044 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001045 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1046 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1047 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1048 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1049 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1050 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001051
1052 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001053 switch (layerType) {
1054 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1055 Transaction()
1056 .setPosition(layerG, 8, 8)
1057 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1058 .setPosition(layerB, 16, 16)
1059 .setLayer(layerB, mLayerZBase + 2)
1060 .apply();
1061 break;
1062 case ISurfaceComposerClient::eFXSurfaceBufferState:
1063 Transaction()
1064 .setFrame(layerR, Rect(0, 0, 32, 32))
1065 .setFrame(layerG, Rect(8, 8, 40, 40))
1066 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1067 .setFrame(layerB, Rect(16, 16, 48, 48))
1068 .setLayer(layerB, mLayerZBase + 2)
1069 .apply();
1070 break;
1071 default:
1072 ASSERT_FALSE(true) << "Unsupported layer type";
1073 }
1074
Chia-I Wu49313302017-10-31 10:14:40 -07001075 {
1076 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001077 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001078 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1079 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1080 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1081 }
1082
1083 // layerR = 4, layerG = layerR + 3, layerB = 2
1084 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1085 {
1086 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001087 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001088 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1089 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1090 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1091 }
1092
1093 // layerR = 4, layerG = layerR - 3, layerB = 2
1094 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1095 {
1096 SCOPED_TRACE("layerB < (layerG < 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, 40, 40), Color::GREEN);
1100 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1101 }
1102
1103 // restore to absolute z
1104 // layerR = 4, layerG = 0, layerB = 2
1105 Transaction().setLayer(layerG, mLayerZBase).apply();
1106 {
1107 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001108 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001109 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1110 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1111 }
1112
1113 // layerR should not affect layerG anymore
1114 // layerR = 1, layerG = 0, layerB = 2
1115 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1116 {
1117 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001118 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001119 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1120 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1121 }
1122}
1123
Alec Mouri80863a62019-01-17 15:19:35 -08001124TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001125 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1126}
1127
Alec Mouri80863a62019-01-17 15:19:35 -08001128TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001129 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1130}
1131
Alec Mouri80863a62019-01-17 15:19:35 -08001132TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001133 sp<SurfaceControl> layerR;
1134 sp<SurfaceControl> layerG;
1135
1136 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001137 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001138 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001139 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001140
1141 Transaction()
1142 .setPosition(layerG, 16, 16)
1143 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1144 .apply();
1145
Robert Carr87246532019-02-04 15:20:26 -08001146 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001147 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001148 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001149}
1150
Alec Mouri80863a62019-01-17 15:19:35 -08001151TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001152 sp<SurfaceControl> layer;
1153 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001154 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001155
1156 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1157 {
1158 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001159 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001160 }
1161
1162 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1163 {
1164 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001165 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001166 }
1167}
1168
Alec Mouri80863a62019-01-17 15:19:35 -08001169TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001170 const Color translucentRed = {100, 0, 0, 100};
1171 sp<SurfaceControl> layerR;
1172 sp<SurfaceControl> layerG;
1173 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001174 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001175 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001176 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001177
1178 Transaction()
1179 .setLayer(layerR, mLayerZBase + 1)
1180 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1181 .apply();
1182 {
1183 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001184 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001185 }
1186
1187 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1188 {
1189 SCOPED_TRACE("layerR translucent");
1190 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001191 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001192 }
1193}
1194
Marissa Wall61c58622018-07-18 10:12:20 -07001195TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001196 sp<SurfaceControl> layer;
1197 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001198 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001199
1200 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001201 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001202 Transaction()
1203 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1204 .apply(true);
1205 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001206 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001207
1208 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1209 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001210 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001211}
1212
Alec Mouri80863a62019-01-17 15:19:35 -08001213TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001214 const Rect top(0, 0, 32, 16);
1215 const Rect bottom(0, 16, 32, 32);
1216 sp<SurfaceControl> layer;
1217 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1218
1219 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001220 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1221 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1222 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001223 // setTransparentRegionHint always applies to the following buffer
1224 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001225 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001226 {
1227 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001228 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001229 shot->expectColor(top, Color::BLACK);
1230 shot->expectColor(bottom, Color::RED);
1231 }
1232
1233 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1234 {
1235 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001236 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001237 shot->expectColor(top, Color::BLACK);
1238 shot->expectColor(bottom, Color::RED);
1239 }
1240
Marissa Wall61c58622018-07-18 10:12:20 -07001241 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1242 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1243 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1244 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001245 {
1246 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001247 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001248 shot->expectColor(top, Color::RED);
1249 shot->expectColor(bottom, Color::BLACK);
1250 }
1251}
1252
Alec Mouri80863a62019-01-17 15:19:35 -08001253TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001254 const Rect top(0, 0, 32, 16);
1255 const Rect bottom(0, 16, 32, 32);
1256 sp<SurfaceControl> layer;
1257 ASSERT_NO_FATAL_FAILURE(
1258 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1259
1260 sp<GraphicBuffer> buffer =
1261 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1262 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1263 BufferUsage::COMPOSER_OVERLAY,
1264 "test");
1265
1266 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1267 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1268 Transaction()
1269 .setTransparentRegionHint(layer, Region(top))
1270 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001271 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001272 .apply();
1273 {
1274 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001275 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001276 shot->expectColor(top, Color::BLACK);
1277 shot->expectColor(bottom, Color::RED);
1278 }
1279
1280 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1281 {
1282 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001283 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001284 shot->expectColor(top, Color::BLACK);
1285 shot->expectColor(bottom, Color::BLACK);
1286 }
1287
1288 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1289 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1290 BufferUsage::COMPOSER_OVERLAY,
1291 "test");
1292
1293 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1294 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001295 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001296 {
1297 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001298 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001299 shot->expectColor(top, Color::RED);
1300 shot->expectColor(bottom, Color::BLACK);
1301 }
1302}
1303
Alec Mouri80863a62019-01-17 15:19:35 -08001304TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001305 sp<SurfaceControl> layerTransparent;
1306 sp<SurfaceControl> layerR;
1307 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1308 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1309
1310 // check that transparent region hint is bound by the layer size
1311 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001312 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001313 .setPosition(layerR, 16, 16)
1314 .setLayer(layerR, mLayerZBase + 1)
1315 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001316 ASSERT_NO_FATAL_FAILURE(
1317 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1318 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001319 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001320}
1321
Alec Mouri80863a62019-01-17 15:19:35 -08001322TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001323 sp<SurfaceControl> layerTransparent;
1324 sp<SurfaceControl> layerR;
1325 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1326 ASSERT_NO_FATAL_FAILURE(
1327 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1328
1329 // check that transparent region hint is bound by the layer size
1330 Transaction()
1331 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1332 .setFrame(layerR, Rect(16, 16, 48, 48))
1333 .setLayer(layerR, mLayerZBase + 1)
1334 .apply();
1335 ASSERT_NO_FATAL_FAILURE(
1336 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1337 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001338 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001339}
1340
Alec Mouri80863a62019-01-17 15:19:35 -08001341void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001342 sp<SurfaceControl> layer1;
1343 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001344 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1345 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1346 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1347 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001348
Marissa Wall861616d2018-10-22 12:52:23 -07001349 switch (layerType) {
1350 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1351 Transaction()
1352 .setAlpha(layer1, 0.25f)
1353 .setAlpha(layer2, 0.75f)
1354 .setPosition(layer2, 16, 0)
1355 .setLayer(layer2, mLayerZBase + 1)
1356 .apply();
1357 break;
1358 case ISurfaceComposerClient::eFXSurfaceBufferState:
1359 Transaction()
1360 .setAlpha(layer1, 0.25f)
1361 .setAlpha(layer2, 0.75f)
1362 .setFrame(layer1, Rect(0, 0, 32, 32))
1363 .setFrame(layer2, Rect(16, 0, 48, 32))
1364 .setLayer(layer2, mLayerZBase + 1)
1365 .apply();
1366 break;
1367 default:
1368 ASSERT_FALSE(true) << "Unsupported layer type";
1369 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001370 {
Alec Mouri80863a62019-01-17 15:19:35 -08001371 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001372 uint8_t r = 16; // 64 * 0.25f
1373 uint8_t g = 48; // 64 * 0.75f
1374 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1375 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1376
1377 r /= 4; // r * (1.0f - 0.75f)
1378 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1379 }
1380}
1381
Alec Mouri80863a62019-01-17 15:19:35 -08001382TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001383 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1384}
1385
Alec Mouri80863a62019-01-17 15:19:35 -08001386TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001387 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1388}
1389
Alec Mouri80863a62019-01-17 15:19:35 -08001390TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001391 const Color color = {64, 0, 0, 255};
1392 sp<SurfaceControl> layer;
1393 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001394 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001395
1396 Transaction().setAlpha(layer, 2.0f).apply();
1397 {
1398 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001399 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001400 }
1401
1402 Transaction().setAlpha(layer, -1.0f).apply();
1403 {
1404 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001405 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001406 }
1407}
1408
Alec Mouri80863a62019-01-17 15:19:35 -08001409TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001410 sp<SurfaceControl> layer;
1411 const uint8_t size = 64;
1412 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001413 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001414 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1415 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1416
1417 Transaction()
1418 .setCornerRadius(layer, cornerRadius)
1419 .apply();
1420 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001421 const uint8_t bottom = size - 1;
1422 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001423 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001424 // Transparent corners
1425 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001426 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1427 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1428 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1429 }
1430}
1431
Alec Mouri80863a62019-01-17 15:19:35 -08001432TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001433 sp<SurfaceControl> parent;
1434 sp<SurfaceControl> child;
1435 const uint8_t size = 64;
1436 const uint8_t testArea = 4;
1437 const float cornerRadius = 20.0f;
1438 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1439 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1440 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1441 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1442
1443 Transaction()
1444 .setCornerRadius(parent, cornerRadius)
1445 .reparent(child, parent->getHandle())
1446 .setPosition(child, 0, size / 2)
1447 .apply();
1448 {
1449 const uint8_t bottom = size - 1;
1450 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001451 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001452 // Top edge of child should not have rounded corners because it's translated in the parent
1453 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1454 Color::GREEN);
1455 // But bottom edges should have been clipped according to parent bounds
1456 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1457 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001458 }
1459}
1460
Alec Mouri80863a62019-01-17 15:19:35 -08001461TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001462 sp<SurfaceControl> bufferLayer;
1463 sp<SurfaceControl> colorLayer;
1464 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001465 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001466 ASSERT_NO_FATAL_FAILURE(colorLayer =
1467 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1468 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001469
Vishnu Nair88a11f22018-11-28 18:30:57 -08001470 Transaction()
1471 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1472 .setLayer(colorLayer, mLayerZBase + 1)
1473 .apply();
1474
Chia-I Wue4ef6102017-11-01 15:16:35 -07001475 {
1476 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001477 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001478 }
1479
1480 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1481 const Color expected = {15, 51, 85, 255};
1482 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1483 // channel) should be less than one
1484 const uint8_t tolerance = 1;
1485 Transaction().setColor(colorLayer, color).apply();
1486 {
1487 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001488 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001489 }
1490}
1491
Valerie Haudd0b7572019-01-29 14:59:27 -08001492// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1493// BLUE: prior background color
1494// GREEN: final background color
1495// BLACK: no color or fill
1496void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1497 bool bufferFill, float alpha,
1498 Color finalColor) {
1499 sp<SurfaceControl> layer;
1500 int32_t width = 500;
1501 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001502
Valerie Haudd0b7572019-01-29 14:59:27 -08001503 Color fillColor = Color::RED;
1504 Color priorBgColor = Color::BLUE;
1505 Color expectedColor = Color::BLACK;
1506 switch (layerType) {
1507 case ISurfaceComposerClient::eFXSurfaceColor:
1508 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1509 Transaction()
1510 .setCrop_legacy(layer, Rect(0, 0, width, height))
1511 .setColor(layer, half3(1.0f, 0, 0))
1512 .apply();
1513 expectedColor = fillColor;
1514 break;
1515 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1516 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1517 if (bufferFill) {
1518 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1519 expectedColor = fillColor;
1520 }
1521 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1522 break;
1523 case ISurfaceComposerClient::eFXSurfaceBufferState:
1524 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1525 if (bufferFill) {
1526 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1527 expectedColor = fillColor;
1528 }
1529 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1530 break;
1531 default:
1532 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1533 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001534 }
1535
Valerie Haudd0b7572019-01-29 14:59:27 -08001536 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1537 Transaction()
1538 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1539 .apply();
1540 if (!bufferFill) {
1541 expectedColor = priorBgColor;
1542 }
1543 }
1544
1545 {
1546 SCOPED_TRACE("default before setting background color layer");
1547 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1548 }
Valerie Haua72e2812019-01-23 13:40:39 -08001549 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001550 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001551 .apply();
1552
1553 {
Valerie Haua72e2812019-01-23 13:40:39 -08001554 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001555 shot->expectColor(Rect(0, 0, width, height), finalColor);
1556 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001557 }
1558}
1559
Valerie Haudd0b7572019-01-29 14:59:27 -08001560TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1561 bool priorColor = false;
1562 bool bufferFill = false;
1563 float alpha = 1.0f;
1564 Color finalColor = Color::RED;
1565 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1566 priorColor, bufferFill, alpha, finalColor));
1567}
Valerie Haua72e2812019-01-23 13:40:39 -08001568
Valerie Haudd0b7572019-01-29 14:59:27 -08001569TEST_P(LayerRenderTypeTransactionTest,
1570 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1571 bool priorColor = false;
1572 bool bufferFill = true;
1573 float alpha = 1.0f;
1574 Color finalColor = Color::RED;
1575 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1576 priorColor, bufferFill, alpha, finalColor));
1577}
Valerie Haua72e2812019-01-23 13:40:39 -08001578
Valerie Haudd0b7572019-01-29 14:59:27 -08001579TEST_P(LayerRenderTypeTransactionTest,
1580 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1581 bool priorColor = false;
1582 bool bufferFill = false;
1583 float alpha = 1.0f;
1584 Color finalColor = Color::GREEN;
1585 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1586 priorColor, bufferFill, alpha, finalColor));
1587}
Valerie Haua72e2812019-01-23 13:40:39 -08001588
Valerie Haudd0b7572019-01-29 14:59:27 -08001589TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1590 bool priorColor = true;
1591 bool bufferFill = true;
1592 float alpha = 1.0f;
1593 Color finalColor = Color::RED;
1594 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1595 priorColor, bufferFill, alpha, finalColor));
1596}
1597
1598TEST_P(LayerRenderTypeTransactionTest,
1599 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1600 bool priorColor = true;
1601 bool bufferFill = false;
1602 float alpha = 1.0f;
1603 Color finalColor = Color::GREEN;
1604 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1605 priorColor, bufferFill, alpha, finalColor));
1606}
1607TEST_P(LayerRenderTypeTransactionTest,
1608 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1609 bool priorColor = false;
1610 bool bufferFill = false;
1611 float alpha = 0;
1612 Color finalColor = Color::BLACK;
1613 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1614 priorColor, bufferFill, alpha, finalColor));
1615}
1616
1617TEST_P(LayerRenderTypeTransactionTest,
1618 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1619 bool priorColor = true;
1620 bool bufferFill = false;
1621 float alpha = 0;
1622 Color finalColor = Color::BLACK;
1623 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1624 priorColor, bufferFill, alpha, finalColor));
1625}
1626
1627TEST_P(LayerRenderTypeTransactionTest,
1628 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1629 bool priorColor = false;
1630 bool bufferFill = true;
1631 float alpha = 1.0f;
1632 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001633 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001634 priorColor, bufferFill, alpha, finalColor));
1635}
1636
1637TEST_P(LayerRenderTypeTransactionTest,
1638 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1639 bool priorColor = false;
1640 bool bufferFill = false;
1641 float alpha = 1.0f;
1642 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001643 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001644 priorColor, bufferFill, alpha, finalColor));
1645}
1646
1647TEST_P(LayerRenderTypeTransactionTest,
1648 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1649 bool priorColor = true;
1650 bool bufferFill = false;
1651 float alpha = 1.0f;
1652 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001653 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001654 priorColor, bufferFill, alpha, finalColor));
1655}
1656
1657TEST_P(LayerRenderTypeTransactionTest,
1658 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1659 bool priorColor = false;
1660 bool bufferFill = false;
1661 float alpha = 0;
1662 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001663 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001664 priorColor, bufferFill, alpha, finalColor));
1665}
1666
1667TEST_P(LayerRenderTypeTransactionTest,
1668 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1669 bool priorColor = true;
1670 bool bufferFill = false;
1671 float alpha = 0;
1672 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001673 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001674 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001675}
1676
Alec Mouri80863a62019-01-17 15:19:35 -08001677TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001678 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001679 ASSERT_NO_FATAL_FAILURE(colorLayer =
1680 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1681 ISurfaceComposerClient::eFXSurfaceColor));
1682 Transaction()
1683 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1684 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1685 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001686
Alec Mouri80863a62019-01-17 15:19:35 -08001687 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001688}
1689
Alec Mouri80863a62019-01-17 15:19:35 -08001690TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001691 sp<SurfaceControl> bufferLayer;
1692 sp<SurfaceControl> colorLayer;
1693 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001694 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001695 ASSERT_NO_FATAL_FAILURE(colorLayer =
1696 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1697 ISurfaceComposerClient::eFXSurfaceColor));
1698 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001699
1700 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1701 const float alpha = 0.25f;
1702 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1703 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1704 // channel) should be less than one
1705 const uint8_t tolerance = 1;
1706 Transaction()
1707 .setColor(colorLayer, color)
1708 .setAlpha(colorLayer, alpha)
1709 .setLayer(colorLayer, mLayerZBase + 1)
1710 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001711 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1712 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001713}
1714
Alec Mouri80863a62019-01-17 15:19:35 -08001715TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001716 sp<SurfaceControl> bufferLayer;
1717 sp<SurfaceControl> parentLayer;
1718 sp<SurfaceControl> colorLayer;
1719 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1720 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001721 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001722 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1723 0 /* buffer height */,
1724 ISurfaceComposerClient::eFXSurfaceColor));
1725 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001726 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1727 const float alpha = 0.25f;
1728 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1729 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1730 // channel) should be less than one
1731 const uint8_t tolerance = 1;
1732 Transaction()
1733 .reparent(colorLayer, parentLayer->getHandle())
1734 .setColor(colorLayer, color)
1735 .setAlpha(parentLayer, alpha)
1736 .setLayer(parentLayer, mLayerZBase + 1)
1737 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001738 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1739 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001740}
1741
Alec Mouri80863a62019-01-17 15:19:35 -08001742TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001743 sp<SurfaceControl> bufferLayer;
1744 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001745 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001746
1747 // color is ignored
1748 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001749 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001750}
1751
Alec Mouri80863a62019-01-17 15:19:35 -08001752TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001753 sp<SurfaceControl> layer;
1754 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001755 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001756
1757 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1758 {
1759 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001760 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001761 }
1762
1763 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1764 {
1765 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001766 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001767 }
1768}
1769
Alec Mouri80863a62019-01-17 15:19:35 -08001770TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001771 sp<SurfaceControl> layer;
1772 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001773 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1774 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001775
1776 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1777 {
1778 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001779 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1780 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001781 }
1782
1783 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1784 {
1785 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001786 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1787 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001788 }
1789
1790 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1791 {
1792 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001793 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1794 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001795 }
1796
1797 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1798 {
1799 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001800 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1801 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001802 }
1803
1804 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1805 {
1806 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001807 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1808 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001809 }
1810}
1811
Alec Mouri80863a62019-01-17 15:19:35 -08001812TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001813 sp<SurfaceControl> layer;
1814 ASSERT_NO_FATAL_FAILURE(
1815 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1816 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1817 Color::BLUE, Color::WHITE));
1818
1819 Transaction()
1820 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1821 .setFrame(layer, Rect(0, 0, 32, 32))
1822 .apply();
1823 {
1824 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001825 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1826 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001827 }
1828
1829 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1830 {
1831 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001832 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1833 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001834 }
1835
1836 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1837 {
1838 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001839 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1840 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001841 }
1842
1843 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1844 {
1845 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001846 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1847 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001848 }
1849
1850 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1851 {
1852 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001853 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1854 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001855 }
1856}
1857
Alec Mouri80863a62019-01-17 15:19:35 -08001858TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001859 sp<SurfaceControl> layer;
1860 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001861 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1862 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001863
1864 const float rot = M_SQRT1_2; // 45 degrees
1865 const float trans = M_SQRT2 * 16.0f;
1866 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1867
Alec Mouri80863a62019-01-17 15:19:35 -08001868 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001869 // check a 8x8 region inside each color
1870 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1871 const int32_t halfL = 4;
1872 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1873 };
1874 const int32_t unit = int32_t(trans / 2);
1875 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1876 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1877 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1878 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1879}
1880
Alec Mouri80863a62019-01-17 15:19:35 -08001881TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001882 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001883 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1884 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001885
1886 // setMatrix is applied after any pending resize, unlike setPosition
1887 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1888 {
1889 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001890 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001891 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001892 shot->expectColor(rect, Color::RED);
1893 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001894 }
1895
Marissa Wall861616d2018-10-22 12:52:23 -07001896 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001897 {
1898 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001899 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001900 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001901 }
1902}
1903
Alec Mouri80863a62019-01-17 15:19:35 -08001904TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001905 sp<SurfaceControl> layer;
1906 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001907 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001908
1909 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1910 Transaction()
1911 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1912 .setSize(layer, 64, 64)
1913 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1914 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001915 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001916}
1917
Alec Mouri80863a62019-01-17 15:19:35 -08001918TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001919 sp<SurfaceControl> layer;
1920 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001921 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1922 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001923
1924 // XXX SCALE_CROP is not respected; calling setSize and
1925 // setOverrideScalingMode in separate transactions does not work
1926 // (b/69315456)
1927 Transaction()
1928 .setSize(layer, 64, 16)
1929 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1930 .apply();
1931 {
1932 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001933 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1934 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001935 }
1936}
1937
Dan Stoza000dd012018-08-01 13:31:52 -07001938TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1939 sp<SurfaceControl> layer;
1940 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1941
1942 sp<IBinder> handle = layer->getHandle();
1943 ASSERT_TRUE(handle != nullptr);
1944
1945 FrameStats frameStats;
1946 mClient->getLayerFrameStats(handle, &frameStats);
1947
1948 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1949}
1950
Alec Mouri80863a62019-01-17 15:19:35 -08001951TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001952 sp<SurfaceControl> layer;
1953 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001954 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001955 const Rect crop(8, 8, 24, 24);
1956
Marissa Wallf58c14b2018-07-24 10:50:43 -07001957 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001958 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07001959 shot->expectColor(crop, Color::RED);
1960 shot->expectBorder(crop, Color::BLACK);
1961}
1962
Alec Mouri80863a62019-01-17 15:19:35 -08001963TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001964 sp<SurfaceControl> layer;
1965 ASSERT_NO_FATAL_FAILURE(
1966 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1967 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1968 const Rect crop(8, 8, 24, 24);
1969
1970 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001971 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001972 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1973 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07001974}
1975
Alec Mouri80863a62019-01-17 15:19:35 -08001976TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001977 sp<SurfaceControl> layer;
1978 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001979 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001980
1981 {
1982 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001983 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001984 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001985 }
1986
1987 {
1988 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07001989 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001990 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07001991 }
1992}
1993
Alec Mouri80863a62019-01-17 15:19:35 -08001994TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001995 sp<SurfaceControl> layer;
1996 ASSERT_NO_FATAL_FAILURE(
1997 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1998 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
1999
2000 {
2001 SCOPED_TRACE("empty rect");
2002 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002003 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002004 }
2005
2006 {
2007 SCOPED_TRACE("negative rect");
2008 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002009 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002010 }
2011}
2012
Alec Mouri80863a62019-01-17 15:19:35 -08002013TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002014 sp<SurfaceControl> layer;
2015 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002016 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002017
Marissa Wallf58c14b2018-07-24 10:50:43 -07002018 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002019 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002020 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2021 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2022}
2023
Alec Mouri80863a62019-01-17 15:19:35 -08002024TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002025 sp<SurfaceControl> layer;
2026 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2027 ISurfaceComposerClient::eFXSurfaceBufferState));
2028 sp<GraphicBuffer> buffer =
2029 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2030 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2031 BufferUsage::COMPOSER_OVERLAY,
2032 "test");
2033 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2034 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2035 Color::RED);
2036
2037 Transaction().setBuffer(layer, buffer).apply();
2038
2039 // Partially out of bounds in the negative (upper left) direction
2040 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2041 {
2042 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002043 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002044 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2045 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2046 }
2047
2048 // Partially out of bounds in the positive (lower right) direction
2049 Transaction()
2050 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2051 .apply();
2052 {
2053 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002054 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002055 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2056 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2057 }
2058
2059 // Fully out of buffer space bounds
2060 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2061 {
2062 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002063 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002064 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2065 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2066 Color::RED);
2067 }
2068}
2069
Alec Mouri80863a62019-01-17 15:19:35 -08002070TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002071 sp<SurfaceControl> layer;
2072 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002073 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002074
2075 const Point position(32, 32);
2076 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002077 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002078 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002079 shot->expectColor(crop + position, Color::RED);
2080 shot->expectBorder(crop + position, Color::BLACK);
2081}
2082
Alec Mouri80863a62019-01-17 15:19:35 -08002083TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002084 sp<SurfaceControl> layer;
2085 ASSERT_NO_FATAL_FAILURE(
2086 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2087 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2088
Marissa Wall861616d2018-10-22 12:52:23 -07002089 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002090 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002091 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002092 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002093 shot->expectColor(frame, Color::RED);
2094 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002095}
2096
Alec Mouri80863a62019-01-17 15:19:35 -08002097TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002098 sp<SurfaceControl> layer;
2099 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002100 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002101
Marissa Wall861616d2018-10-22 12:52:23 -07002102 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002103 Transaction()
2104 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002105 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002106 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002107 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002108 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2109 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2110}
2111
Alec Mouri80863a62019-01-17 15:19:35 -08002112TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002113 sp<SurfaceControl> layer;
2114 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002115 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002116
Marissa Wallf58c14b2018-07-24 10:50:43 -07002117 // setCrop_legacy is applied immediately by default, with or without resize pending
2118 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002119 {
2120 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002121 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002122 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2123 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2124 }
2125
Marissa Wall61c58622018-07-18 10:12:20 -07002126 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002127 {
2128 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002129 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002130 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2131 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2132 }
2133}
2134
Alec Mouri80863a62019-01-17 15:19:35 -08002135TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002136 sp<SurfaceControl> layer;
2137 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002138 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002139
Marissa Wallf58c14b2018-07-24 10:50:43 -07002140 // request setCrop_legacy to be applied with the next resize
2141 Transaction()
2142 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2143 .setGeometryAppliesWithResize(layer)
2144 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002145 {
2146 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002147 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002148 }
2149
Marissa Wallf58c14b2018-07-24 10:50:43 -07002150 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002151 {
2152 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002153 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002154 }
2155
2156 Transaction().setSize(layer, 16, 16).apply();
2157 {
2158 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002159 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002160 }
2161
2162 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002163 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002164 {
2165 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002166 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002167 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2168 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2169 }
2170}
2171
Alec Mouri80863a62019-01-17 15:19:35 -08002172TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002173 sp<SurfaceControl> layer;
2174 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002175 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002176
Marissa Wallf58c14b2018-07-24 10:50:43 -07002177 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002178 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002179 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002180 .setSize(layer, 16, 16)
2181 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2182 .setGeometryAppliesWithResize(layer)
2183 .apply();
2184 {
2185 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002186 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002187 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2188 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2189 }
2190
2191 // XXX crop is never latched without other geometry change (b/69315677)
2192 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002193 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002194 Transaction().setPosition(layer, 0, 0).apply();
2195 {
2196 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002197 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2199 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2200 }
2201}
2202
Alec Mouri80863a62019-01-17 15:19:35 -08002203TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002204 sp<SurfaceControl> layer;
2205 ASSERT_NO_FATAL_FAILURE(
2206 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2207 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2208 const Rect frame(8, 8, 24, 24);
2209
2210 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002211 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002212 shot->expectColor(frame, Color::RED);
2213 shot->expectBorder(frame, Color::BLACK);
2214}
2215
Alec Mouri80863a62019-01-17 15:19:35 -08002216TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002217 sp<SurfaceControl> layer;
2218 ASSERT_NO_FATAL_FAILURE(
2219 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2220 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2221
Marissa Wall61c58622018-07-18 10:12:20 -07002222 {
Marissa Wall861616d2018-10-22 12:52:23 -07002223 SCOPED_TRACE("empty rect");
2224 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002225 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002226 }
2227
Marissa Wall61c58622018-07-18 10:12:20 -07002228 {
Marissa Wall861616d2018-10-22 12:52:23 -07002229 SCOPED_TRACE("negative rect");
2230 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002231 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002232 }
2233}
2234
Alec Mouri80863a62019-01-17 15:19:35 -08002235TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002236 sp<SurfaceControl> layer;
2237 ASSERT_NO_FATAL_FAILURE(
2238 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2239 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2240
2241 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002242 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002243 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2244 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2245}
2246
Alec Mouri80863a62019-01-17 15:19:35 -08002247TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002248 sp<SurfaceControl> parent, child;
2249 ASSERT_NO_FATAL_FAILURE(
2250 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2251 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2252 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2253
2254 ASSERT_NO_FATAL_FAILURE(
2255 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2256 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2257
2258 Transaction().reparent(child, parent->getHandle()).apply();
2259
2260 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002261 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002262 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2263 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2264}
2265
Alec Mouri80863a62019-01-17 15:19:35 -08002266TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002267 sp<SurfaceControl> parent, child;
2268 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2269 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2270
2271 ASSERT_NO_FATAL_FAILURE(
2272 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2273 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2274
2275 Transaction().reparent(child, parent->getHandle()).apply();
2276
2277 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002278 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002279 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2280 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2281}
2282
Alec Mouri80863a62019-01-17 15:19:35 -08002283TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002284 sp<SurfaceControl> layer;
2285 ASSERT_NO_FATAL_FAILURE(
2286 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2287 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2288 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2289
2290 std::this_thread::sleep_for(500ms);
2291
2292 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2293
Alec Mouri80863a62019-01-17 15:19:35 -08002294 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002295 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2296 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2297}
2298
Alec Mouri80863a62019-01-17 15:19:35 -08002299TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002300 sp<SurfaceControl> parent, child;
2301 ASSERT_NO_FATAL_FAILURE(
2302 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2303 ASSERT_NO_FATAL_FAILURE(
2304 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2305 Transaction().reparent(child, parent->getHandle()).apply();
2306
2307 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2308 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2309
2310 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2311 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2312
Alec Mouri80863a62019-01-17 15:19:35 -08002313 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002314 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2315 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2316 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2317}
2318
Alec Mouri80863a62019-01-17 15:19:35 -08002319TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002320 sp<SurfaceControl> layer;
2321 ASSERT_NO_FATAL_FAILURE(
2322 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2323
2324 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2325
Alec Mouri80863a62019-01-17 15:19:35 -08002326 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002327 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2328 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2329}
2330
Alec Mouri80863a62019-01-17 15:19:35 -08002331TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002332 sp<SurfaceControl> layer;
2333 ASSERT_NO_FATAL_FAILURE(
2334 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2335
2336 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2337
2338 {
2339 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002340 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002341 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2342 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2343 }
2344
2345 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2346
2347 {
2348 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002349 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002350 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2351 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2352 }
2353
2354 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2355
2356 {
2357 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002358 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002359 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2360 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2361 }
2362}
2363
Alec Mouri80863a62019-01-17 15:19:35 -08002364TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002365 sp<SurfaceControl> layer1;
2366 ASSERT_NO_FATAL_FAILURE(
2367 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2368
2369 sp<SurfaceControl> layer2;
2370 ASSERT_NO_FATAL_FAILURE(
2371 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2372
2373 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2374
Marissa Wall861616d2018-10-22 12:52:23 -07002375 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002376 {
2377 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002378 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002379 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2380 }
2381
2382 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2383
Marissa Wall861616d2018-10-22 12:52:23 -07002384 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002385 {
2386 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002387 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002388 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2389 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2390 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2391 }
2392
2393 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2394 {
2395 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002396 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002397 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2398 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2399 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2400 }
2401
2402 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2403
2404 {
2405 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002406 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002407 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2408 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2409 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2410 }
2411}
2412
Valerie Haua6b15a12019-02-05 14:16:30 -08002413TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002414 sp<SurfaceControl> layer;
2415 ASSERT_NO_FATAL_FAILURE(
2416 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2417
2418 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2419
2420 std::array<sp<GraphicBuffer>, 10> buffers;
2421
2422 size_t idx = 0;
2423 for (auto& buffer : buffers) {
2424 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2425 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2426 BufferUsage::COMPOSER_OVERLAY,
2427 "test");
2428 Color color = colors[idx % colors.size()];
2429 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2430 idx++;
2431 }
2432
2433 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2434 // cache is working.
2435 idx = 0;
2436 for (auto& buffer : buffers) {
2437 for (int i = 0; i < 2; i++) {
2438 Transaction().setBuffer(layer, buffer).apply();
2439
2440 Color color = colors[idx % colors.size()];
2441 auto shot = screenshot();
2442 shot->expectColor(Rect(0, 0, 32, 32), color);
2443 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2444 }
2445 idx++;
2446 }
2447}
2448
Valerie Haua6b15a12019-02-05 14:16:30 -08002449TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002450 sp<SurfaceControl> layer;
2451 ASSERT_NO_FATAL_FAILURE(
2452 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2453
2454 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2455
2456 std::array<sp<GraphicBuffer>, 70> buffers;
2457
2458 size_t idx = 0;
2459 for (auto& buffer : buffers) {
2460 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2461 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2462 BufferUsage::COMPOSER_OVERLAY,
2463 "test");
2464 Color color = colors[idx % colors.size()];
2465 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2466 idx++;
2467 }
2468
2469 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2470 // cache is working.
2471 idx = 0;
2472 for (auto& buffer : buffers) {
2473 for (int i = 0; i < 2; i++) {
2474 Transaction().setBuffer(layer, buffer).apply();
2475
2476 Color color = colors[idx % colors.size()];
2477 auto shot = screenshot();
2478 shot->expectColor(Rect(0, 0, 32, 32), color);
2479 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2480 }
2481 idx++;
2482 }
2483}
2484
Valerie Haua6b15a12019-02-05 14:16:30 -08002485TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002486 sp<SurfaceControl> layer;
2487 ASSERT_NO_FATAL_FAILURE(
2488 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2489
2490 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2491
2492 std::array<sp<GraphicBuffer>, 65> buffers;
2493
2494 size_t idx = 0;
2495 for (auto& buffer : buffers) {
2496 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2497 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2498 BufferUsage::COMPOSER_OVERLAY,
2499 "test");
2500 Color color = colors[idx % colors.size()];
2501 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2502 idx++;
2503 }
2504
2505 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2506 // cache is working.
2507 idx = 0;
2508 for (auto& buffer : buffers) {
2509 for (int i = 0; i < 2; i++) {
2510 Transaction().setBuffer(layer, buffer).apply();
2511
2512 Color color = colors[idx % colors.size()];
2513 auto shot = screenshot();
2514 shot->expectColor(Rect(0, 0, 32, 32), color);
2515 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2516 }
2517 if (idx == 0) {
2518 buffers[0].clear();
2519 }
2520 idx++;
2521 }
2522}
2523
Alec Mouri80863a62019-01-17 15:19:35 -08002524TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002525 sp<SurfaceControl> layer;
2526 ASSERT_NO_FATAL_FAILURE(
2527 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2528
2529 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2530 Color::BLUE, Color::WHITE));
2531
Marissa Wall861616d2018-10-22 12:52:23 -07002532 Transaction()
2533 .setFrame(layer, Rect(0, 0, 32, 32))
2534 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2535 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002536
Alec Mouri80863a62019-01-17 15:19:35 -08002537 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2538 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002539}
2540
Alec Mouri80863a62019-01-17 15:19:35 -08002541TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002542 sp<SurfaceControl> layer;
2543 ASSERT_NO_FATAL_FAILURE(
2544 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2545
2546 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2547 Color::BLUE, Color::WHITE));
2548
Marissa Wall861616d2018-10-22 12:52:23 -07002549 Transaction()
2550 .setFrame(layer, Rect(0, 0, 32, 32))
2551 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2552 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002553
Alec Mouri80863a62019-01-17 15:19:35 -08002554 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2555 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002556}
2557
Alec Mouri80863a62019-01-17 15:19:35 -08002558TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002559 sp<SurfaceControl> layer;
2560 ASSERT_NO_FATAL_FAILURE(
2561 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2562
2563 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2564 Color::BLUE, Color::WHITE));
2565
Marissa Wall861616d2018-10-22 12:52:23 -07002566 Transaction()
2567 .setFrame(layer, Rect(0, 0, 32, 32))
2568 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2569 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002570
Alec Mouri80863a62019-01-17 15:19:35 -08002571 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2572 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002573}
2574
2575TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2576 sp<SurfaceControl> layer;
2577 ASSERT_NO_FATAL_FAILURE(
2578 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2579
2580 Transaction().setTransformToDisplayInverse(layer, false).apply();
2581
2582 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2583
2584 Transaction().setTransformToDisplayInverse(layer, true).apply();
2585}
2586
Alec Mouri80863a62019-01-17 15:19:35 -08002587TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002588 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002589 Transaction transaction;
2590 ASSERT_NO_FATAL_FAILURE(
2591 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2592
2593 sp<GraphicBuffer> buffer =
2594 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2595 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2596 BufferUsage::COMPOSER_OVERLAY,
2597 "test");
2598 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2599
2600 sp<Fence> fence;
2601 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2602 GTEST_SUCCEED() << "test not supported";
2603 return;
2604 }
2605
2606 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2607
2608 status_t status = fence->wait(1000);
2609 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2610 std::this_thread::sleep_for(200ms);
2611
Alec Mouri80863a62019-01-17 15:19:35 -08002612 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002613 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2614 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2615}
2616
Alec Mouri80863a62019-01-17 15:19:35 -08002617TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002618 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002619 ASSERT_NO_FATAL_FAILURE(
2620 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2621
2622 sp<GraphicBuffer> buffer =
2623 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2624 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2625 BufferUsage::COMPOSER_OVERLAY,
2626 "test");
2627 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2628
Marissa Wallfda30bb2018-10-12 11:34:28 -07002629 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002630
2631 Transaction()
2632 .setBuffer(layer, buffer)
2633 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002634 .apply();
2635
Alec Mouri80863a62019-01-17 15:19:35 -08002636 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002637 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2638 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2639}
2640
Alec Mouri80863a62019-01-17 15:19:35 -08002641TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002642 sp<SurfaceControl> layer;
2643 ASSERT_NO_FATAL_FAILURE(
2644 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2645
2646 sp<GraphicBuffer> buffer =
2647 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2648 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2649 BufferUsage::COMPOSER_OVERLAY,
2650 "test");
2651 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2652
2653 Transaction()
2654 .setBuffer(layer, buffer)
2655 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002656 .apply();
2657
Alec Mouri80863a62019-01-17 15:19:35 -08002658 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002659 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2660 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2661}
2662
Alec Mouri80863a62019-01-17 15:19:35 -08002663TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002664 sp<SurfaceControl> layer;
2665 ASSERT_NO_FATAL_FAILURE(
2666 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2667
2668 sp<GraphicBuffer> buffer =
2669 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2670 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2671 BufferUsage::COMPOSER_OVERLAY,
2672 "test");
2673 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2674
2675 HdrMetadata hdrMetadata;
2676 hdrMetadata.validTypes = 0;
2677 Transaction()
2678 .setBuffer(layer, buffer)
2679 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002680 .apply();
2681
Alec Mouri80863a62019-01-17 15:19:35 -08002682 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002683 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2684 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2685}
2686
Alec Mouri80863a62019-01-17 15:19:35 -08002687TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002688 sp<SurfaceControl> layer;
2689 ASSERT_NO_FATAL_FAILURE(
2690 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2691
2692 sp<GraphicBuffer> buffer =
2693 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2694 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2695 BufferUsage::COMPOSER_OVERLAY,
2696 "test");
2697 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2698
2699 Region region;
2700 region.set(32, 32);
2701 Transaction()
2702 .setBuffer(layer, buffer)
2703 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002704 .apply();
2705
Alec Mouri80863a62019-01-17 15:19:35 -08002706 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002707 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2708 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2709}
2710
Alec Mouri80863a62019-01-17 15:19:35 -08002711TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002712 sp<SurfaceControl> layer;
2713 ASSERT_NO_FATAL_FAILURE(
2714 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2715
2716 sp<GraphicBuffer> buffer =
2717 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2718 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2719 BufferUsage::COMPOSER_OVERLAY,
2720 "test");
2721 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2722
2723 Transaction()
2724 .setBuffer(layer, buffer)
2725 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002726 .apply();
2727
Alec Mouri80863a62019-01-17 15:19:35 -08002728 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002729 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2730 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2731}
2732
2733TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2734 sp<SurfaceControl> layer;
2735 ASSERT_NO_FATAL_FAILURE(
2736 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2737
2738 // verify this doesn't cause a crash
2739 Transaction().setSidebandStream(layer, nullptr).apply();
2740}
2741
Robert Carr54cf5b12019-01-25 14:02:28 -08002742TEST_F(LayerTransactionTest, ReparentToSelf) {
2743 sp<SurfaceControl> layer;
2744 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2745 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2746 Transaction().reparent(layer, layer->getHandle()).apply();
2747
2748 {
2749 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2750 // to still be functioning.
2751 SCOPED_TRACE("after reparent to self");
2752 const Rect rect(0, 0, 32, 32);
2753 auto shot = screenshot();
2754 shot->expectColor(rect, Color::RED);
2755 shot->expectBorder(rect, Color::BLACK);
2756 }
2757}
2758
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002759class ColorTransformHelper {
2760public:
2761 static void DegammaColorSingle(half& s) {
2762 if (s <= 0.03928f)
2763 s = s / 12.92f;
2764 else
2765 s = pow((s + 0.055f) / 1.055f, 2.4f);
2766 }
2767
2768 static void DegammaColor(half3& color) {
2769 DegammaColorSingle(color.r);
2770 DegammaColorSingle(color.g);
2771 DegammaColorSingle(color.b);
2772 }
2773
2774 static void GammaColorSingle(half& s) {
2775 if (s <= 0.0031308f) {
2776 s = s * 12.92f;
2777 } else {
2778 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2779 }
2780 }
2781
2782 static void GammaColor(half3& color) {
2783 GammaColorSingle(color.r);
2784 GammaColorSingle(color.g);
2785 GammaColorSingle(color.b);
2786 }
2787
2788 static void applyMatrix(half3& color, const mat3& mat) {
2789 half3 ret = half3(0);
2790
2791 for (int i = 0; i < 3; i++) {
2792 for (int j = 0; j < 3; j++) {
2793 ret[i] = ret[i] + color[j] * mat[j][i];
2794 }
2795 }
2796 color = ret;
2797 }
2798};
2799
Alec Mouri80863a62019-01-17 15:19:35 -08002800TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002801 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002802 ASSERT_NO_FATAL_FAILURE(colorLayer =
2803 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2804 ISurfaceComposerClient::eFXSurfaceColor));
2805 Transaction()
2806 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2807 .setLayer(colorLayer, mLayerZBase + 1)
2808 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002809 {
2810 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002811 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002812 }
2813
2814 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002815 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002816 mat3 matrix;
2817 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2818 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2819 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002820
2821 // degamma before applying the matrix
2822 if (mColorManagementUsed) {
2823 ColorTransformHelper::DegammaColor(expected);
2824 }
2825
2826 ColorTransformHelper::applyMatrix(expected, matrix);
2827
2828 if (mColorManagementUsed) {
2829 ColorTransformHelper::GammaColor(expected);
2830 }
2831
2832 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2833 uint8_t(expected.b * 255), 255};
2834
2835 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2836 // channel) should be less than one
2837 const uint8_t tolerance = 1;
2838
Peiyong Lind3788632018-09-18 16:01:31 -07002839 Transaction().setColor(colorLayer, color)
2840 .setColorTransform(colorLayer, matrix, vec3()).apply();
2841 {
2842 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002843 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002844 }
2845}
2846
Alec Mouri80863a62019-01-17 15:19:35 -08002847TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002848 sp<SurfaceControl> parentLayer;
2849 sp<SurfaceControl> colorLayer;
2850 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2851 0 /* buffer height */,
2852 ISurfaceComposerClient::eFXSurfaceContainer));
2853 ASSERT_NO_FATAL_FAILURE(
2854 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2855 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2856
2857 Transaction()
2858 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2859 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2860 .setLayer(parentLayer, mLayerZBase + 1)
2861 .apply();
2862 {
2863 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002864 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002865 }
2866
2867 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2868 half3 expected = color;
2869 mat3 matrix;
2870 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2871 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2872 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2873
2874 // degamma before applying the matrix
2875 if (mColorManagementUsed) {
2876 ColorTransformHelper::DegammaColor(expected);
2877 }
2878
2879 ColorTransformHelper::applyMatrix(expected, matrix);
2880
2881 if (mColorManagementUsed) {
2882 ColorTransformHelper::GammaColor(expected);
2883 }
2884
2885 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2886 uint8_t(expected.b * 255), 255};
2887
2888 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2889 // channel) should be less than one
2890 const uint8_t tolerance = 1;
2891
2892 Transaction()
2893 .setColor(colorLayer, color)
2894 .setColorTransform(parentLayer, matrix, vec3())
2895 .apply();
2896 {
2897 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002898 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002899 }
2900}
2901
Alec Mouri80863a62019-01-17 15:19:35 -08002902TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002903 sp<SurfaceControl> parentLayer;
2904 sp<SurfaceControl> colorLayer;
2905 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2906 0 /* buffer height */,
2907 ISurfaceComposerClient::eFXSurfaceContainer));
2908 ASSERT_NO_FATAL_FAILURE(
2909 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2910 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2911
2912 Transaction()
2913 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2914 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2915 .setLayer(parentLayer, mLayerZBase + 1)
2916 .apply();
2917 {
2918 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002919 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002920 }
2921
2922 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2923 half3 expected = color;
2924 mat3 matrixChild;
2925 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2926 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2927 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2928 mat3 matrixParent;
2929 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2930 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2931 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2932
2933 // degamma before applying the matrix
2934 if (mColorManagementUsed) {
2935 ColorTransformHelper::DegammaColor(expected);
2936 }
2937
2938 ColorTransformHelper::applyMatrix(expected, matrixChild);
2939 ColorTransformHelper::applyMatrix(expected, matrixParent);
2940
2941 if (mColorManagementUsed) {
2942 ColorTransformHelper::GammaColor(expected);
2943 }
2944
2945 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2946 uint8_t(expected.b * 255), 255};
2947
2948 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2949 // channel) should be less than one
2950 const uint8_t tolerance = 1;
2951
2952 Transaction()
2953 .setColor(colorLayer, color)
2954 .setColorTransform(parentLayer, matrixParent, vec3())
2955 .setColorTransform(colorLayer, matrixChild, vec3())
2956 .apply();
2957 {
2958 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002959 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002960 }
2961}
2962
Marissa Wall80d94ad2019-01-18 16:04:36 -08002963struct CallbackData {
2964 CallbackData() = default;
2965 CallbackData(nsecs_t time, const sp<Fence>& fence,
2966 const std::vector<SurfaceControlStats>& stats)
2967 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
2968
2969 nsecs_t latchTime;
2970 sp<Fence> presentFence;
2971 std::vector<SurfaceControlStats> surfaceControlStats;
2972};
2973
Marissa Wallfda30bb2018-10-12 11:34:28 -07002974class ExpectedResult {
2975public:
2976 enum Transaction {
2977 NOT_PRESENTED = 0,
2978 PRESENTED,
2979 };
2980
2981 enum Buffer {
2982 NOT_ACQUIRED = 0,
2983 ACQUIRED,
2984 };
2985
2986 enum PreviousBuffer {
2987 NOT_RELEASED = 0,
2988 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08002989 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002990 };
2991
2992 void reset() {
2993 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
2994 mExpectedSurfaceResults.clear();
2995 }
2996
2997 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07002998 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07002999 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3000 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003001 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003002 std::forward_as_tuple(bufferResult, previousBufferResult));
3003 }
3004
3005 void addSurfaces(ExpectedResult::Transaction transactionResult,
3006 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003007 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003008 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3009 for (const auto& layer : layers) {
3010 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3011 }
3012 }
3013
Marissa Wall17b4e452018-12-26 16:32:34 -08003014 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3015 mExpectedPresentTime = expectedPresentTime;
3016 }
3017
Marissa Wall80d94ad2019-01-18 16:04:36 -08003018 void verifyCallbackData(const CallbackData& callbackData) const {
3019 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003020 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3021 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003022 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003023 if (mExpectedPresentTime >= 0) {
3024 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3025 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3026 // if the panel is running at 30 hz, at the worst case, our expected time just
3027 // misses vsync and we have to wait another 33.3ms
3028 ASSERT_LE(presentFence->getSignalTime(),
3029 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3030 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003031 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003032 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003033 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3034 }
3035
Marissa Wall80d94ad2019-01-18 16:04:36 -08003036 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003037 << "wrong number of surfaces";
3038
Marissa Wall80d94ad2019-01-18 16:04:36 -08003039 for (const auto& stats : surfaceControlStats) {
3040 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3041
Marissa Wallfda30bb2018-10-12 11:34:28 -07003042 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3043 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3044 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003045 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003046 }
3047 }
3048
3049private:
3050 class ExpectedSurfaceResult {
3051 public:
3052 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3053 ExpectedResult::PreviousBuffer previousBufferResult)
3054 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3055
Marissa Wall80d94ad2019-01-18 16:04:36 -08003056 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3057 nsecs_t latchTime) const {
3058 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003059
3060 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3061 << "bad acquire time";
3062 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003063
3064 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3065 ASSERT_NE(previousReleaseFence, nullptr)
3066 << "failed to set release prev buffer fence";
3067 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3068 ASSERT_EQ(previousReleaseFence, nullptr)
3069 << "should not have set released prev buffer fence";
3070 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003071 }
3072
3073 private:
3074 ExpectedResult::Buffer mBufferResult;
3075 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3076 };
3077
Marissa Wall80d94ad2019-01-18 16:04:36 -08003078 struct SCHash {
3079 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3080 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003081 }
3082 };
3083 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003084 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003085 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003086};
3087
3088class CallbackHelper {
3089public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003090 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3091 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003092 if (!callbackContext) {
3093 ALOGE("failed to get callback context");
3094 }
3095 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3096 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003097 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003098 helper->mConditionVariable.notify_all();
3099 }
3100
Marissa Wall80d94ad2019-01-18 16:04:36 -08003101 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003102 std::unique_lock lock(mMutex);
3103
Marissa Wall80d94ad2019-01-18 16:04:36 -08003104 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003105 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3106 std::cv_status::timeout)
3107 << "did not receive callback";
3108 }
3109
Marissa Wall80d94ad2019-01-18 16:04:36 -08003110 *outData = std::move(mCallbackDataQueue.front());
3111 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003112 }
3113
3114 void verifyFinalState() {
3115 // Wait to see if there are extra callbacks
3116 std::this_thread::sleep_for(500ms);
3117
3118 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003119 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3120 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003121 }
3122
3123 void* getContext() { return static_cast<void*>(this); }
3124
3125 std::mutex mMutex;
3126 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003127 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003128};
3129
3130class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003131public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003132 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003133 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003134 }
3135
Marissa Wall713b63f2018-10-17 15:42:43 -07003136 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003137 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3138 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003139 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003140 sp<GraphicBuffer> buffer;
3141 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003142 if (setBuffer) {
3143 int err = getBuffer(&buffer, &fence);
3144 if (err != NO_ERROR) {
3145 return err;
3146 }
3147
3148 transaction.setBuffer(layer, buffer);
3149 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003150 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003151
Valerie Hauaa194562019-02-05 16:21:38 -08003152 if (setBackgroundColor) {
3153 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3154 ui::Dataspace::UNKNOWN);
3155 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003156 }
3157
3158 transaction.addTransactionCompletedCallback(callbackHelper->function,
3159 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003160 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003161 }
3162
Marissa Wall861616d2018-10-22 12:52:23 -07003163 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3164 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003165 CallbackData callbackData;
3166 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3167 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003168
3169 if (finalState) {
3170 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3171 }
3172 }
3173
Marissa Wall861616d2018-10-22 12:52:23 -07003174 static void waitForCallbacks(CallbackHelper& helper,
3175 const std::vector<ExpectedResult>& expectedResults,
3176 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003177 for (const auto& expectedResult : expectedResults) {
3178 waitForCallback(helper, expectedResult);
3179 }
3180 if (finalState) {
3181 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3182 }
3183 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003184};
3185
Valerie Hauaa194562019-02-05 16:21:38 -08003186TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003187 sp<SurfaceControl> layer;
3188 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3189
3190 Transaction transaction;
3191 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003192 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003193 if (err) {
3194 GTEST_SUCCEED() << "test not supported";
3195 return;
3196 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003197
3198 transaction.apply();
3199
3200 ExpectedResult expected;
3201 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3202 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3203}
3204
Valerie Hauaa194562019-02-05 16:21:38 -08003205TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003206 sp<SurfaceControl> layer;
3207 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3208
3209 Transaction transaction;
3210 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003211 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003212 if (err) {
3213 GTEST_SUCCEED() << "test not supported";
3214 return;
3215 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003216
Marissa Wall861616d2018-10-22 12:52:23 -07003217 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003218
3219 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003220 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3221 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003222 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3223}
3224
Valerie Hauaa194562019-02-05 16:21:38 -08003225TEST_F(LayerCallbackTest, BufferNoColor) {
3226 sp<SurfaceControl> layer;
3227 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3228
3229 Transaction transaction;
3230 CallbackHelper callback;
3231 int err = fillTransaction(transaction, &callback, layer, true, false);
3232 if (err) {
3233 GTEST_SUCCEED() << "test not supported";
3234 return;
3235 }
3236
3237 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3238
3239 ExpectedResult expected;
3240 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3241 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3242}
3243
3244TEST_F(LayerCallbackTest, NoBufferColor) {
3245 sp<SurfaceControl> layer;
3246 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3247
3248 Transaction transaction;
3249 CallbackHelper callback;
3250 int err = fillTransaction(transaction, &callback, layer, false, true);
3251 if (err) {
3252 GTEST_SUCCEED() << "test not supported";
3253 return;
3254 }
3255
3256 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3257
3258 ExpectedResult expected;
3259 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3260 ExpectedResult::Buffer::NOT_ACQUIRED);
3261 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3262}
3263
Marissa Wallfda30bb2018-10-12 11:34:28 -07003264TEST_F(LayerCallbackTest, NoStateChange) {
3265 Transaction transaction;
3266 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003267 int err = fillTransaction(transaction, &callback);
3268 if (err) {
3269 GTEST_SUCCEED() << "test not supported";
3270 return;
3271 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003272
3273 transaction.apply();
3274
3275 ExpectedResult expected;
3276 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3277}
3278
3279TEST_F(LayerCallbackTest, OffScreen) {
3280 sp<SurfaceControl> layer;
3281 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3282
3283 Transaction transaction;
3284 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003285 int err = fillTransaction(transaction, &callback, layer);
3286 if (err) {
3287 GTEST_SUCCEED() << "test not supported";
3288 return;
3289 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003290
Marissa Wall861616d2018-10-22 12:52:23 -07003291 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003292
3293 ExpectedResult expected;
3294 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3295 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3296}
3297
Valerie Hauaa194562019-02-05 16:21:38 -08003298TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003299 sp<SurfaceControl> layer1, layer2;
3300 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3301 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3302
3303 Transaction transaction1, transaction2;
3304 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003305 int err = fillTransaction(transaction1, &callback1, layer1);
3306 if (err) {
3307 GTEST_SUCCEED() << "test not supported";
3308 return;
3309 }
3310 err = fillTransaction(transaction2, &callback2, layer2);
3311 if (err) {
3312 GTEST_SUCCEED() << "test not supported";
3313 return;
3314 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003315
Marissa Wall861616d2018-10-22 12:52:23 -07003316 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3317 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003318
3319 ExpectedResult expected;
3320 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3321 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3322 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3323}
3324
Valerie Hauaa194562019-02-05 16:21:38 -08003325TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3326 sp<SurfaceControl> layer1, layer2;
3327 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3328 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3329
3330 Transaction transaction1, transaction2;
3331 CallbackHelper callback1, callback2;
3332 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3333 if (err) {
3334 GTEST_SUCCEED() << "test not supported";
3335 return;
3336 }
3337 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3338 if (err) {
3339 GTEST_SUCCEED() << "test not supported";
3340 return;
3341 }
3342
3343 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3344 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3345
3346 ExpectedResult expected;
3347 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3348 ExpectedResult::Buffer::NOT_ACQUIRED);
3349 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3350 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3351}
3352
3353TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3354 sp<SurfaceControl> layer1, layer2;
3355 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3356 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3357
3358 Transaction transaction1, transaction2;
3359 CallbackHelper callback1, callback2;
3360 int err = fillTransaction(transaction1, &callback1, layer1);
3361 if (err) {
3362 GTEST_SUCCEED() << "test not supported";
3363 return;
3364 }
3365 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3366 if (err) {
3367 GTEST_SUCCEED() << "test not supported";
3368 return;
3369 }
3370
3371 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3372 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3373
3374 ExpectedResult expected;
3375 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3376 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3377 ExpectedResult::Buffer::NOT_ACQUIRED);
3378 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3379 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3380}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003381TEST_F(LayerCallbackTest, Merge_SameCallback) {
3382 sp<SurfaceControl> layer1, layer2;
3383 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3384 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3385
3386 Transaction transaction1, transaction2;
3387 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003388 int err = fillTransaction(transaction1, &callback, layer1);
3389 if (err) {
3390 GTEST_SUCCEED() << "test not supported";
3391 return;
3392 }
3393 err = fillTransaction(transaction2, &callback, layer2);
3394 if (err) {
3395 GTEST_SUCCEED() << "test not supported";
3396 return;
3397 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003398
3399 transaction2.merge(std::move(transaction1)).apply();
3400
3401 ExpectedResult expected;
3402 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3403 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3404 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3405}
3406
3407TEST_F(LayerCallbackTest, Merge_SameLayer) {
3408 sp<SurfaceControl> layer;
3409 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3410
3411 Transaction transaction1, transaction2;
3412 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003413 int err = fillTransaction(transaction1, &callback1, layer);
3414 if (err) {
3415 GTEST_SUCCEED() << "test not supported";
3416 return;
3417 }
3418 err = fillTransaction(transaction2, &callback2, layer);
3419 if (err) {
3420 GTEST_SUCCEED() << "test not supported";
3421 return;
3422 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003423
3424 transaction2.merge(std::move(transaction1)).apply();
3425
3426 ExpectedResult expected;
3427 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3428 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3429 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3430}
3431
Marissa Wallfda30bb2018-10-12 11:34:28 -07003432TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3433 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3434 client2(new SurfaceComposerClient);
3435
3436 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3437 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3438
3439 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003440 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003441 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003442 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003443 ISurfaceComposerClient::eFXSurfaceBufferState));
3444
3445 Transaction transaction1, transaction2;
3446 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003447 int err = fillTransaction(transaction1, &callback1, layer1);
3448 if (err) {
3449 GTEST_SUCCEED() << "test not supported";
3450 return;
3451 }
3452 err = fillTransaction(transaction2, &callback2, layer2);
3453 if (err) {
3454 GTEST_SUCCEED() << "test not supported";
3455 return;
3456 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003457
Marissa Wall861616d2018-10-22 12:52:23 -07003458 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3459 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003460
3461 ExpectedResult expected;
3462 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3463 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3464 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3465}
3466
3467TEST_F(LayerCallbackTest, MultipleTransactions) {
3468 sp<SurfaceControl> layer;
3469 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3470
3471 Transaction transaction;
3472 CallbackHelper callback;
3473 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003474 int err = fillTransaction(transaction, &callback, layer);
3475 if (err) {
3476 GTEST_SUCCEED() << "test not supported";
3477 return;
3478 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003479
3480 transaction.apply();
3481
3482 ExpectedResult expected;
3483 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003484 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003485 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3486 : ExpectedResult::PreviousBuffer::RELEASED);
3487 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3488 }
3489 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3490}
3491
3492TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3493 sp<SurfaceControl> layer;
3494 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3495
3496 Transaction transaction;
3497 CallbackHelper callback;
3498 for (size_t i = 0; i < 10; i++) {
3499 ExpectedResult expected;
3500
3501 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003502 int err = fillTransaction(transaction, &callback, layer);
3503 if (err) {
3504 GTEST_SUCCEED() << "test not supported";
3505 return;
3506 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003507 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3508 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003509 int err = fillTransaction(transaction, &callback);
3510 if (err) {
3511 GTEST_SUCCEED() << "test not supported";
3512 return;
3513 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003514 }
3515
3516 transaction.apply();
3517
3518 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3519 }
3520 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3521}
3522
3523TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3524 sp<SurfaceControl> layer;
3525 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3526
3527 Transaction transaction;
3528 CallbackHelper callback;
3529 for (size_t i = 0; i < 10; i++) {
3530 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003531 int err = fillTransaction(transaction, &callback, layer);
3532 if (err) {
3533 GTEST_SUCCEED() << "test not supported";
3534 return;
3535 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003536 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003537 int err = fillTransaction(transaction, &callback);
3538 if (err) {
3539 GTEST_SUCCEED() << "test not supported";
3540 return;
3541 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003542 }
3543
Marissa Wall861616d2018-10-22 12:52:23 -07003544 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003545
3546 ExpectedResult expected;
3547 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3548 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003549 layer,
3550 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3551 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003552 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3553 }
3554 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3555}
3556
3557TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3558 sp<SurfaceControl> layer1, layer2;
3559 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3560 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3561
3562 Transaction transaction1, transaction2;
3563 CallbackHelper callback1, callback2;
3564 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003565 int err = fillTransaction(transaction1, &callback1, layer1);
3566 if (err) {
3567 GTEST_SUCCEED() << "test not supported";
3568 return;
3569 }
3570 err = fillTransaction(transaction2, &callback2, layer2);
3571 if (err) {
3572 GTEST_SUCCEED() << "test not supported";
3573 return;
3574 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003575
Marissa Wall861616d2018-10-22 12:52:23 -07003576 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3577 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003578
3579 ExpectedResult expected;
3580 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003581 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003582 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3583 : ExpectedResult::PreviousBuffer::RELEASED);
3584 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3585 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3586 }
3587 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3588 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3589}
3590
3591TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3592 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3593 client2(new SurfaceComposerClient);
3594 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3595 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3596
3597 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003598 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003599 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003600 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003601 ISurfaceComposerClient::eFXSurfaceBufferState));
3602
3603 Transaction transaction1, transaction2;
3604 CallbackHelper callback1, callback2;
3605 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003606 int err = fillTransaction(transaction1, &callback1, layer1);
3607 if (err) {
3608 GTEST_SUCCEED() << "test not supported";
3609 return;
3610 }
3611 err = fillTransaction(transaction2, &callback2, layer2);
3612 if (err) {
3613 GTEST_SUCCEED() << "test not supported";
3614 return;
3615 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003616
Marissa Wall861616d2018-10-22 12:52:23 -07003617 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3618 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003619
3620 ExpectedResult expected;
3621 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003622 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003623 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3624 : ExpectedResult::PreviousBuffer::RELEASED);
3625 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3626 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3627 }
3628 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3629 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3630}
3631
3632TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3633 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3634 client2(new SurfaceComposerClient);
3635 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3636 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3637
3638 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003639 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003640 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003641 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003642 ISurfaceComposerClient::eFXSurfaceBufferState));
3643
3644 Transaction transaction1, transaction2;
3645 CallbackHelper callback1, callback2;
3646
3647 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003648 int err = fillTransaction(transaction1, &callback1, layer1);
3649 if (err) {
3650 GTEST_SUCCEED() << "test not supported";
3651 return;
3652 }
3653 err = fillTransaction(transaction2, &callback2, layer2);
3654 if (err) {
3655 GTEST_SUCCEED() << "test not supported";
3656 return;
3657 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003658
Marissa Wall861616d2018-10-22 12:52:23 -07003659 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3660 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003661
3662 ExpectedResult expected;
3663 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3664 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3665 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3666 expected.reset();
3667
3668 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003669 err = fillTransaction(transaction1, &callback1);
3670 if (err) {
3671 GTEST_SUCCEED() << "test not supported";
3672 return;
3673 }
3674 err = fillTransaction(transaction2, &callback2);
3675 if (err) {
3676 GTEST_SUCCEED() << "test not supported";
3677 return;
3678 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003679
3680 transaction2.merge(std::move(transaction1)).apply();
3681
3682 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3683 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3684}
3685
3686TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3687 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3688 client2(new SurfaceComposerClient);
3689
3690 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3691 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3692
3693 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003694 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003695 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003696 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003697 ISurfaceComposerClient::eFXSurfaceBufferState));
3698
3699 Transaction transaction1, transaction2;
3700 CallbackHelper callback1, callback2;
3701
3702 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003703 int err = fillTransaction(transaction1, &callback1, layer1);
3704 if (err) {
3705 GTEST_SUCCEED() << "test not supported";
3706 return;
3707 }
3708 err = fillTransaction(transaction2, &callback2, layer2);
3709 if (err) {
3710 GTEST_SUCCEED() << "test not supported";
3711 return;
3712 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003713
Marissa Wall861616d2018-10-22 12:52:23 -07003714 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3715 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003716
3717 ExpectedResult expected;
3718 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3719 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3720 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3721 expected.reset();
3722
3723 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003724 err = fillTransaction(transaction1, &callback1);
3725 if (err) {
3726 GTEST_SUCCEED() << "test not supported";
3727 return;
3728 }
3729 err = fillTransaction(transaction2, &callback2);
3730 if (err) {
3731 GTEST_SUCCEED() << "test not supported";
3732 return;
3733 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003734
Marissa Wall861616d2018-10-22 12:52:23 -07003735 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003736
Marissa Wall713b63f2018-10-17 15:42:43 -07003737 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3738 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003739 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3740 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3741}
3742
3743TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3744 sp<SurfaceControl> layer;
3745 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3746
3747 Transaction transaction;
3748 CallbackHelper callback;
3749 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003750 for (auto& expected : expectedResults) {
3751 expected.reset();
3752 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003753 ExpectedResult::Buffer::ACQUIRED,
3754 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003755
Marissa Wall713b63f2018-10-17 15:42:43 -07003756 int err = fillTransaction(transaction, &callback, layer);
3757 if (err) {
3758 GTEST_SUCCEED() << "test not supported";
3759 return;
3760 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003761
3762 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003763 }
3764 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3765}
3766
3767TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3768 sp<SurfaceControl> layer;
3769 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3770
Marissa Wall713b63f2018-10-17 15:42:43 -07003771 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003772 Transaction transaction;
3773 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003774 int err = fillTransaction(transaction, &callback, layer);
3775 if (err) {
3776 GTEST_SUCCEED() << "test not supported";
3777 return;
3778 }
3779
3780 transaction.apply();
3781
3782 ExpectedResult expected;
3783 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3784 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3785
3786 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003787 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003788 for (auto& expected : expectedResults) {
3789 expected.reset();
3790
Marissa Wall713b63f2018-10-17 15:42:43 -07003791 err = fillTransaction(transaction, &callback);
3792 if (err) {
3793 GTEST_SUCCEED() << "test not supported";
3794 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003795 }
3796
3797 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003798 }
3799 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3800}
3801
3802TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3803 sp<SurfaceControl> layer;
3804 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3805
3806 // Normal call to set up test
3807 Transaction transaction;
3808 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003809 int err = fillTransaction(transaction, &callback, layer);
3810 if (err) {
3811 GTEST_SUCCEED() << "test not supported";
3812 return;
3813 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003814
Marissa Wall861616d2018-10-22 12:52:23 -07003815 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003816
3817 ExpectedResult expectedResult;
3818 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3819 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3820
3821 // Test
3822 std::vector<ExpectedResult> expectedResults(50);
3823 for (auto& expected : expectedResults) {
3824 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003825 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3826 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003827
Marissa Wall713b63f2018-10-17 15:42:43 -07003828 err = fillTransaction(transaction, &callback);
3829 if (err) {
3830 GTEST_SUCCEED() << "test not supported";
3831 return;
3832 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003833
Marissa Wall861616d2018-10-22 12:52:23 -07003834 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003835 }
3836 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3837}
3838
Marissa Wall17b4e452018-12-26 16:32:34 -08003839TEST_F(LayerCallbackTest, DesiredPresentTime) {
3840 sp<SurfaceControl> layer;
3841 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3842
3843 Transaction transaction;
3844 CallbackHelper callback;
3845 int err = fillTransaction(transaction, &callback, layer);
3846 if (err) {
3847 GTEST_SUCCEED() << "test not supported";
3848 return;
3849 }
3850
3851 // Try to present 100ms in the future
3852 nsecs_t time = systemTime() + (100 * 1e6);
3853
3854 transaction.setDesiredPresentTime(time);
3855 transaction.apply();
3856
3857 ExpectedResult expected;
3858 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3859 expected.addExpectedPresentTime(time);
3860 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3861}
3862
3863TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3864 sp<SurfaceControl> layer;
3865 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3866
3867 Transaction transaction;
3868 CallbackHelper callback1;
3869 int err = fillTransaction(transaction, &callback1, layer);
3870 if (err) {
3871 GTEST_SUCCEED() << "test not supported";
3872 return;
3873 }
3874
3875 // Try to present 100ms in the future
3876 nsecs_t time = systemTime() + (100 * 1e6);
3877
3878 transaction.setDesiredPresentTime(time);
3879 transaction.apply();
3880
3881 ExpectedResult expected1;
3882 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3883 expected1.addExpectedPresentTime(time);
3884
3885 CallbackHelper callback2;
3886 err = fillTransaction(transaction, &callback2, layer);
3887 if (err) {
3888 GTEST_SUCCEED() << "test not supported";
3889 return;
3890 }
3891
3892 // Try to present 33ms after the first frame
3893 time += (33.3 * 1e6);
3894
3895 transaction.setDesiredPresentTime(time);
3896 transaction.apply();
3897
3898 ExpectedResult expected2;
3899 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3900 ExpectedResult::Buffer::ACQUIRED,
3901 ExpectedResult::PreviousBuffer::RELEASED);
3902 expected2.addExpectedPresentTime(time);
3903
3904 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3905 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3906}
3907
3908TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3909 sp<SurfaceControl> layer;
3910 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3911
3912 Transaction transaction;
3913 CallbackHelper callback1;
3914 int err = fillTransaction(transaction, &callback1, layer);
3915 if (err) {
3916 GTEST_SUCCEED() << "test not supported";
3917 return;
3918 }
3919
3920 // Try to present 100ms in the future
3921 nsecs_t time = systemTime() + (100 * 1e6);
3922
3923 transaction.setDesiredPresentTime(time);
3924 transaction.apply();
3925
3926 ExpectedResult expected1;
3927 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3928 expected1.addExpectedPresentTime(time);
3929
3930 CallbackHelper callback2;
3931 err = fillTransaction(transaction, &callback2, layer);
3932 if (err) {
3933 GTEST_SUCCEED() << "test not supported";
3934 return;
3935 }
3936
3937 // Try to present 33ms before the previous frame
3938 time -= (33.3 * 1e6);
3939
3940 transaction.setDesiredPresentTime(time);
3941 transaction.apply();
3942
3943 ExpectedResult expected2;
3944 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3945 ExpectedResult::Buffer::ACQUIRED,
3946 ExpectedResult::PreviousBuffer::RELEASED);
3947
3948 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3949 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3950}
3951
3952TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3953 sp<SurfaceControl> layer;
3954 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3955
3956 Transaction transaction;
3957 CallbackHelper callback;
3958 int err = fillTransaction(transaction, &callback, layer);
3959 if (err) {
3960 GTEST_SUCCEED() << "test not supported";
3961 return;
3962 }
3963
3964 // Try to present 100ms in the past
3965 nsecs_t time = systemTime() - (100 * 1e6);
3966
3967 transaction.setDesiredPresentTime(time);
3968 transaction.apply();
3969
3970 ExpectedResult expected;
3971 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3972 expected.addExpectedPresentTime(systemTime());
3973 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3974}
3975
Chavi Weingarten40482ff2017-11-30 01:51:40 +00003976class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003977protected:
3978 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07003979 LayerTransactionTest::SetUp();
3980 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003981
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003982 const auto display = SurfaceComposerClient::getInternalDisplayToken();
3983 ASSERT_FALSE(display == nullptr);
3984
Mathias Agopianc666cae2012-07-25 18:56:13 -07003985 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08003986 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07003987
3988 ssize_t displayWidth = info.w;
3989 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003990
3991 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07003992 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
3993 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08003994 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07003995 ASSERT_TRUE(mBGSurfaceControl->isValid());
3996 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
3997
3998 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07003999 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4000
Peiyong Lin566a3b42018-01-09 18:22:43 -08004001 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004002 ASSERT_TRUE(mFGSurfaceControl->isValid());
4003
4004 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4005
4006 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004007 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004008 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004009 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4010
4011 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4012
Robert Carr4cdc58f2017-08-23 14:22:20 -07004013 asTransaction([&](Transaction& t) {
4014 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004015
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004016 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004017
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004018 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4019 .setPosition(mFGSurfaceControl, 64, 64)
4020 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004021
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004022 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4023 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4024 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004025 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004026 }
4027
4028 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004029 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004030 mBGSurfaceControl = 0;
4031 mFGSurfaceControl = 0;
4032 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004033 }
4034
4035 void waitForPostedBuffers() {
4036 // Since the sync surface is in synchronous mode (i.e. double buffered)
4037 // posting three buffers to it should ensure that at least two
4038 // SurfaceFlinger::handlePageFlip calls have been made, which should
4039 // guaranteed that a buffer posted to another Surface has been retired.
4040 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4041 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4042 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4043 }
4044
Robert Carr4cdc58f2017-08-23 14:22:20 -07004045
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004046 sp<SurfaceControl> mBGSurfaceControl;
4047 sp<SurfaceControl> mFGSurfaceControl;
4048
4049 // This surface is used to ensure that the buffers posted to
4050 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4051 sp<SurfaceControl> mSyncSurfaceControl;
4052};
4053
Robert Carr7f619b22017-11-06 12:56:35 -08004054TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004055
chaviw0e3479f2018-09-10 16:49:30 -07004056 std::unique_ptr<ScreenCapture> sc;
4057
4058 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004059 fillSurfaceRGBA8(relative, 10, 10, 10);
4060 waitForPostedBuffers();
4061
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004062 Transaction{}
4063 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004064 .setPosition(relative, 64, 64)
4065 .apply();
4066
4067 {
4068 // The relative should be on top of the FG control.
4069 ScreenCapture::captureScreen(&sc);
4070 sc->checkPixel(64, 64, 10, 10, 10);
4071 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004072 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004073
4074 {
4075 // Nothing should change at this point.
4076 ScreenCapture::captureScreen(&sc);
4077 sc->checkPixel(64, 64, 10, 10, 10);
4078 }
4079
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004080 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004081
4082 {
4083 // Ensure that the relative was actually hidden, rather than
4084 // being left in the detached but visible state.
4085 ScreenCapture::captureScreen(&sc);
4086 sc->expectFGColor(64, 64);
4087 }
4088}
4089
Robert Carr8d5227b2017-03-16 15:41:03 -07004090class GeometryLatchingTest : public LayerUpdateTest {
4091protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004092 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004093 SCOPED_TRACE(trace);
4094 ScreenCapture::captureScreen(&sc);
4095 // We find the leading edge of the FG surface.
4096 sc->expectFGColor(127, 127);
4097 sc->expectBGColor(128, 128);
4098 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004099
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004100 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004101
4102 void unlockFGBuffer() {
4103 sp<Surface> s = mFGSurfaceControl->getSurface();
4104 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4105 waitForPostedBuffers();
4106 }
4107
Robert Carr8d5227b2017-03-16 15:41:03 -07004108 void completeFGResize() {
4109 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4110 waitForPostedBuffers();
4111 }
4112 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004113 asTransaction([&](Transaction& t) {
4114 t.setSize(mFGSurfaceControl, 64, 64);
4115 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004116 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004117 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004118
4119 EXPECT_INITIAL_STATE("After restoring initial state");
4120 }
chaviw0e3479f2018-09-10 16:49:30 -07004121 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004122};
4123
Robert Carr8d5227b2017-03-16 15:41:03 -07004124class CropLatchingTest : public GeometryLatchingTest {
4125protected:
4126 void EXPECT_CROPPED_STATE(const char* trace) {
4127 SCOPED_TRACE(trace);
4128 ScreenCapture::captureScreen(&sc);
4129 // The edge should be moved back one pixel by our crop.
4130 sc->expectFGColor(126, 126);
4131 sc->expectBGColor(127, 127);
4132 sc->expectBGColor(128, 128);
4133 }
chaviw59f5c562017-06-28 16:39:06 -07004134
4135 void EXPECT_RESIZE_STATE(const char* trace) {
4136 SCOPED_TRACE(trace);
4137 ScreenCapture::captureScreen(&sc);
4138 // The FG is now resized too 128,128 at 64,64
4139 sc->expectFGColor(64, 64);
4140 sc->expectFGColor(191, 191);
4141 sc->expectBGColor(192, 192);
4142 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004143};
4144
Pablo Ceballos05289c22016-04-14 15:49:55 -07004145TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004146 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004147 {
4148 SCOPED_TRACE("before anything");
4149 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004150 sc->expectBGColor(32, 32);
4151 sc->expectFGColor(96, 96);
4152 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004153 }
4154
4155 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004156 asTransaction([&](Transaction& t) {
4157 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004158 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4159 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004160 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004161
Robert Carr4cdc58f2017-08-23 14:22:20 -07004162 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004163 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004164 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4165 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004166 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004167
4168 {
4169 SCOPED_TRACE("before any trigger");
4170 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004171 sc->expectBGColor(32, 32);
4172 sc->expectFGColor(96, 96);
4173 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004174 }
4175
4176 // should trigger the first deferred transaction, but not the second one
4177 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4178 {
4179 SCOPED_TRACE("after first trigger");
4180 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004181 sc->expectBGColor(32, 32);
4182 sc->checkPixel(96, 96, 162, 63, 96);
4183 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004184 }
4185
4186 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004187 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004188
4189 // trigger the second deferred transaction
4190 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4191 {
4192 SCOPED_TRACE("after second trigger");
4193 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004194 sc->expectBGColor(32, 32);
4195 sc->expectBGColor(96, 96);
4196 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004197 }
4198}
4199
Robert Carre392b552017-09-19 12:16:05 -07004200TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004201 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004202
4203 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004204 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4205 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4206 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4207 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004208 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004209 SurfaceComposerClient::Transaction{}
4210 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4211 .show(childNoBuffer)
4212 .show(childBuffer)
4213 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004214 {
4215 ScreenCapture::captureScreen(&sc);
4216 sc->expectChildColor(73, 73);
4217 sc->expectFGColor(74, 74);
4218 }
Vishnu Nair60356342018-11-13 13:00:45 -08004219 SurfaceComposerClient::Transaction{}
4220 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4221 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004222 {
4223 ScreenCapture::captureScreen(&sc);
4224 sc->expectChildColor(73, 73);
4225 sc->expectChildColor(74, 74);
4226 }
4227}
4228
Robert Carr2c5f6d22017-09-26 12:30:35 -07004229TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004230 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004231 {
4232 SCOPED_TRACE("before move");
4233 ScreenCapture::captureScreen(&sc);
4234 sc->expectBGColor(0, 12);
4235 sc->expectFGColor(75, 75);
4236 sc->expectBGColor(145, 145);
4237 }
4238
4239 Transaction t1, t2;
4240 t1.setPosition(mFGSurfaceControl, 128, 128);
4241 t2.setPosition(mFGSurfaceControl, 0, 0);
4242 // We expect that the position update from t2 now
4243 // overwrites the position update from t1.
4244 t1.merge(std::move(t2));
4245 t1.apply();
4246
4247 {
4248 ScreenCapture::captureScreen(&sc);
4249 sc->expectFGColor(1, 1);
4250 }
4251}
4252
Robert Carr1f0a16a2016-10-24 16:27:39 -07004253class ChildLayerTest : public LayerUpdateTest {
4254protected:
4255 void SetUp() override {
4256 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004257 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4258 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004259 fillSurfaceRGBA8(mChild, 200, 200, 200);
4260
4261 {
4262 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004263 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004264 mCapture->expectChildColor(64, 64);
4265 }
4266 }
4267 void TearDown() override {
4268 LayerUpdateTest::TearDown();
4269 mChild = 0;
4270 }
4271
4272 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004273 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004274};
4275
4276TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004277 asTransaction([&](Transaction& t) {
4278 t.show(mChild);
4279 t.setPosition(mChild, 10, 10);
4280 t.setPosition(mFGSurfaceControl, 64, 64);
4281 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004282
4283 {
chaviw0e3479f2018-09-10 16:49:30 -07004284 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004285 // Top left of foreground must now be visible
4286 mCapture->expectFGColor(64, 64);
4287 // But 10 pixels in we should see the child surface
4288 mCapture->expectChildColor(74, 74);
4289 // And 10 more pixels we should be back to the foreground surface
4290 mCapture->expectFGColor(84, 84);
4291 }
4292
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004293 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004294
4295 {
chaviw0e3479f2018-09-10 16:49:30 -07004296 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004297 // Top left of foreground should now be at 0, 0
4298 mCapture->expectFGColor(0, 0);
4299 // But 10 pixels in we should see the child surface
4300 mCapture->expectChildColor(10, 10);
4301 // And 10 more pixels we should be back to the foreground surface
4302 mCapture->expectFGColor(20, 20);
4303 }
4304}
4305
Robert Carr41b08b52017-06-01 16:11:34 -07004306TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004307 asTransaction([&](Transaction& t) {
4308 t.show(mChild);
4309 t.setPosition(mChild, 0, 0);
4310 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004311 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004312 });
Robert Carr41b08b52017-06-01 16:11:34 -07004313
4314 {
chaviw0e3479f2018-09-10 16:49:30 -07004315 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004316 mCapture->expectChildColor(0, 0);
4317 mCapture->expectChildColor(4, 4);
4318 mCapture->expectBGColor(5, 5);
4319 }
4320}
4321
Robert Carr1f0a16a2016-10-24 16:27:39 -07004322TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004323 asTransaction([&](Transaction& t) {
4324 t.show(mChild);
4325 t.setPosition(mFGSurfaceControl, 0, 0);
4326 t.setPosition(mChild, 63, 63);
4327 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004328
4329 {
chaviw0e3479f2018-09-10 16:49:30 -07004330 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004331 mCapture->expectFGColor(0, 0);
4332 // Last pixel in foreground should now be the child.
4333 mCapture->expectChildColor(63, 63);
4334 // But the child should be constrained and the next pixel
4335 // must be the background
4336 mCapture->expectBGColor(64, 64);
4337 }
4338}
4339
4340TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004341 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004342
4343 // Find the boundary between the parent and child
4344 {
chaviw0e3479f2018-09-10 16:49:30 -07004345 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004346 mCapture->expectChildColor(9, 9);
4347 mCapture->expectFGColor(10, 10);
4348 }
4349
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004350 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004351
4352 // The boundary should be twice as far from the origin now.
4353 // The pixels from the last test should all be child now
4354 {
chaviw0e3479f2018-09-10 16:49:30 -07004355 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004356 mCapture->expectChildColor(9, 9);
4357 mCapture->expectChildColor(10, 10);
4358 mCapture->expectChildColor(19, 19);
4359 mCapture->expectFGColor(20, 20);
4360 }
4361}
Robert Carr9524cb32017-02-13 11:32:32 -08004362
Robert Carr6452f122017-03-21 10:41:29 -07004363TEST_F(ChildLayerTest, ChildLayerAlpha) {
4364 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4365 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4366 fillSurfaceRGBA8(mChild, 0, 254, 0);
4367 waitForPostedBuffers();
4368
Robert Carr4cdc58f2017-08-23 14:22:20 -07004369 asTransaction([&](Transaction& t) {
4370 t.show(mChild);
4371 t.setPosition(mChild, 0, 0);
4372 t.setPosition(mFGSurfaceControl, 0, 0);
4373 });
Robert Carr6452f122017-03-21 10:41:29 -07004374
4375 {
chaviw0e3479f2018-09-10 16:49:30 -07004376 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004377 // Unblended child color
4378 mCapture->checkPixel(0, 0, 0, 254, 0);
4379 }
4380
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004381 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004382
4383 {
chaviw0e3479f2018-09-10 16:49:30 -07004384 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004385 // Child and BG blended.
4386 mCapture->checkPixel(0, 0, 127, 127, 0);
4387 }
4388
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004389 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004390
4391 {
chaviw0e3479f2018-09-10 16:49:30 -07004392 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004393 // Child and BG blended.
4394 mCapture->checkPixel(0, 0, 95, 64, 95);
4395 }
4396}
4397
Robert Carr9524cb32017-02-13 11:32:32 -08004398TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004399 asTransaction([&](Transaction& t) {
4400 t.show(mChild);
4401 t.setPosition(mChild, 10, 10);
4402 t.setPosition(mFGSurfaceControl, 64, 64);
4403 });
Robert Carr9524cb32017-02-13 11:32:32 -08004404
4405 {
chaviw0e3479f2018-09-10 16:49:30 -07004406 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004407 // Top left of foreground must now be visible
4408 mCapture->expectFGColor(64, 64);
4409 // But 10 pixels in we should see the child surface
4410 mCapture->expectChildColor(74, 74);
4411 // And 10 more pixels we should be back to the foreground surface
4412 mCapture->expectFGColor(84, 84);
4413 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004414
4415 asTransaction([&](Transaction& t) {
4416 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4417 });
4418
Robert Carr9524cb32017-02-13 11:32:32 -08004419 {
chaviw0e3479f2018-09-10 16:49:30 -07004420 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004421 mCapture->expectFGColor(64, 64);
4422 // In reparenting we should have exposed the entire foreground surface.
4423 mCapture->expectFGColor(74, 74);
4424 // And the child layer should now begin at 10, 10 (since the BG
4425 // layer is at (0, 0)).
4426 mCapture->expectBGColor(9, 9);
4427 mCapture->expectChildColor(10, 10);
4428 }
4429}
4430
Robert Carr2e102c92018-10-23 12:11:15 -07004431TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4432 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004433 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004434 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4435
4436 {
4437 SCOPED_TRACE("Grandchild visible");
4438 ScreenCapture::captureScreen(&mCapture);
4439 mCapture->checkPixel(64, 64, 111, 111, 111);
4440 }
4441
Robert Carr87246532019-02-04 15:20:26 -08004442 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004443
4444 {
4445 SCOPED_TRACE("After destroying child");
4446 ScreenCapture::captureScreen(&mCapture);
4447 mCapture->expectFGColor(64, 64);
4448 }
4449
4450 asTransaction([&](Transaction& t) {
4451 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4452 });
4453
4454 {
4455 SCOPED_TRACE("After reparenting grandchild");
4456 ScreenCapture::captureScreen(&mCapture);
4457 mCapture->checkPixel(64, 64, 111, 111, 111);
4458 }
4459}
4460
chaviw161410b02017-07-27 10:46:08 -07004461TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004462 asTransaction([&](Transaction& t) {
4463 t.show(mChild);
4464 t.setPosition(mChild, 10, 10);
4465 t.setPosition(mFGSurfaceControl, 64, 64);
4466 });
Robert Carr9524cb32017-02-13 11:32:32 -08004467
4468 {
chaviw0e3479f2018-09-10 16:49:30 -07004469 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004470 // Top left of foreground must now be visible
4471 mCapture->expectFGColor(64, 64);
4472 // But 10 pixels in we should see the child surface
4473 mCapture->expectChildColor(74, 74);
4474 // And 10 more pixels we should be back to the foreground surface
4475 mCapture->expectFGColor(84, 84);
4476 }
4477
chaviw0e3479f2018-09-10 16:49:30 -07004478
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004479 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004480
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004481 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004482
chaviw161410b02017-07-27 10:46:08 -07004483 // Since the child has the same client as the parent, it will not get
4484 // detached and will be hidden.
4485 {
chaviw0e3479f2018-09-10 16:49:30 -07004486 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004487 mCapture->expectFGColor(64, 64);
4488 mCapture->expectFGColor(74, 74);
4489 mCapture->expectFGColor(84, 84);
4490 }
4491}
4492
4493TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4494 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004495 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004496 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4497 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004498
chaviw161410b02017-07-27 10:46:08 -07004499 ASSERT_TRUE(mChildNewClient->isValid());
4500
4501 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4502
Robert Carr4cdc58f2017-08-23 14:22:20 -07004503 asTransaction([&](Transaction& t) {
4504 t.hide(mChild);
4505 t.show(mChildNewClient);
4506 t.setPosition(mChildNewClient, 10, 10);
4507 t.setPosition(mFGSurfaceControl, 64, 64);
4508 });
chaviw161410b02017-07-27 10:46:08 -07004509
4510 {
chaviw0e3479f2018-09-10 16:49:30 -07004511 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004512 // Top left of foreground must now be visible
4513 mCapture->expectFGColor(64, 64);
4514 // But 10 pixels in we should see the child surface
4515 mCapture->expectChildColor(74, 74);
4516 // And 10 more pixels we should be back to the foreground surface
4517 mCapture->expectFGColor(84, 84);
4518 }
4519
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004520 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004521
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004522 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004523
Robert Carr9524cb32017-02-13 11:32:32 -08004524 // Nothing should have changed.
4525 {
chaviw0e3479f2018-09-10 16:49:30 -07004526 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004527 mCapture->expectFGColor(64, 64);
4528 mCapture->expectChildColor(74, 74);
4529 mCapture->expectFGColor(84, 84);
4530 }
4531}
4532
chaviw5aedec92018-10-22 10:40:38 -07004533TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4534 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4535 sp<SurfaceControl> childNewClient =
4536 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4537 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4538
4539 ASSERT_TRUE(childNewClient != nullptr);
4540 ASSERT_TRUE(childNewClient->isValid());
4541
4542 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4543
4544 Transaction()
4545 .hide(mChild)
4546 .show(childNewClient)
4547 .setPosition(childNewClient, 10, 10)
4548 .setPosition(mFGSurfaceControl, 64, 64)
4549 .apply();
4550
4551 {
4552 mCapture = screenshot();
4553 // Top left of foreground must now be visible
4554 mCapture->expectFGColor(64, 64);
4555 // But 10 pixels in we should see the child surface
4556 mCapture->expectChildColor(74, 74);
4557 // And 10 more pixels we should be back to the foreground surface
4558 mCapture->expectFGColor(84, 84);
4559 }
4560
4561 Transaction().detachChildren(mFGSurfaceControl).apply();
4562 Transaction().hide(childNewClient).apply();
4563
4564 // Nothing should have changed.
4565 {
4566 mCapture = screenshot();
4567 mCapture->expectFGColor(64, 64);
4568 mCapture->expectChildColor(74, 74);
4569 mCapture->expectFGColor(84, 84);
4570 }
4571
4572 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4573 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4574 32);
4575 Transaction()
4576 .setLayer(newParentSurface, INT32_MAX - 1)
4577 .show(newParentSurface)
4578 .setPosition(newParentSurface, 20, 20)
4579 .reparent(childNewClient, newParentSurface->getHandle())
4580 .apply();
4581 {
4582 mCapture = screenshot();
4583 // Child is now hidden.
4584 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4585 }
4586}
4587
Robert Carr9b429f42017-04-17 14:56:57 -07004588TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004589 asTransaction([&](Transaction& t) {
4590 t.show(mChild);
4591 t.setPosition(mChild, 0, 0);
4592 t.setPosition(mFGSurfaceControl, 0, 0);
4593 });
Robert Carr9b429f42017-04-17 14:56:57 -07004594
4595 {
chaviw0e3479f2018-09-10 16:49:30 -07004596 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004597 // We've positioned the child in the top left.
4598 mCapture->expectChildColor(0, 0);
4599 // But it's only 10x10.
4600 mCapture->expectFGColor(10, 10);
4601 }
4602
Robert Carr4cdc58f2017-08-23 14:22:20 -07004603 asTransaction([&](Transaction& t) {
4604 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4605 // We cause scaling by 2.
4606 t.setSize(mFGSurfaceControl, 128, 128);
4607 });
Robert Carr9b429f42017-04-17 14:56:57 -07004608
4609 {
chaviw0e3479f2018-09-10 16:49:30 -07004610 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004611 // We've positioned the child in the top left.
4612 mCapture->expectChildColor(0, 0);
4613 mCapture->expectChildColor(10, 10);
4614 mCapture->expectChildColor(19, 19);
4615 // And now it should be scaled all the way to 20x20
4616 mCapture->expectFGColor(20, 20);
4617 }
4618}
4619
Robert Carr1725eee2017-04-26 18:32:15 -07004620// Regression test for b/37673612
4621TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004622 asTransaction([&](Transaction& t) {
4623 t.show(mChild);
4624 t.setPosition(mChild, 0, 0);
4625 t.setPosition(mFGSurfaceControl, 0, 0);
4626 });
Robert Carr1725eee2017-04-26 18:32:15 -07004627
4628 {
chaviw0e3479f2018-09-10 16:49:30 -07004629 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004630 // We've positioned the child in the top left.
4631 mCapture->expectChildColor(0, 0);
4632 // But it's only 10x10.
4633 mCapture->expectFGColor(10, 10);
4634 }
Robert Carr1725eee2017-04-26 18:32:15 -07004635 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4636 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004637 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004638 sp<Surface> s = mFGSurfaceControl->getSurface();
4639 auto anw = static_cast<ANativeWindow*>(s.get());
4640 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4641 native_window_set_buffers_dimensions(anw, 64, 128);
4642 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4643 waitForPostedBuffers();
4644
4645 {
4646 // The child should still be in the same place and not have any strange scaling as in
4647 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004648 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004649 mCapture->expectChildColor(0, 0);
4650 mCapture->expectFGColor(10, 10);
4651 }
4652}
4653
Dan Stoza412903f2017-04-27 13:42:17 -07004654TEST_F(ChildLayerTest, Bug36858924) {
4655 // Destroy the child layer
4656 mChild.clear();
4657
4658 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004659 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4660 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004661
4662 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004663 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004664 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4665 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004666 t.show(mChild);
4667 });
Dan Stoza412903f2017-04-27 13:42:17 -07004668
4669 // Render the foreground surface a few times
4670 //
4671 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4672 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4673 // never acquire/release the first buffer
4674 ALOGI("Filling 1");
4675 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4676 ALOGI("Filling 2");
4677 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4678 ALOGI("Filling 3");
4679 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4680 ALOGI("Filling 4");
4681 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4682}
4683
chaviwf1961f72017-09-18 16:41:07 -07004684TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004685 asTransaction([&](Transaction& t) {
4686 t.show(mChild);
4687 t.setPosition(mChild, 10, 10);
4688 t.setPosition(mFGSurfaceControl, 64, 64);
4689 });
chaviw06178942017-07-27 10:25:59 -07004690
4691 {
chaviw0e3479f2018-09-10 16:49:30 -07004692 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004693 // Top left of foreground must now be visible
4694 mCapture->expectFGColor(64, 64);
4695 // But 10 pixels in we should see the child surface
4696 mCapture->expectChildColor(74, 74);
4697 // And 10 more pixels we should be back to the foreground surface
4698 mCapture->expectFGColor(84, 84);
4699 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004700
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004701 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004702
chaviw06178942017-07-27 10:25:59 -07004703 {
chaviw0e3479f2018-09-10 16:49:30 -07004704 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004705 mCapture->expectFGColor(64, 64);
4706 // In reparenting we should have exposed the entire foreground surface.
4707 mCapture->expectFGColor(74, 74);
4708 // And the child layer should now begin at 10, 10 (since the BG
4709 // layer is at (0, 0)).
4710 mCapture->expectBGColor(9, 9);
4711 mCapture->expectChildColor(10, 10);
4712 }
4713}
4714
chaviwf1961f72017-09-18 16:41:07 -07004715TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004716 asTransaction([&](Transaction& t) {
4717 t.show(mChild);
4718 t.setPosition(mChild, 10, 10);
4719 t.setPosition(mFGSurfaceControl, 64, 64);
4720 });
chaviwf1961f72017-09-18 16:41:07 -07004721
4722 {
chaviw0e3479f2018-09-10 16:49:30 -07004723 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004724 // Top left of foreground must now be visible
4725 mCapture->expectFGColor(64, 64);
4726 // But 10 pixels in we should see the child surface
4727 mCapture->expectChildColor(74, 74);
4728 // And 10 more pixels we should be back to the foreground surface
4729 mCapture->expectFGColor(84, 84);
4730 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004731 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004732 {
chaviw0e3479f2018-09-10 16:49:30 -07004733 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004734 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004735 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004736 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004737 mCapture->expectFGColor(84, 84);
4738 }
4739}
4740
4741TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004742 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004743 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004744 ASSERT_TRUE(newSurface->isValid());
4745
4746 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004747 asTransaction([&](Transaction& t) {
4748 t.hide(mChild);
4749 t.show(newSurface);
4750 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004751 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004752 t.setPosition(mFGSurfaceControl, 64, 64);
4753 });
chaviwf1961f72017-09-18 16:41:07 -07004754
4755 {
chaviw0e3479f2018-09-10 16:49:30 -07004756 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004757 // Top left of foreground must now be visible
4758 mCapture->expectFGColor(64, 64);
4759 // At 10, 10 we should see the new surface
4760 mCapture->checkPixel(10, 10, 63, 195, 63);
4761 }
4762
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004763 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004764
4765 {
chaviw0e3479f2018-09-10 16:49:30 -07004766 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004767 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4768 // mFGSurface, putting it at 74, 74.
4769 mCapture->expectFGColor(64, 64);
4770 mCapture->checkPixel(74, 74, 63, 195, 63);
4771 mCapture->expectFGColor(84, 84);
4772 }
4773}
4774
chaviwc9674332017-08-28 12:32:18 -07004775TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004776 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4777 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004778 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4779
4780 {
chaviw0e3479f2018-09-10 16:49:30 -07004781 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004782 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4783 // which begins at 64, 64
4784 mCapture->checkPixel(64, 64, 50, 50, 50);
4785 }
4786}
4787
Robert Carr503c7042017-09-27 15:06:08 -07004788TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004789 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004790 fillSurfaceRGBA8(relative, 255, 255, 255);
4791
4792 Transaction t;
4793 t.setLayer(relative, INT32_MAX)
4794 .setRelativeLayer(mChild, relative->getHandle(), 1)
4795 .setPosition(mFGSurfaceControl, 0, 0)
4796 .apply(true);
4797
4798 // We expect that the child should have been elevated above our
4799 // INT_MAX layer even though it's not a child of it.
4800 {
chaviw0e3479f2018-09-10 16:49:30 -07004801 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004802 mCapture->expectChildColor(0, 0);
4803 mCapture->expectChildColor(9, 9);
4804 mCapture->checkPixel(10, 10, 255, 255, 255);
4805 }
4806}
Vishnu Nair60356342018-11-13 13:00:45 -08004807class BoundlessLayerTest : public LayerUpdateTest {
4808protected:
4809 std::unique_ptr<ScreenCapture> mCapture;
4810};
4811
4812// Verify setting a size on a buffer layer has no effect.
4813TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4814 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004815 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4816 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004817 ASSERT_TRUE(bufferLayer->isValid());
4818 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4819 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4820 {
4821 mCapture = screenshot();
4822 // Top left of background must now be visible
4823 mCapture->expectBGColor(0, 0);
4824 // Foreground Surface bounds must be color layer
4825 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4826 // Buffer layer should not extend past buffer bounds
4827 mCapture->expectFGColor(95, 95);
4828 }
4829}
4830
4831// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4832// which will crop the color layer.
4833TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4834 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004835 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4836 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004837 ASSERT_TRUE(colorLayer->isValid());
4838 asTransaction([&](Transaction& t) {
4839 t.setColor(colorLayer, half3{0, 0, 0});
4840 t.show(colorLayer);
4841 });
4842 {
4843 mCapture = screenshot();
4844 // Top left of background must now be visible
4845 mCapture->expectBGColor(0, 0);
4846 // Foreground Surface bounds must be color layer
4847 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4848 // Color layer should not extend past foreground bounds
4849 mCapture->expectBGColor(129, 129);
4850 }
4851}
4852
4853// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4854// a crop which will be used to crop the color layer.
4855TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004856 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4857 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004858 ASSERT_TRUE(cropLayer->isValid());
4859 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004860 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4861 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004862 ASSERT_TRUE(colorLayer->isValid());
4863 asTransaction([&](Transaction& t) {
4864 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4865 t.setColor(colorLayer, half3{0, 0, 0});
4866 t.show(cropLayer);
4867 t.show(colorLayer);
4868 });
4869 {
4870 mCapture = screenshot();
4871 // Top left of background must now be visible
4872 mCapture->expectBGColor(0, 0);
4873 // Top left of foreground must now be visible
4874 mCapture->expectFGColor(64, 64);
4875 // 5 pixels from the foreground we should see the child surface
4876 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4877 // 10 pixels from the foreground we should be back to the foreground surface
4878 mCapture->expectFGColor(74, 74);
4879 }
4880}
4881
4882// Verify for boundless layer with no children, their transforms have no effect.
4883TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4884 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004885 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4886 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004887 ASSERT_TRUE(colorLayer->isValid());
4888 asTransaction([&](Transaction& t) {
4889 t.setPosition(colorLayer, 320, 320);
4890 t.setMatrix(colorLayer, 2, 0, 0, 2);
4891 t.setColor(colorLayer, half3{0, 0, 0});
4892 t.show(colorLayer);
4893 });
4894 {
4895 mCapture = screenshot();
4896 // Top left of background must now be visible
4897 mCapture->expectBGColor(0, 0);
4898 // Foreground Surface bounds must be color layer
4899 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4900 // Color layer should not extend past foreground bounds
4901 mCapture->expectBGColor(129, 129);
4902 }
4903}
4904
4905// Verify for boundless layer with children, their transforms have an effect.
4906TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4907 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004908 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4909 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004910 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4911 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004912 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4913 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004914 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4915 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004916 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4917 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004918 ASSERT_TRUE(colorLayer->isValid());
4919 asTransaction([&](Transaction& t) {
4920 t.setPosition(boundlessLayerRightShift, 32, 0);
4921 t.show(boundlessLayerRightShift);
4922 t.setPosition(boundlessLayerDownShift, 0, 32);
4923 t.show(boundlessLayerDownShift);
4924 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4925 t.setColor(colorLayer, half3{0, 0, 0});
4926 t.show(colorLayer);
4927 });
4928 {
4929 mCapture = screenshot();
4930 // Top left of background must now be visible
4931 mCapture->expectBGColor(0, 0);
4932 // Top left of foreground must now be visible
4933 mCapture->expectFGColor(64, 64);
4934 // Foreground Surface bounds must be color layer
4935 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4936 // Color layer should not extend past foreground bounds
4937 mCapture->expectBGColor(129, 129);
4938 }
4939}
4940
4941// Verify child layers do not get clipped if they temporarily move into the negative
4942// coordinate space as the result of an intermediate transformation.
4943TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4944 sp<SurfaceControl> boundlessLayer =
4945 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4946 0 /* flags */, mFGSurfaceControl.get());
4947 ASSERT_TRUE(boundlessLayer != nullptr);
4948 ASSERT_TRUE(boundlessLayer->isValid());
4949 sp<SurfaceControl> colorLayer =
4950 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4951 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
4952 ASSERT_TRUE(colorLayer != nullptr);
4953 ASSERT_TRUE(colorLayer->isValid());
4954 asTransaction([&](Transaction& t) {
4955 // shift child layer off bounds. If this layer was not boundless, we will
4956 // expect the child layer to be cropped.
4957 t.setPosition(boundlessLayer, 32, 32);
4958 t.show(boundlessLayer);
4959 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4960 // undo shift by parent
4961 t.setPosition(colorLayer, -32, -32);
4962 t.setColor(colorLayer, half3{0, 0, 0});
4963 t.show(colorLayer);
4964 });
4965 {
4966 mCapture = screenshot();
4967 // Top left of background must now be visible
4968 mCapture->expectBGColor(0, 0);
4969 // Foreground Surface bounds must be color layer
4970 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4971 // Color layer should not extend past foreground bounds
4972 mCapture->expectBGColor(129, 129);
4973 }
4974}
4975
4976// Verify for boundless root layers with children, their transforms have an effect.
4977TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004978 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
4979 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08004980 ASSERT_TRUE(rootBoundlessLayer->isValid());
4981 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004982 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4983 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
4984
Vishnu Nair60356342018-11-13 13:00:45 -08004985 ASSERT_TRUE(colorLayer->isValid());
4986 asTransaction([&](Transaction& t) {
4987 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
4988 t.setPosition(rootBoundlessLayer, 32, 32);
4989 t.show(rootBoundlessLayer);
4990 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4991 t.setColor(colorLayer, half3{0, 0, 0});
4992 t.show(colorLayer);
4993 t.hide(mFGSurfaceControl);
4994 });
4995 {
4996 mCapture = screenshot();
4997 // Top left of background must now be visible
4998 mCapture->expectBGColor(0, 0);
4999 // Top left of foreground must now be visible
5000 mCapture->expectBGColor(31, 31);
5001 // Foreground Surface bounds must be color layer
5002 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5003 // Color layer should not extend past foreground bounds
5004 mCapture->expectBGColor(97, 97);
5005 }
5006}
Robert Carr503c7042017-09-27 15:06:08 -07005007
chaviwa76b2712017-09-20 12:02:26 -07005008class ScreenCaptureTest : public LayerUpdateTest {
5009protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005010 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005011};
5012
5013TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5014 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005015 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005016 mCapture->expectBGColor(0, 0);
5017 // Doesn't capture FG layer which is at 64, 64
5018 mCapture->expectBGColor(64, 64);
5019}
5020
5021TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
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());
chaviwa76b2712017-09-20 12:02:26 -07005026 fillSurfaceRGBA8(child, 200, 200, 200);
5027
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005028 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005029
5030 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005031 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005032 mCapture->expectFGColor(10, 10);
5033 mCapture->expectChildColor(0, 0);
5034}
5035
Robert Carr578038f2018-03-09 12:25:24 -08005036TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5037 auto fgHandle = mFGSurfaceControl->getHandle();
5038
Vishnu Nair88a11f22018-11-28 18:30:57 -08005039 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5040 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005041 fillSurfaceRGBA8(child, 200, 200, 200);
5042
5043 SurfaceComposerClient::Transaction().show(child).apply(true);
5044
5045 // Captures mFGSurfaceControl's child
5046 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5047 mCapture->checkPixel(10, 10, 0, 0, 0);
5048 mCapture->expectChildColor(0, 0);
5049}
5050
chaviw50da5042018-04-09 13:49:37 -07005051TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005052 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5053 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005054
5055 fillSurfaceRGBA8(child, 200, 200, 200);
5056
5057 SurfaceComposerClient::Transaction().show(child).apply(true);
5058
5059 auto childHandle = child->getHandle();
5060
5061 // Captures child
5062 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5063 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5064 // Area outside of child's bounds is transparent.
5065 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5066}
5067
chaviw4b129c22018-04-09 16:19:43 -07005068TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5069 auto fgHandle = mFGSurfaceControl->getHandle();
5070
Vishnu Nair88a11f22018-11-28 18:30:57 -08005071 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5072 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5073 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005074 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005075 fillSurfaceRGBA8(child, 200, 200, 200);
5076 fillSurfaceRGBA8(relative, 100, 100, 100);
5077
5078 SurfaceComposerClient::Transaction()
5079 .show(child)
5080 // Set relative layer above fg layer so should be shown above when computing all layers.
5081 .setRelativeLayer(relative, fgHandle, 1)
5082 .show(relative)
5083 .apply(true);
5084
5085 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5086 ScreenCapture::captureLayers(&mCapture, fgHandle);
5087 mCapture->expectFGColor(10, 10);
5088 mCapture->expectChildColor(0, 0);
5089}
5090
5091TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5092 auto fgHandle = mFGSurfaceControl->getHandle();
5093
Vishnu Nair88a11f22018-11-28 18:30:57 -08005094 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5095 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5096 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5097 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005098 fillSurfaceRGBA8(child, 200, 200, 200);
5099 fillSurfaceRGBA8(relative, 100, 100, 100);
5100
5101 SurfaceComposerClient::Transaction()
5102 .show(child)
5103 // Set relative layer below fg layer but relative to child layer so it should be shown
5104 // above child layer.
5105 .setLayer(relative, -1)
5106 .setRelativeLayer(relative, child->getHandle(), 1)
5107 .show(relative)
5108 .apply(true);
5109
5110 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5111 // relative value should be taken into account, placing it above child layer.
5112 ScreenCapture::captureLayers(&mCapture, fgHandle);
5113 mCapture->expectFGColor(10, 10);
5114 // Relative layer is showing on top of child layer
5115 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5116}
Robert Carr578038f2018-03-09 12:25:24 -08005117
5118// In the following tests we verify successful skipping of a parent layer,
5119// so we use the same verification logic and only change how we mutate
5120// the parent layer to verify that various properties are ignored.
5121class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5122public:
5123 void SetUp() override {
5124 LayerUpdateTest::SetUp();
5125
Vishnu Nair88a11f22018-11-28 18:30:57 -08005126 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5127 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005128 fillSurfaceRGBA8(mChild, 200, 200, 200);
5129
5130 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5131 }
5132
Vishnu Nair333a9572019-02-15 16:05:56 -08005133 void verify(std::function<void()> verifyStartingState) {
5134 // Verify starting state before a screenshot is taken.
5135 verifyStartingState();
5136
5137 // Verify child layer does not inherit any of the properties of its
5138 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005139 auto fgHandle = mFGSurfaceControl->getHandle();
5140 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5141 mCapture->checkPixel(10, 10, 0, 0, 0);
5142 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005143
5144 // Verify all assumptions are still true after the screenshot is taken.
5145 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005146 }
5147
5148 std::unique_ptr<ScreenCapture> mCapture;
5149 sp<SurfaceControl> mChild;
5150};
5151
Vishnu Nair333a9572019-02-15 16:05:56 -08005152// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005153TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5154
5155 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5156
5157 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005158
5159 // Before and after reparenting, verify child is properly hidden
5160 // when rendering full-screen.
5161 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005162}
5163
5164TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005165 SurfaceComposerClient::Transaction()
5166 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5167 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005168
5169 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005170
5171 // Before and after reparenting, verify child is cropped by parent.
5172 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005173}
5174
Vishnu Nair333a9572019-02-15 16:05:56 -08005175// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005176TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005177 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005178
5179 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005180
Vishnu Nair333a9572019-02-15 16:05:56 -08005181 // Before and after reparenting, verify child is properly scaled.
5182 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005183}
5184
5185
chaviwa76b2712017-09-20 12:02:26 -07005186TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5187 auto fgHandle = mFGSurfaceControl->getHandle();
5188
Vishnu Nair88a11f22018-11-28 18:30:57 -08005189 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5190 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005191 fillSurfaceRGBA8(child, 200, 200, 200);
5192
Vishnu Nair88a11f22018-11-28 18:30:57 -08005193 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5194 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005195
5196 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5197 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005198 .show(child)
5199 .setPosition(grandchild, 5, 5)
5200 .show(grandchild)
5201 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005202
5203 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005204 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005205 mCapture->expectFGColor(10, 10);
5206 mCapture->expectChildColor(0, 0);
5207 mCapture->checkPixel(5, 5, 50, 50, 50);
5208}
5209
5210TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005211 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5212 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005213 fillSurfaceRGBA8(child, 200, 200, 200);
5214 auto childHandle = child->getHandle();
5215
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005216 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005217
5218 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005219 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005220 mCapture->expectChildColor(0, 0);
5221 mCapture->expectChildColor(9, 9);
5222}
5223
5224TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005225 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5226 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005227 fillSurfaceRGBA8(child, 200, 200, 200);
5228 auto childHandle = child->getHandle();
5229
Vishnu Nair88a11f22018-11-28 18:30:57 -08005230 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5231 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005232 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5233
5234 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005235 .show(child)
5236 .setPosition(grandchild, 5, 5)
5237 .show(grandchild)
5238 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005239
5240 auto grandchildHandle = grandchild->getHandle();
5241
5242 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005243 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005244 mCapture->checkPixel(0, 0, 50, 50, 50);
5245 mCapture->checkPixel(4, 4, 50, 50, 50);
5246}
5247
chaviw7206d492017-11-10 16:16:12 -08005248TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005249 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005250 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5251 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005252
Marissa Wall61c58622018-07-18 10:12:20 -07005253 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5254 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005255
5256 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005257 .setLayer(redLayer, INT32_MAX - 1)
5258 .show(redLayer)
5259 .show(blueLayer)
5260 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005261
5262 auto redLayerHandle = redLayer->getHandle();
5263
5264 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005265 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5266 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5267 // red area below the blue area
5268 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5269 // red area to the right of the blue area
5270 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005271
Marissa Wall861616d2018-10-22 12:52:23 -07005272 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005273 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005274 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5275 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005276 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005277 mCapture->checkPixel(30, 30, 0, 0, 0);
5278}
5279
5280TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005281 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005282 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5283 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005284
Marissa Wall61c58622018-07-18 10:12:20 -07005285 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5286 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005287
5288 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005289 .setLayer(redLayer, INT32_MAX - 1)
5290 .show(redLayer)
5291 .show(blueLayer)
5292 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005293
5294 auto redLayerHandle = redLayer->getHandle();
5295
5296 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005297 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5298 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5299 // red area below the blue area
5300 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5301 // red area to the right of the blue area
5302 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005303
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005304 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005305 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005306 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5307 // red area below the blue area
5308 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5309 // red area to the right of the blue area
5310 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005311 mCapture->checkPixel(30, 30, 0, 0, 0);
5312}
5313
5314TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005315 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005316
Marissa Wall61c58622018-07-18 10:12:20 -07005317 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005318
5319 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005320 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005321 SurfaceComposerClient::Transaction().apply(true);
5322
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005323 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005324
5325 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005326 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5327 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005328}
5329
chaviw8e3fe5d2018-02-22 10:55:42 -08005330
5331class DereferenceSurfaceControlTest : public LayerTransactionTest {
5332protected:
5333 void SetUp() override {
5334 LayerTransactionTest::SetUp();
5335 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005336 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005337 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005338 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005339 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5340 {
5341 SCOPED_TRACE("before anything");
5342 auto shot = screenshot();
5343 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5344 }
5345 }
5346 void TearDown() override {
5347 LayerTransactionTest::TearDown();
5348 bgLayer = 0;
5349 fgLayer = 0;
5350 }
5351
5352 sp<SurfaceControl> bgLayer;
5353 sp<SurfaceControl> fgLayer;
5354};
5355
5356TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5357 fgLayer = nullptr;
5358 {
5359 SCOPED_TRACE("after setting null");
5360 auto shot = screenshot();
5361 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5362 }
5363}
5364
5365TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5366 auto transaction = Transaction().show(fgLayer);
5367 fgLayer = nullptr;
5368 {
5369 SCOPED_TRACE("after setting null");
5370 auto shot = screenshot();
5371 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5372 }
5373}
5374
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005375class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5376protected:
5377 virtual void SetUp() {
5378 LayerTransactionTest::SetUp();
5379 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5380
5381 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5382 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5383
5384 sp<IGraphicBufferConsumer> consumer;
5385 BufferQueue::createBufferQueue(&mProducer, &consumer);
5386 consumer->setConsumerName(String8("Virtual disp consumer"));
5387 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5388 }
5389
5390 virtual void TearDown() {
5391 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5392 LayerTransactionTest::TearDown();
5393 mColorLayer = 0;
5394 }
5395
5396 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5397 mVirtualDisplay =
5398 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5399 asTransaction([&](Transaction& t) {
5400 t.setDisplaySurface(mVirtualDisplay, mProducer);
5401 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5402 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5403 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5404 });
5405 }
5406
5407 void createColorLayer(uint32_t layerStack) {
5408 mColorLayer =
5409 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5410 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5411 ASSERT_TRUE(mColorLayer != nullptr);
5412 ASSERT_TRUE(mColorLayer->isValid());
5413 asTransaction([&](Transaction& t) {
5414 t.setLayerStack(mColorLayer, layerStack);
5415 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5416 t.setLayer(mColorLayer, INT32_MAX - 2);
5417 t.setColor(mColorLayer,
5418 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5419 mExpectedColor.b / 255.0f});
5420 t.show(mColorLayer);
5421 });
5422 }
5423
5424 DisplayInfo mMainDisplayInfo;
5425 sp<IBinder> mMainDisplay;
5426 sp<IBinder> mVirtualDisplay;
5427 sp<IGraphicBufferProducer> mProducer;
5428 sp<SurfaceControl> mColorLayer;
5429 Color mExpectedColor = {63, 63, 195, 255};
5430};
5431
5432TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5433 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5434 createColorLayer(1 /* layerStack */);
5435
5436 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5437
5438 // Verify color layer does not render on main display.
5439 std::unique_ptr<ScreenCapture> sc;
5440 ScreenCapture::captureScreen(&sc, mMainDisplay);
5441 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5442 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5443
5444 // Verify color layer renders correctly on virtual display.
5445 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5446 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5447 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5448}
5449
5450TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5451 // Create a display and set its layer stack to the main display's layer stack so
5452 // the contents of the main display are mirrored on to the virtual display.
5453
5454 // Assumption here is that the new mirrored display has the same viewport as the
5455 // primary display that it is mirroring.
5456 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5457 createColorLayer(0 /* layerStack */);
5458
5459 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5460
5461 // Verify color layer renders correctly on main display and it is mirrored on the
5462 // virtual display.
5463 std::unique_ptr<ScreenCapture> sc;
5464 ScreenCapture::captureScreen(&sc, mMainDisplay);
5465 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5466 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5467
5468 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5469 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5470 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5471}
5472
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005473} // namespace android