blob: 6c518bcc77010a2a9e0f644d812e3f04016043bf [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>
Robert Carrfa8855f2019-02-19 10:05:00 -080036#include <private/android_filesystem_config.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080037
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070038#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070039#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070040#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070041#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070042
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070043#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070044#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080045#include <sys/types.h>
46#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070047
Marissa Wall713b63f2018-10-17 15:42:43 -070048#include "BufferGenerator.h"
49
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070050namespace android {
51
Chia-I Wu718daf82017-10-20 11:57:17 -070052namespace {
53
54struct Color {
55 uint8_t r;
56 uint8_t g;
57 uint8_t b;
58 uint8_t a;
59
60 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070061 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070062 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070063 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070064 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070065 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070066};
67
68const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070069const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070070const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070071const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070072const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070073const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070074
Marissa Wall61c58622018-07-18 10:12:20 -070075using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070076using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070077
Chia-I Wu718daf82017-10-20 11:57:17 -070078std::ostream& operator<<(std::ostream& os, const Color& color) {
79 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
80 return os;
81}
82
83// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070084void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
85 const Color& color) {
86 Rect r(0, 0, buffer.width, buffer.height);
87 if (!r.intersect(rect, &r)) {
88 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070089 }
90
Marissa Wall61c58622018-07-18 10:12:20 -070091 int32_t width = r.right - r.left;
92 int32_t height = r.bottom - r.top;
93
94 for (int32_t row = 0; row < height; row++) {
95 uint8_t* dst =
96 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
97 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070098 dst[0] = color.r;
99 dst[1] = color.g;
100 dst[2] = color.b;
101 dst[3] = color.a;
102 dst += 4;
103 }
104 }
105}
106
Marissa Wall61c58622018-07-18 10:12:20 -0700107// Fill a region with the specified color.
108void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
109 Rect r(0, 0, buffer->width, buffer->height);
110 if (!r.intersect(rect, &r)) {
111 return;
112 }
113
114 int32_t width = r.right - r.left;
115 int32_t height = r.bottom - r.top;
116
117 uint8_t* pixels;
118 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
119 reinterpret_cast<void**>(&pixels));
120
121 for (int32_t row = 0; row < height; row++) {
122 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
123 for (int32_t column = 0; column < width; column++) {
124 dst[0] = color.r;
125 dst[1] = color.g;
126 dst[2] = color.b;
127 dst[3] = color.a;
128 dst += 4;
129 }
130 }
131 buffer->unlock();
132}
133
Chia-I Wu718daf82017-10-20 11:57:17 -0700134// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000135void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700136 const Color& color, uint8_t tolerance) {
137 int32_t x = rect.left;
138 int32_t y = rect.top;
139 int32_t width = rect.right - rect.left;
140 int32_t height = rect.bottom - rect.top;
141
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000142 int32_t bufferWidth = int32_t(outBuffer->getWidth());
143 int32_t bufferHeight = int32_t(outBuffer->getHeight());
144 if (x + width > bufferWidth) {
145 x = std::min(x, bufferWidth);
146 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700147 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000148 if (y + height > bufferHeight) {
149 y = std::min(y, bufferHeight);
150 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700151 }
152
153 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
154 uint8_t tmp = a >= b ? a - b : b - a;
155 return tmp <= tolerance;
156 };
157 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000158 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700159 for (int32_t i = 0; i < width; i++) {
160 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
161 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
162 << "pixel @ (" << x + i << ", " << y + j << "): "
163 << "expected (" << color << "), "
164 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
165 src += 4;
166 }
167 }
168}
169
170} // anonymous namespace
171
Robert Carr4cdc58f2017-08-23 14:22:20 -0700172using Transaction = SurfaceComposerClient::Transaction;
173
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700174// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700175static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
176 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800177 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700178 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800179 ASSERT_TRUE(s != nullptr);
180 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800181 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700182 for (int y = 0; y < outBuffer.height; y++) {
183 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700184 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700185 pixel[0] = r;
186 pixel[1] = g;
187 pixel[2] = b;
188 pixel[3] = 255;
189 }
190 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700191 if (unlock) {
192 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
193 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700194}
195
196// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
197// individual pixel values for testing purposes.
198class ScreenCapture : public RefBase {
199public:
chaviw0e3479f2018-09-10 16:49:30 -0700200 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800201 const auto sf = ComposerService::getComposerService();
202 const auto token = sf->getInternalDisplayToken();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700203 SurfaceComposerClient::Transaction().apply(true);
204
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000205 sp<GraphicBuffer> outBuffer;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800206 ASSERT_EQ(NO_ERROR, sf->captureScreen(token, &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
Marissa Wall713b63f2018-10-17 15:42:43 -0700485 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
486 static BufferGenerator bufferGenerator;
487 return bufferGenerator.get(outBuffer, outFence);
488 }
489
Chia-I Wu718daf82017-10-20 11:57:17 -0700490 sp<SurfaceComposerClient> mClient;
491
492 sp<IBinder> mDisplay;
493 uint32_t mDisplayWidth;
494 uint32_t mDisplayHeight;
495 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700496 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700497
498 // leave room for ~256 layers
499 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
500
chaviw0e3479f2018-09-10 16:49:30 -0700501 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700502 bool mColorManagementUsed;
503
Chia-I Wu718daf82017-10-20 11:57:17 -0700504private:
505 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800506 mDisplay = mClient->getInternalDisplayToken();
507 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700508
509 // get display width/height
510 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800511 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700512 mDisplayWidth = info.w;
513 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700514 mDisplayRect =
515 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700516
517 // After a new buffer is queued, SurfaceFlinger is notified and will
518 // latch the new buffer on next vsync. Let's heuristically wait for 3
519 // vsyncs.
520 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
521
522 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700523
Vishnu Nair88a11f22018-11-28 18:30:57 -0800524 mBlackBgSurface =
525 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
526 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700527
Chia-I Wu718daf82017-10-20 11:57:17 -0700528 // set layer stack (b/68888219)
529 Transaction t;
530 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800531 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700532 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
533 t.setColor(mBlackBgSurface, half3{0, 0, 0});
534 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700535 t.apply();
536 }
537
chaviw0e3479f2018-09-10 16:49:30 -0700538 void waitForLayerBuffers() {
539 // Request an empty transaction to get applied synchronously to ensure the buffer is
540 // latched.
541 Transaction().apply(true);
542 usleep(mBufferPostDelay);
543 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700544
545 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800546
547 friend class LayerRenderPathTestHarness;
548};
549enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
550
551class LayerRenderPathTestHarness {
552public:
553 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
554 : mDelegate(delegate), mRenderPath(renderPath) {}
555
556 std::unique_ptr<ScreenCapture> getScreenCapture() {
557 switch (mRenderPath) {
558 case RenderPath::SCREENSHOT:
559 return mDelegate->screenshot();
560 case RenderPath::VIRTUAL_DISPLAY:
561
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800562 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800563 DisplayInfo mainDisplayInfo;
564 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
565
566 sp<IBinder> vDisplay;
567 sp<IGraphicBufferProducer> producer;
568 sp<IGraphicBufferConsumer> consumer;
569 sp<BufferItemConsumer> itemConsumer;
570 BufferQueue::createBufferQueue(&producer, &consumer);
571
572 consumer->setConsumerName(String8("Virtual disp consumer"));
573 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
574
575 itemConsumer = new BufferItemConsumer(consumer,
576 // Sample usage bits from screenrecord
577 GRALLOC_USAGE_HW_VIDEO_ENCODER |
578 GRALLOC_USAGE_SW_READ_OFTEN);
579
580 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
581 false /*secure*/);
582
583 SurfaceComposerClient::Transaction t;
584 t.setDisplaySurface(vDisplay, producer);
585 t.setDisplayLayerStack(vDisplay, 0);
586 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
587 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
588 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
589 t.apply();
590 SurfaceComposerClient::Transaction().apply(true);
591 BufferItem item;
592 itemConsumer->acquireBuffer(&item, 0, true);
593 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
594 itemConsumer->releaseBuffer(item);
595 SurfaceComposerClient::destroyDisplay(vDisplay);
596 return sc;
597 }
598 }
599
600protected:
601 LayerTransactionTest* mDelegate;
602 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700603};
604
Alec Mouri80863a62019-01-17 15:19:35 -0800605class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700606public:
Alec Mouri80863a62019-01-17 15:19:35 -0800607 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700608
609 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800610 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700611 // if the flags already have a layer type specified, return an error
612 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
613 return nullptr;
614 }
chaviwf66724d2018-11-28 16:35:21 -0800615 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700616 }
617
618 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
619 int32_t bufferHeight) {
620 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
621 bufferWidth, bufferHeight));
622 }
623
624 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
625 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
626 const Color& bottomLeft, const Color& bottomRight) {
627 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
628 bufferWidth, bufferHeight,
629 topLeft, topRight,
630 bottomLeft, bottomRight));
631 }
632
633protected:
634 uint32_t mLayerType;
635};
636
Alec Mouri80863a62019-01-17 15:19:35 -0800637class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
638 public ::testing::WithParamInterface<uint32_t> {
639public:
640 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
641};
642
643class LayerTypeAndRenderTypeTransactionTest
644 : public LayerTypeTransactionHarness,
645 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
646public:
647 LayerTypeAndRenderTypeTransactionTest()
648 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
649 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
650
651 std::unique_ptr<ScreenCapture> getScreenCapture() {
652 return mRenderPathHarness.getScreenCapture();
653 }
654
655protected:
656 LayerRenderPathTestHarness mRenderPathHarness;
657};
658
659// Environment for starting up binder threads. This is required for testing
660// virtual displays, as BufferQueue parameters may be queried over binder.
661class BinderEnvironment : public ::testing::Environment {
662public:
663 void SetUp() override { ProcessState::self()->startThreadPool(); }
664};
665
666::testing::Environment* const binderEnv =
667 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
668
669class LayerRenderTypeTransactionTest : public LayerTransactionTest,
670 public ::testing::WithParamInterface<RenderPath> {
671public:
672 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
673
674 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
675 void setRelativeZBasicHelper(uint32_t layerType);
676 void setRelativeZGroupHelper(uint32_t layerType);
677 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800678 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
679 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800680
681protected:
682 LayerRenderPathTestHarness mHarness;
683};
684
685INSTANTIATE_TEST_CASE_P(
686 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
687 ::testing::Combine(
688 ::testing::Values(
689 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
690 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
691 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
692
693INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
694 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
695
Marissa Wall61c58622018-07-18 10:12:20 -0700696INSTANTIATE_TEST_CASE_P(
697 LayerTypeTransactionTests, LayerTypeTransactionTest,
698 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
699 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
700
Alec Mouri80863a62019-01-17 15:19:35 -0800701TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700702 sp<SurfaceControl> layer;
703 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700704 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700705
706 {
707 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700708 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800709 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700710 shot->expectColor(rect, Color::RED);
711 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700712 }
713
714 Transaction().setPosition(layer, 5, 10).apply();
715 {
716 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700717 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800718 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700719 shot->expectColor(rect, Color::RED);
720 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700721 }
722}
723
Alec Mouri80863a62019-01-17 15:19:35 -0800724TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700725 sp<SurfaceControl> layer;
726 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700727 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700728
729 // GLES requires only 4 bits of subpixel precision during rasterization
730 // XXX GLES composition does not match HWC composition due to precision
731 // loss (b/69315223)
732 const float epsilon = 1.0f / 16.0f;
733 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
734 {
735 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800736 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700737 }
738
739 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
740 {
741 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800742 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700743 }
744}
745
Alec Mouri80863a62019-01-17 15:19:35 -0800746TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700747 sp<SurfaceControl> layer;
748 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700749 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700750
751 Transaction().setPosition(layer, -32, -32).apply();
752 {
753 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800754 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700755 }
756
757 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
758 {
759 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762}
763
Alec Mouri80863a62019-01-17 15:19:35 -0800764TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700765 sp<SurfaceControl> layer;
766 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700767 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700768
769 // partially out of bounds
770 Transaction().setPosition(layer, -30, -30).apply();
771 {
772 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800773 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700774 }
775
776 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
777 {
778 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800779 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
780 mDisplayHeight),
781 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700782 }
783}
784
Alec Mouri80863a62019-01-17 15:19:35 -0800785TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700786 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700787 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
788 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700789
790 // setPosition is applied immediately by default, with or without resize
791 // pending
792 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
793 {
794 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800795 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700796 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700797 shot->expectColor(rect, Color::RED);
798 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700799 }
800
Marissa Wall861616d2018-10-22 12:52:23 -0700801 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 {
803 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800804 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700805 }
806}
807
Alec Mouri80863a62019-01-17 15:19:35 -0800808TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700809 sp<SurfaceControl> layer;
810 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700811 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700812
813 // request setPosition to be applied with the next resize
814 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
815 {
816 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800817 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700818 }
819
820 Transaction().setPosition(layer, 15, 20).apply();
821 {
822 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800823 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700824 }
825
826 Transaction().setSize(layer, 64, 64).apply();
827 {
828 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800829 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700830 }
831
832 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700833 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700834 {
835 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800836 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700837 }
838}
839
Alec Mouri80863a62019-01-17 15:19:35 -0800840TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700841 sp<SurfaceControl> layer;
842 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700843 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700844
845 // setPosition is not immediate even with SCALE_TO_WINDOW override
846 Transaction()
847 .setPosition(layer, 5, 10)
848 .setSize(layer, 64, 64)
849 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
850 .setGeometryAppliesWithResize(layer)
851 .apply();
852 {
853 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800854 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 }
856
Marissa Wall61c58622018-07-18 10:12:20 -0700857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 {
859 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862}
863
Alec Mouri80863a62019-01-17 15:19:35 -0800864TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700865 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700866 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700868
869 Transaction().setSize(layer, 64, 64).apply();
870 {
871 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800872 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700873 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700874 shot->expectColor(rect, Color::RED);
875 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700876 }
877
Marissa Wall861616d2018-10-22 12:52:23 -0700878 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700879 {
880 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800881 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700882 const Rect rect(0, 0, 64, 64);
883 shot->expectColor(rect, Color::RED);
884 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700885 }
886}
887
Alec Mouri80863a62019-01-17 15:19:35 -0800888TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 // cannot test robustness against invalid sizes (zero or really huge)
890}
891
Alec Mouri80863a62019-01-17 15:19:35 -0800892TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700893 sp<SurfaceControl> layer;
894 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700895 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700896
897 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
898 Transaction()
899 .setSize(layer, 64, 64)
900 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
901 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800902 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903}
904
Alec Mouri80863a62019-01-17 15:19:35 -0800905TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700906 sp<SurfaceControl> layerR;
907 sp<SurfaceControl> layerG;
908 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700909 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700910 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700911 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700912
913 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
914 {
915 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800916 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700917 }
918
919 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
920 {
921 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800922 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700923 }
924}
925
Alec Mouri80863a62019-01-17 15:19:35 -0800926TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700927 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800928 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700929 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800930 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700931 sp<SurfaceControl> layerR;
932 sp<SurfaceControl> layerG;
933 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700934 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700935 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700936 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700937
chaviw0e3479f2018-09-10 16:49:30 -0700938 Transaction()
939 .reparent(layerR, parent->getHandle())
940 .reparent(layerG, parent->getHandle())
941 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700942 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
943 {
944 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800945 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700946 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 }
948
949 Transaction().setLayer(layerR, -3).apply();
950 {
951 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800952 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700953 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700954 }
955}
956
Alec Mouri80863a62019-01-17 15:19:35 -0800957void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700958 sp<SurfaceControl> layerR;
959 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700960 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
961 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
962 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
963 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700964
Marissa Wall861616d2018-10-22 12:52:23 -0700965 switch (layerType) {
966 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
967 Transaction()
968 .setPosition(layerG, 16, 16)
969 .setRelativeLayer(layerG, layerR->getHandle(), 1)
970 .apply();
971 break;
972 case ISurfaceComposerClient::eFXSurfaceBufferState:
973 Transaction()
974 .setFrame(layerR, Rect(0, 0, 32, 32))
975 .setFrame(layerG, Rect(16, 16, 48, 48))
976 .setRelativeLayer(layerG, layerR->getHandle(), 1)
977 .apply();
978 break;
979 default:
980 ASSERT_FALSE(true) << "Unsupported layer type";
981 }
Chia-I Wu49313302017-10-31 10:14:40 -0700982 {
983 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -0800984 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700985 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
986 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
987 }
988
989 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
990 {
991 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -0800992 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -0700993 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
994 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
995 }
996}
997
Alec Mouri80863a62019-01-17 15:19:35 -0800998TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -0700999 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1000}
1001
Alec Mouri80863a62019-01-17 15:19:35 -08001002TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001003 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1004}
1005
Marissa Wall61c58622018-07-18 10:12:20 -07001006TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001007 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001008 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001009 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001010 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001011 sp<SurfaceControl> layerR;
1012 sp<SurfaceControl> layerG;
1013 sp<SurfaceControl> layerB;
1014 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001015 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001016 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001017 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001018 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001019 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001020
chaviw0e3479f2018-09-10 16:49:30 -07001021 Transaction()
1022 .reparent(layerB, parent->getHandle())
1023 .apply();
1024
Chia-I Wuec2d9852017-11-21 09:21:01 -08001025 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1026 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1027
chaviw0e3479f2018-09-10 16:49:30 -07001028 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001029 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001030 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001031 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001032 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1033}
1034
Alec Mouri80863a62019-01-17 15:19:35 -08001035void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001036 sp<SurfaceControl> layerR;
1037 sp<SurfaceControl> layerG;
1038 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001039 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1040 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1041 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1042 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1043 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1044 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001045
1046 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001047 switch (layerType) {
1048 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1049 Transaction()
1050 .setPosition(layerG, 8, 8)
1051 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1052 .setPosition(layerB, 16, 16)
1053 .setLayer(layerB, mLayerZBase + 2)
1054 .apply();
1055 break;
1056 case ISurfaceComposerClient::eFXSurfaceBufferState:
1057 Transaction()
1058 .setFrame(layerR, Rect(0, 0, 32, 32))
1059 .setFrame(layerG, Rect(8, 8, 40, 40))
1060 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1061 .setFrame(layerB, Rect(16, 16, 48, 48))
1062 .setLayer(layerB, mLayerZBase + 2)
1063 .apply();
1064 break;
1065 default:
1066 ASSERT_FALSE(true) << "Unsupported layer type";
1067 }
1068
Chia-I Wu49313302017-10-31 10:14:40 -07001069 {
1070 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001071 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001072 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1073 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1074 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1075 }
1076
1077 // layerR = 4, layerG = layerR + 3, layerB = 2
1078 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1079 {
1080 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001081 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001082 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1083 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1084 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1085 }
1086
1087 // layerR = 4, layerG = layerR - 3, layerB = 2
1088 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1089 {
1090 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001091 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001092 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1093 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1094 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1095 }
1096
1097 // restore to absolute z
1098 // layerR = 4, layerG = 0, layerB = 2
1099 Transaction().setLayer(layerG, mLayerZBase).apply();
1100 {
1101 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001102 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001103 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1104 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1105 }
1106
1107 // layerR should not affect layerG anymore
1108 // layerR = 1, layerG = 0, layerB = 2
1109 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1110 {
1111 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001112 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001113 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1114 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1115 }
1116}
1117
Alec Mouri80863a62019-01-17 15:19:35 -08001118TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001119 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1120}
1121
Alec Mouri80863a62019-01-17 15:19:35 -08001122TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001123 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1124}
1125
Alec Mouri80863a62019-01-17 15:19:35 -08001126TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001127 sp<SurfaceControl> layerR;
1128 sp<SurfaceControl> layerG;
1129
1130 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001131 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001132 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001133 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001134
1135 Transaction()
1136 .setPosition(layerG, 16, 16)
1137 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1138 .apply();
1139
Robert Carr87246532019-02-04 15:20:26 -08001140 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001141 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001142 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001143}
1144
Alec Mouri80863a62019-01-17 15:19:35 -08001145TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001146 sp<SurfaceControl> layer;
1147 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001148 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001149
1150 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1151 {
1152 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001153 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001154 }
1155
1156 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1157 {
1158 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001159 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001160 }
1161}
1162
Alec Mouri80863a62019-01-17 15:19:35 -08001163TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001164 const Color translucentRed = {100, 0, 0, 100};
1165 sp<SurfaceControl> layerR;
1166 sp<SurfaceControl> layerG;
1167 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001168 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001169 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001170 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001171
1172 Transaction()
1173 .setLayer(layerR, mLayerZBase + 1)
1174 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1175 .apply();
1176 {
1177 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001178 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001179 }
1180
1181 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1182 {
1183 SCOPED_TRACE("layerR translucent");
1184 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001185 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001186 }
1187}
1188
Marissa Wall61c58622018-07-18 10:12:20 -07001189TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001190 sp<SurfaceControl> layer;
1191 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001192 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001193
1194 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001195 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001196 Transaction()
1197 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1198 .apply(true);
1199 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001200 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001201
1202 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1203 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001204 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001205}
1206
Robert Carrfa8855f2019-02-19 10:05:00 -08001207/** RAII Wrapper around get/seteuid */
1208class UIDFaker {
1209 uid_t oldId;
1210public:
1211 UIDFaker(uid_t uid) {
1212 oldId = geteuid();
1213 seteuid(uid);
1214 }
1215 ~UIDFaker() {
1216 seteuid(oldId);
1217 }
1218};
1219
1220TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1221 sp<SurfaceControl> layer;
1222 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1223 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1224
1225 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1226 sp<GraphicBuffer> outBuffer;
1227 Transaction()
1228 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1229 .apply(true);
1230 ASSERT_EQ(PERMISSION_DENIED,
1231 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1232
1233 UIDFaker f(AID_SYSTEM);
1234
1235 // By default the system can capture screenshots with secure layers but they
1236 // will be blacked out
1237 ASSERT_EQ(NO_ERROR,
1238 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1239
1240 {
1241 SCOPED_TRACE("as system");
1242 auto shot = screenshot();
1243 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1244 }
1245
1246 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1247 // to receive them...we are expected to take care with the results.
1248 ASSERT_EQ(NO_ERROR,
1249 composer->captureScreen(mDisplay, &outBuffer,
1250 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888,
1251 Rect(), 0, 0, false,
1252 ISurfaceComposer::eRotateNone, true));
1253 ScreenCapture sc(outBuffer);
1254 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1255}
1256
Alec Mouri80863a62019-01-17 15:19:35 -08001257TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001258 const Rect top(0, 0, 32, 16);
1259 const Rect bottom(0, 16, 32, 32);
1260 sp<SurfaceControl> layer;
1261 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1262
1263 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001264 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1265 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1266 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001267 // setTransparentRegionHint always applies to the following buffer
1268 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001269 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001270 {
1271 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001272 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001273 shot->expectColor(top, Color::BLACK);
1274 shot->expectColor(bottom, Color::RED);
1275 }
1276
1277 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1278 {
1279 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001280 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001281 shot->expectColor(top, Color::BLACK);
1282 shot->expectColor(bottom, Color::RED);
1283 }
1284
Marissa Wall61c58622018-07-18 10:12:20 -07001285 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1286 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1287 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1288 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001289 {
1290 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001291 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001292 shot->expectColor(top, Color::RED);
1293 shot->expectColor(bottom, Color::BLACK);
1294 }
1295}
1296
Alec Mouri80863a62019-01-17 15:19:35 -08001297TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001298 const Rect top(0, 0, 32, 16);
1299 const Rect bottom(0, 16, 32, 32);
1300 sp<SurfaceControl> layer;
1301 ASSERT_NO_FATAL_FAILURE(
1302 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1303
1304 sp<GraphicBuffer> buffer =
1305 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1306 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1307 BufferUsage::COMPOSER_OVERLAY,
1308 "test");
1309
1310 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1311 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1312 Transaction()
1313 .setTransparentRegionHint(layer, Region(top))
1314 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001315 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001316 .apply();
1317 {
1318 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001319 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001320 shot->expectColor(top, Color::BLACK);
1321 shot->expectColor(bottom, Color::RED);
1322 }
1323
1324 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1325 {
1326 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001327 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001328 shot->expectColor(top, Color::BLACK);
1329 shot->expectColor(bottom, Color::BLACK);
1330 }
1331
1332 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1333 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1334 BufferUsage::COMPOSER_OVERLAY,
1335 "test");
1336
1337 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1338 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001339 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001340 {
1341 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001342 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001343 shot->expectColor(top, Color::RED);
1344 shot->expectColor(bottom, Color::BLACK);
1345 }
1346}
1347
Alec Mouri80863a62019-01-17 15:19:35 -08001348TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001349 sp<SurfaceControl> layerTransparent;
1350 sp<SurfaceControl> layerR;
1351 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1352 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1353
1354 // check that transparent region hint is bound by the layer size
1355 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001356 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001357 .setPosition(layerR, 16, 16)
1358 .setLayer(layerR, mLayerZBase + 1)
1359 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001360 ASSERT_NO_FATAL_FAILURE(
1361 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1362 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001363 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001364}
1365
Alec Mouri80863a62019-01-17 15:19:35 -08001366TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001367 sp<SurfaceControl> layerTransparent;
1368 sp<SurfaceControl> layerR;
1369 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1370 ASSERT_NO_FATAL_FAILURE(
1371 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1372
1373 // check that transparent region hint is bound by the layer size
1374 Transaction()
1375 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1376 .setFrame(layerR, Rect(16, 16, 48, 48))
1377 .setLayer(layerR, mLayerZBase + 1)
1378 .apply();
1379 ASSERT_NO_FATAL_FAILURE(
1380 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1381 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001382 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001383}
1384
Alec Mouri80863a62019-01-17 15:19:35 -08001385void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001386 sp<SurfaceControl> layer1;
1387 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001388 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1389 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1390 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1391 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001392
Marissa Wall861616d2018-10-22 12:52:23 -07001393 switch (layerType) {
1394 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1395 Transaction()
1396 .setAlpha(layer1, 0.25f)
1397 .setAlpha(layer2, 0.75f)
1398 .setPosition(layer2, 16, 0)
1399 .setLayer(layer2, mLayerZBase + 1)
1400 .apply();
1401 break;
1402 case ISurfaceComposerClient::eFXSurfaceBufferState:
1403 Transaction()
1404 .setAlpha(layer1, 0.25f)
1405 .setAlpha(layer2, 0.75f)
1406 .setFrame(layer1, Rect(0, 0, 32, 32))
1407 .setFrame(layer2, Rect(16, 0, 48, 32))
1408 .setLayer(layer2, mLayerZBase + 1)
1409 .apply();
1410 break;
1411 default:
1412 ASSERT_FALSE(true) << "Unsupported layer type";
1413 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001414 {
Alec Mouri80863a62019-01-17 15:19:35 -08001415 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001416 uint8_t r = 16; // 64 * 0.25f
1417 uint8_t g = 48; // 64 * 0.75f
1418 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1419 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1420
1421 r /= 4; // r * (1.0f - 0.75f)
1422 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1423 }
1424}
1425
Alec Mouri80863a62019-01-17 15:19:35 -08001426TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001427 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1428}
1429
Alec Mouri80863a62019-01-17 15:19:35 -08001430TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001431 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1432}
1433
Alec Mouri80863a62019-01-17 15:19:35 -08001434TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001435 const Color color = {64, 0, 0, 255};
1436 sp<SurfaceControl> layer;
1437 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001438 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001439
1440 Transaction().setAlpha(layer, 2.0f).apply();
1441 {
1442 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001443 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001444 }
1445
1446 Transaction().setAlpha(layer, -1.0f).apply();
1447 {
1448 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001449 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001450 }
1451}
1452
Alec Mouri80863a62019-01-17 15:19:35 -08001453TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001454 sp<SurfaceControl> layer;
1455 const uint8_t size = 64;
1456 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001457 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001458 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1459 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1460
1461 Transaction()
1462 .setCornerRadius(layer, cornerRadius)
1463 .apply();
1464 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001465 const uint8_t bottom = size - 1;
1466 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001467 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001468 // Transparent corners
1469 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001470 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1471 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1472 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1473 }
1474}
1475
Alec Mouri80863a62019-01-17 15:19:35 -08001476TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001477 sp<SurfaceControl> parent;
1478 sp<SurfaceControl> child;
1479 const uint8_t size = 64;
1480 const uint8_t testArea = 4;
1481 const float cornerRadius = 20.0f;
1482 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1483 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1484 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1485 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1486
1487 Transaction()
1488 .setCornerRadius(parent, cornerRadius)
1489 .reparent(child, parent->getHandle())
1490 .setPosition(child, 0, size / 2)
1491 .apply();
1492 {
1493 const uint8_t bottom = size - 1;
1494 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001495 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001496 // Top edge of child should not have rounded corners because it's translated in the parent
1497 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1498 Color::GREEN);
1499 // But bottom edges should have been clipped according to parent bounds
1500 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1501 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001502 }
1503}
1504
Alec Mouri80863a62019-01-17 15:19:35 -08001505TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001506 sp<SurfaceControl> bufferLayer;
1507 sp<SurfaceControl> colorLayer;
1508 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001510 ASSERT_NO_FATAL_FAILURE(colorLayer =
1511 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1512 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001513
Vishnu Nair88a11f22018-11-28 18:30:57 -08001514 Transaction()
1515 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1516 .setLayer(colorLayer, mLayerZBase + 1)
1517 .apply();
1518
Chia-I Wue4ef6102017-11-01 15:16:35 -07001519 {
1520 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001521 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001522 }
1523
1524 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1525 const Color expected = {15, 51, 85, 255};
1526 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1527 // channel) should be less than one
1528 const uint8_t tolerance = 1;
1529 Transaction().setColor(colorLayer, color).apply();
1530 {
1531 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001532 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001533 }
1534}
1535
Valerie Haudd0b7572019-01-29 14:59:27 -08001536// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1537// BLUE: prior background color
1538// GREEN: final background color
1539// BLACK: no color or fill
1540void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1541 bool bufferFill, float alpha,
1542 Color finalColor) {
1543 sp<SurfaceControl> layer;
1544 int32_t width = 500;
1545 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001546
Valerie Haudd0b7572019-01-29 14:59:27 -08001547 Color fillColor = Color::RED;
1548 Color priorBgColor = Color::BLUE;
1549 Color expectedColor = Color::BLACK;
1550 switch (layerType) {
1551 case ISurfaceComposerClient::eFXSurfaceColor:
1552 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1553 Transaction()
1554 .setCrop_legacy(layer, Rect(0, 0, width, height))
1555 .setColor(layer, half3(1.0f, 0, 0))
1556 .apply();
1557 expectedColor = fillColor;
1558 break;
1559 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1560 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1561 if (bufferFill) {
1562 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1563 expectedColor = fillColor;
1564 }
1565 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1566 break;
1567 case ISurfaceComposerClient::eFXSurfaceBufferState:
1568 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1569 if (bufferFill) {
1570 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1571 expectedColor = fillColor;
1572 }
1573 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1574 break;
1575 default:
1576 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1577 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001578 }
1579
Valerie Haudd0b7572019-01-29 14:59:27 -08001580 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1581 Transaction()
1582 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1583 .apply();
1584 if (!bufferFill) {
1585 expectedColor = priorBgColor;
1586 }
1587 }
1588
1589 {
1590 SCOPED_TRACE("default before setting background color layer");
1591 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1592 }
Valerie Haua72e2812019-01-23 13:40:39 -08001593 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001594 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001595 .apply();
1596
1597 {
Valerie Haua72e2812019-01-23 13:40:39 -08001598 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001599 shot->expectColor(Rect(0, 0, width, height), finalColor);
1600 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001601 }
1602}
1603
Valerie Haudd0b7572019-01-29 14:59:27 -08001604TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1605 bool priorColor = false;
1606 bool bufferFill = false;
1607 float alpha = 1.0f;
1608 Color finalColor = Color::RED;
1609 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1610 priorColor, bufferFill, alpha, finalColor));
1611}
Valerie Haua72e2812019-01-23 13:40:39 -08001612
Valerie Haudd0b7572019-01-29 14:59:27 -08001613TEST_P(LayerRenderTypeTransactionTest,
1614 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1615 bool priorColor = false;
1616 bool bufferFill = true;
1617 float alpha = 1.0f;
1618 Color finalColor = Color::RED;
1619 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1620 priorColor, bufferFill, alpha, finalColor));
1621}
Valerie Haua72e2812019-01-23 13:40:39 -08001622
Valerie Haudd0b7572019-01-29 14:59:27 -08001623TEST_P(LayerRenderTypeTransactionTest,
1624 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1625 bool priorColor = false;
1626 bool bufferFill = false;
1627 float alpha = 1.0f;
1628 Color finalColor = Color::GREEN;
1629 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1630 priorColor, bufferFill, alpha, finalColor));
1631}
Valerie Haua72e2812019-01-23 13:40:39 -08001632
Valerie Haudd0b7572019-01-29 14:59:27 -08001633TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1634 bool priorColor = true;
1635 bool bufferFill = true;
1636 float alpha = 1.0f;
1637 Color finalColor = Color::RED;
1638 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1639 priorColor, bufferFill, alpha, finalColor));
1640}
1641
1642TEST_P(LayerRenderTypeTransactionTest,
1643 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1644 bool priorColor = true;
1645 bool bufferFill = false;
1646 float alpha = 1.0f;
1647 Color finalColor = Color::GREEN;
1648 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1649 priorColor, bufferFill, alpha, finalColor));
1650}
1651TEST_P(LayerRenderTypeTransactionTest,
1652 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1653 bool priorColor = false;
1654 bool bufferFill = false;
1655 float alpha = 0;
1656 Color finalColor = Color::BLACK;
1657 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1658 priorColor, bufferFill, alpha, finalColor));
1659}
1660
1661TEST_P(LayerRenderTypeTransactionTest,
1662 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1663 bool priorColor = true;
1664 bool bufferFill = false;
1665 float alpha = 0;
1666 Color finalColor = Color::BLACK;
1667 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1668 priorColor, bufferFill, alpha, finalColor));
1669}
1670
1671TEST_P(LayerRenderTypeTransactionTest,
1672 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1673 bool priorColor = false;
1674 bool bufferFill = true;
1675 float alpha = 1.0f;
1676 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001677 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001678 priorColor, bufferFill, alpha, finalColor));
1679}
1680
1681TEST_P(LayerRenderTypeTransactionTest,
1682 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1683 bool priorColor = false;
1684 bool bufferFill = false;
1685 float alpha = 1.0f;
1686 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001687 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001688 priorColor, bufferFill, alpha, finalColor));
1689}
1690
1691TEST_P(LayerRenderTypeTransactionTest,
1692 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1693 bool priorColor = true;
1694 bool bufferFill = false;
1695 float alpha = 1.0f;
1696 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001697 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001698 priorColor, bufferFill, alpha, finalColor));
1699}
1700
1701TEST_P(LayerRenderTypeTransactionTest,
1702 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1703 bool priorColor = false;
1704 bool bufferFill = false;
1705 float alpha = 0;
1706 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001707 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001708 priorColor, bufferFill, alpha, finalColor));
1709}
1710
1711TEST_P(LayerRenderTypeTransactionTest,
1712 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1713 bool priorColor = true;
1714 bool bufferFill = false;
1715 float alpha = 0;
1716 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001717 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001718 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001719}
1720
Alec Mouri80863a62019-01-17 15:19:35 -08001721TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001722 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001723 ASSERT_NO_FATAL_FAILURE(colorLayer =
1724 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1725 ISurfaceComposerClient::eFXSurfaceColor));
1726 Transaction()
1727 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1728 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1729 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001730
Alec Mouri80863a62019-01-17 15:19:35 -08001731 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001732}
1733
Alec Mouri80863a62019-01-17 15:19:35 -08001734TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001735 sp<SurfaceControl> bufferLayer;
1736 sp<SurfaceControl> colorLayer;
1737 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001738 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001739 ASSERT_NO_FATAL_FAILURE(colorLayer =
1740 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1741 ISurfaceComposerClient::eFXSurfaceColor));
1742 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001743
1744 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1745 const float alpha = 0.25f;
1746 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1747 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1748 // channel) should be less than one
1749 const uint8_t tolerance = 1;
1750 Transaction()
1751 .setColor(colorLayer, color)
1752 .setAlpha(colorLayer, alpha)
1753 .setLayer(colorLayer, mLayerZBase + 1)
1754 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001755 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1756 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001757}
1758
Alec Mouri80863a62019-01-17 15:19:35 -08001759TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001760 sp<SurfaceControl> bufferLayer;
1761 sp<SurfaceControl> parentLayer;
1762 sp<SurfaceControl> colorLayer;
1763 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1764 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001765 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001766 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1767 0 /* buffer height */,
1768 ISurfaceComposerClient::eFXSurfaceColor));
1769 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001770 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1771 const float alpha = 0.25f;
1772 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1773 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1774 // channel) should be less than one
1775 const uint8_t tolerance = 1;
1776 Transaction()
1777 .reparent(colorLayer, parentLayer->getHandle())
1778 .setColor(colorLayer, color)
1779 .setAlpha(parentLayer, alpha)
1780 .setLayer(parentLayer, mLayerZBase + 1)
1781 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001782 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1783 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001784}
1785
Alec Mouri80863a62019-01-17 15:19:35 -08001786TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001787 sp<SurfaceControl> bufferLayer;
1788 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001789 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001790
1791 // color is ignored
1792 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001793 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001794}
1795
Alec Mouri80863a62019-01-17 15:19:35 -08001796TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001797 sp<SurfaceControl> layer;
1798 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001799 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001800
1801 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1802 {
1803 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001804 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001805 }
1806
1807 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1808 {
1809 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001810 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001811 }
1812}
1813
Alec Mouri80863a62019-01-17 15:19:35 -08001814TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001815 sp<SurfaceControl> layer;
1816 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001817 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1818 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001819
1820 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1821 {
1822 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001823 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1824 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001825 }
1826
1827 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1828 {
1829 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001830 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1831 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001832 }
1833
1834 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1835 {
1836 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001837 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1838 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001839 }
1840
1841 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1842 {
1843 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001844 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1845 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001846 }
1847
1848 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1849 {
1850 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001851 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1852 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001853 }
1854}
1855
Alec Mouri80863a62019-01-17 15:19:35 -08001856TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001857 sp<SurfaceControl> layer;
1858 ASSERT_NO_FATAL_FAILURE(
1859 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1860 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1861 Color::BLUE, Color::WHITE));
1862
1863 Transaction()
1864 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1865 .setFrame(layer, Rect(0, 0, 32, 32))
1866 .apply();
1867 {
1868 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001869 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1870 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001871 }
1872
1873 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1874 {
1875 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001876 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1877 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001878 }
1879
1880 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1881 {
1882 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001883 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1884 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001885 }
1886
1887 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1888 {
1889 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001890 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1891 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001892 }
1893
1894 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1895 {
1896 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001897 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1898 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001899 }
1900}
1901
Alec Mouri80863a62019-01-17 15:19:35 -08001902TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001903 sp<SurfaceControl> layer;
1904 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001905 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1906 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001907
1908 const float rot = M_SQRT1_2; // 45 degrees
1909 const float trans = M_SQRT2 * 16.0f;
1910 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1911
Alec Mouri80863a62019-01-17 15:19:35 -08001912 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001913 // check a 8x8 region inside each color
1914 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1915 const int32_t halfL = 4;
1916 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1917 };
1918 const int32_t unit = int32_t(trans / 2);
1919 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1920 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1921 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1922 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1923}
1924
Alec Mouri80863a62019-01-17 15:19:35 -08001925TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001926 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001927 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1928 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001929
1930 // setMatrix is applied after any pending resize, unlike setPosition
1931 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1932 {
1933 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001934 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001935 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001936 shot->expectColor(rect, Color::RED);
1937 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001938 }
1939
Marissa Wall861616d2018-10-22 12:52:23 -07001940 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001941 {
1942 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001943 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001944 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001945 }
1946}
1947
Alec Mouri80863a62019-01-17 15:19:35 -08001948TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001949 sp<SurfaceControl> layer;
1950 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001951 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001952
1953 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1954 Transaction()
1955 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1956 .setSize(layer, 64, 64)
1957 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1958 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001959 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001960}
1961
Alec Mouri80863a62019-01-17 15:19:35 -08001962TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001963 sp<SurfaceControl> layer;
1964 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001965 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1966 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001967
1968 // XXX SCALE_CROP is not respected; calling setSize and
1969 // setOverrideScalingMode in separate transactions does not work
1970 // (b/69315456)
1971 Transaction()
1972 .setSize(layer, 64, 16)
1973 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1974 .apply();
1975 {
1976 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08001977 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
1978 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07001979 }
1980}
1981
Dan Stoza000dd012018-08-01 13:31:52 -07001982TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
1983 sp<SurfaceControl> layer;
1984 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1985
1986 sp<IBinder> handle = layer->getHandle();
1987 ASSERT_TRUE(handle != nullptr);
1988
1989 FrameStats frameStats;
1990 mClient->getLayerFrameStats(handle, &frameStats);
1991
1992 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
1993}
1994
Alec Mouri80863a62019-01-17 15:19:35 -08001995TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07001996 sp<SurfaceControl> layer;
1997 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001998 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07001999 const Rect crop(8, 8, 24, 24);
2000
Marissa Wallf58c14b2018-07-24 10:50:43 -07002001 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002002 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002003 shot->expectColor(crop, Color::RED);
2004 shot->expectBorder(crop, Color::BLACK);
2005}
2006
Alec Mouri80863a62019-01-17 15:19:35 -08002007TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002008 sp<SurfaceControl> layer;
2009 ASSERT_NO_FATAL_FAILURE(
2010 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2011 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2012 const Rect crop(8, 8, 24, 24);
2013
2014 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002015 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002016 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2017 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002018}
2019
Alec Mouri80863a62019-01-17 15:19:35 -08002020TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002021 sp<SurfaceControl> layer;
2022 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002023 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002024
2025 {
2026 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002027 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002028 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002029 }
2030
2031 {
2032 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002033 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002034 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002035 }
2036}
2037
Alec Mouri80863a62019-01-17 15:19:35 -08002038TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002039 sp<SurfaceControl> layer;
2040 ASSERT_NO_FATAL_FAILURE(
2041 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2042 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2043
2044 {
2045 SCOPED_TRACE("empty rect");
2046 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002047 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002048 }
2049
2050 {
2051 SCOPED_TRACE("negative rect");
2052 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002053 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002054 }
2055}
2056
Alec Mouri80863a62019-01-17 15:19:35 -08002057TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002058 sp<SurfaceControl> layer;
2059 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002060 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002061
Marissa Wallf58c14b2018-07-24 10:50:43 -07002062 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002063 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002064 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2065 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2066}
2067
Alec Mouri80863a62019-01-17 15:19:35 -08002068TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002069 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002070 ASSERT_NO_FATAL_FAILURE(
2071 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002072 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002073 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002074 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2075 BufferUsage::COMPOSER_OVERLAY,
2076 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002077 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2078 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2079
2080 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002081
2082 Transaction().setBuffer(layer, buffer).apply();
2083
2084 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002085 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002086 {
2087 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002088 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002089 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2090 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002091 }
2092
2093 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002094 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002095 {
2096 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002097 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002098 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2099 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002100 }
2101
2102 // Fully out of buffer space bounds
2103 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2104 {
2105 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002106 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002107 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2108 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2109 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002110 }
2111}
2112
Alec Mouri80863a62019-01-17 15:19:35 -08002113TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002114 sp<SurfaceControl> layer;
2115 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002116 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002117
2118 const Point position(32, 32);
2119 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002120 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002121 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002122 shot->expectColor(crop + position, Color::RED);
2123 shot->expectBorder(crop + position, Color::BLACK);
2124}
2125
Alec Mouri80863a62019-01-17 15:19:35 -08002126TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002127 sp<SurfaceControl> layer;
2128 ASSERT_NO_FATAL_FAILURE(
2129 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2130 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2131
Marissa Wall861616d2018-10-22 12:52:23 -07002132 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002133 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002134 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002135 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002136 shot->expectColor(frame, Color::RED);
2137 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002138}
2139
Alec Mouri80863a62019-01-17 15:19:35 -08002140TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002141 sp<SurfaceControl> layer;
2142 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002143 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002144
Marissa Wall861616d2018-10-22 12:52:23 -07002145 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002146 Transaction()
2147 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002148 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002149 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002150 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002151 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2152 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2153}
2154
Alec Mouri80863a62019-01-17 15:19:35 -08002155TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002156 sp<SurfaceControl> layer;
2157 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002158 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159
Marissa Wallf58c14b2018-07-24 10:50:43 -07002160 // setCrop_legacy is applied immediately by default, with or without resize pending
2161 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002162 {
2163 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002164 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002165 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2166 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2167 }
2168
Marissa Wall61c58622018-07-18 10:12:20 -07002169 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002170 {
2171 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002172 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002173 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2174 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2175 }
2176}
2177
Alec Mouri80863a62019-01-17 15:19:35 -08002178TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002179 sp<SurfaceControl> layer;
2180 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002181 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002182
Marissa Wallf58c14b2018-07-24 10:50:43 -07002183 // request setCrop_legacy to be applied with the next resize
2184 Transaction()
2185 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2186 .setGeometryAppliesWithResize(layer)
2187 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002188 {
2189 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002190 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002191 }
2192
Marissa Wallf58c14b2018-07-24 10:50:43 -07002193 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002194 {
2195 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002196 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002197 }
2198
2199 Transaction().setSize(layer, 16, 16).apply();
2200 {
2201 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002202 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002203 }
2204
2205 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002206 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002207 {
2208 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002209 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002210 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2211 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2212 }
2213}
2214
Alec Mouri80863a62019-01-17 15:19:35 -08002215TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002216 sp<SurfaceControl> layer;
2217 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002218 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002219
Marissa Wallf58c14b2018-07-24 10:50:43 -07002220 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002221 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002222 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002223 .setSize(layer, 16, 16)
2224 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2225 .setGeometryAppliesWithResize(layer)
2226 .apply();
2227 {
2228 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002229 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002230 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2231 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2232 }
2233
2234 // XXX crop is never latched without other geometry change (b/69315677)
2235 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002236 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002237 Transaction().setPosition(layer, 0, 0).apply();
2238 {
2239 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002240 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002241 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2242 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2243 }
2244}
2245
Alec Mouri80863a62019-01-17 15:19:35 -08002246TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002247 sp<SurfaceControl> layer;
2248 ASSERT_NO_FATAL_FAILURE(
2249 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2250 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2251 const Rect frame(8, 8, 24, 24);
2252
2253 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002254 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002255 shot->expectColor(frame, Color::RED);
2256 shot->expectBorder(frame, Color::BLACK);
2257}
2258
Alec Mouri80863a62019-01-17 15:19:35 -08002259TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002260 sp<SurfaceControl> layer;
2261 ASSERT_NO_FATAL_FAILURE(
2262 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2263 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2264
Marissa Wall61c58622018-07-18 10:12:20 -07002265 {
Marissa Wall861616d2018-10-22 12:52:23 -07002266 SCOPED_TRACE("empty rect");
2267 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002268 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002269 }
2270
Marissa Wall61c58622018-07-18 10:12:20 -07002271 {
Marissa Wall861616d2018-10-22 12:52:23 -07002272 SCOPED_TRACE("negative rect");
2273 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002274 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002275 }
2276}
2277
Alec Mouri80863a62019-01-17 15:19:35 -08002278TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002279 sp<SurfaceControl> layer;
2280 ASSERT_NO_FATAL_FAILURE(
2281 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2282 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2283
2284 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002285 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002286 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2287 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002288}
2289
Alec Mouri80863a62019-01-17 15:19:35 -08002290TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002291 sp<SurfaceControl> parent, child;
2292 ASSERT_NO_FATAL_FAILURE(
2293 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2294 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2295 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2296
2297 ASSERT_NO_FATAL_FAILURE(
2298 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2299 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2300
2301 Transaction().reparent(child, parent->getHandle()).apply();
2302
2303 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002304 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002305 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2306 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2307}
2308
Alec Mouri80863a62019-01-17 15:19:35 -08002309TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002310 sp<SurfaceControl> parent, child;
2311 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2312 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2313
2314 ASSERT_NO_FATAL_FAILURE(
2315 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2316 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2317
2318 Transaction().reparent(child, parent->getHandle()).apply();
2319
2320 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002321 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002322 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2323 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2324}
2325
Alec Mouri80863a62019-01-17 15:19:35 -08002326TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002327 sp<SurfaceControl> layer;
2328 ASSERT_NO_FATAL_FAILURE(
2329 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2330 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2331 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2332
2333 std::this_thread::sleep_for(500ms);
2334
2335 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2336
Alec Mouri80863a62019-01-17 15:19:35 -08002337 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002338 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2339 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2340}
2341
Alec Mouri80863a62019-01-17 15:19:35 -08002342TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002343 sp<SurfaceControl> parent, child;
2344 ASSERT_NO_FATAL_FAILURE(
2345 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2346 ASSERT_NO_FATAL_FAILURE(
2347 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2348 Transaction().reparent(child, parent->getHandle()).apply();
2349
2350 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2351 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2352
2353 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2354 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2355
Alec Mouri80863a62019-01-17 15:19:35 -08002356 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002357 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2358 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2359 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2360}
2361
Alec Mouri80863a62019-01-17 15:19:35 -08002362TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002363 sp<SurfaceControl> layer;
2364 ASSERT_NO_FATAL_FAILURE(
2365 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2366
2367 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2368
Alec Mouri80863a62019-01-17 15:19:35 -08002369 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002370 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2371 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002372}
2373
Alec Mouri80863a62019-01-17 15:19:35 -08002374TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002375 sp<SurfaceControl> layer;
2376 ASSERT_NO_FATAL_FAILURE(
2377 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2378
2379 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2380
2381 {
2382 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002383 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002384 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2385 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002386 }
2387
2388 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2389
2390 {
2391 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002392 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002393 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2394 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002395 }
2396
2397 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2398
2399 {
2400 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002401 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002402 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2403 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002404 }
2405}
2406
Alec Mouri80863a62019-01-17 15:19:35 -08002407TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002408 sp<SurfaceControl> layer1;
2409 ASSERT_NO_FATAL_FAILURE(
2410 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2411
2412 sp<SurfaceControl> layer2;
2413 ASSERT_NO_FATAL_FAILURE(
2414 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2415
2416 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2417
Marissa Wall861616d2018-10-22 12:52:23 -07002418 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002419 {
2420 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002421 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002422 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2423 }
2424
2425 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2426
Marissa Wall861616d2018-10-22 12:52:23 -07002427 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002428 {
2429 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002430 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002431 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2432 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2433 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2434 }
2435
2436 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2437 {
2438 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002439 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002440 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2441 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2442 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2443 }
2444
2445 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2446
2447 {
2448 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002449 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002450 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2451 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2452 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2453 }
2454}
2455
Valerie Haua6b15a12019-02-05 14:16:30 -08002456TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002457 sp<SurfaceControl> layer;
2458 ASSERT_NO_FATAL_FAILURE(
2459 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2460
2461 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2462
2463 std::array<sp<GraphicBuffer>, 10> buffers;
2464
2465 size_t idx = 0;
2466 for (auto& buffer : buffers) {
2467 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2468 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2469 BufferUsage::COMPOSER_OVERLAY,
2470 "test");
2471 Color color = colors[idx % colors.size()];
2472 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2473 idx++;
2474 }
2475
2476 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2477 // cache is working.
2478 idx = 0;
2479 for (auto& buffer : buffers) {
2480 for (int i = 0; i < 2; i++) {
2481 Transaction().setBuffer(layer, buffer).apply();
2482
2483 Color color = colors[idx % colors.size()];
2484 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002485 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2486 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002487 }
2488 idx++;
2489 }
2490}
2491
Valerie Haua6b15a12019-02-05 14:16:30 -08002492TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002493 sp<SurfaceControl> layer;
2494 ASSERT_NO_FATAL_FAILURE(
2495 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2496
2497 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2498
2499 std::array<sp<GraphicBuffer>, 70> buffers;
2500
2501 size_t idx = 0;
2502 for (auto& buffer : buffers) {
2503 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2504 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2505 BufferUsage::COMPOSER_OVERLAY,
2506 "test");
2507 Color color = colors[idx % colors.size()];
2508 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2509 idx++;
2510 }
2511
2512 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2513 // cache is working.
2514 idx = 0;
2515 for (auto& buffer : buffers) {
2516 for (int i = 0; i < 2; i++) {
2517 Transaction().setBuffer(layer, buffer).apply();
2518
2519 Color color = colors[idx % colors.size()];
2520 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002521 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2522 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002523 }
2524 idx++;
2525 }
2526}
2527
Valerie Haua6b15a12019-02-05 14:16:30 -08002528TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002529 sp<SurfaceControl> layer;
2530 ASSERT_NO_FATAL_FAILURE(
2531 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2532
2533 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2534
2535 std::array<sp<GraphicBuffer>, 65> buffers;
2536
2537 size_t idx = 0;
2538 for (auto& buffer : buffers) {
2539 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2540 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2541 BufferUsage::COMPOSER_OVERLAY,
2542 "test");
2543 Color color = colors[idx % colors.size()];
2544 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2545 idx++;
2546 }
2547
2548 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2549 // cache is working.
2550 idx = 0;
2551 for (auto& buffer : buffers) {
2552 for (int i = 0; i < 2; i++) {
2553 Transaction().setBuffer(layer, buffer).apply();
2554
2555 Color color = colors[idx % colors.size()];
2556 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002557 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2558 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002559 }
2560 if (idx == 0) {
2561 buffers[0].clear();
2562 }
2563 idx++;
2564 }
2565}
2566
Alec Mouri80863a62019-01-17 15:19:35 -08002567TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002568 sp<SurfaceControl> layer;
2569 ASSERT_NO_FATAL_FAILURE(
2570 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2571
2572 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2573 Color::BLUE, Color::WHITE));
2574
Marissa Wall861616d2018-10-22 12:52:23 -07002575 Transaction()
2576 .setFrame(layer, Rect(0, 0, 32, 32))
2577 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2578 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002579
Alec Mouri80863a62019-01-17 15:19:35 -08002580 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2581 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002582}
2583
Alec Mouri80863a62019-01-17 15:19:35 -08002584TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002585 sp<SurfaceControl> layer;
2586 ASSERT_NO_FATAL_FAILURE(
2587 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2588
2589 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2590 Color::BLUE, Color::WHITE));
2591
Marissa Wall861616d2018-10-22 12:52:23 -07002592 Transaction()
2593 .setFrame(layer, Rect(0, 0, 32, 32))
2594 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2595 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002596
Alec Mouri80863a62019-01-17 15:19:35 -08002597 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2598 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002599}
2600
Alec Mouri80863a62019-01-17 15:19:35 -08002601TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002602 sp<SurfaceControl> layer;
2603 ASSERT_NO_FATAL_FAILURE(
2604 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2605
2606 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2607 Color::BLUE, Color::WHITE));
2608
Marissa Wall861616d2018-10-22 12:52:23 -07002609 Transaction()
2610 .setFrame(layer, Rect(0, 0, 32, 32))
2611 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2612 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002613
Alec Mouri80863a62019-01-17 15:19:35 -08002614 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2615 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002616}
2617
2618TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2619 sp<SurfaceControl> layer;
2620 ASSERT_NO_FATAL_FAILURE(
2621 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2622
2623 Transaction().setTransformToDisplayInverse(layer, false).apply();
2624
2625 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2626
2627 Transaction().setTransformToDisplayInverse(layer, true).apply();
2628}
2629
Alec Mouri80863a62019-01-17 15:19:35 -08002630TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002631 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002632 Transaction transaction;
2633 ASSERT_NO_FATAL_FAILURE(
2634 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2635
2636 sp<GraphicBuffer> buffer =
2637 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2638 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2639 BufferUsage::COMPOSER_OVERLAY,
2640 "test");
2641 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2642
2643 sp<Fence> fence;
2644 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2645 GTEST_SUCCEED() << "test not supported";
2646 return;
2647 }
2648
2649 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2650
2651 status_t status = fence->wait(1000);
2652 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2653 std::this_thread::sleep_for(200ms);
2654
Alec Mouri80863a62019-01-17 15:19:35 -08002655 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002656 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2657 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002658}
2659
Alec Mouri80863a62019-01-17 15:19:35 -08002660TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002661 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002662 ASSERT_NO_FATAL_FAILURE(
2663 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2664
2665 sp<GraphicBuffer> buffer =
2666 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2667 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2668 BufferUsage::COMPOSER_OVERLAY,
2669 "test");
2670 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2671
Marissa Wallfda30bb2018-10-12 11:34:28 -07002672 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002673
2674 Transaction()
2675 .setBuffer(layer, buffer)
2676 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002677 .apply();
2678
Alec Mouri80863a62019-01-17 15:19:35 -08002679 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002680 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2681 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002682}
2683
Alec Mouri80863a62019-01-17 15:19:35 -08002684TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002685 sp<SurfaceControl> layer;
2686 ASSERT_NO_FATAL_FAILURE(
2687 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2688
2689 sp<GraphicBuffer> buffer =
2690 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2691 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2692 BufferUsage::COMPOSER_OVERLAY,
2693 "test");
2694 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2695
2696 Transaction()
2697 .setBuffer(layer, buffer)
2698 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002699 .apply();
2700
Alec Mouri80863a62019-01-17 15:19:35 -08002701 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002702 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2703 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002704}
2705
Alec Mouri80863a62019-01-17 15:19:35 -08002706TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002707 sp<SurfaceControl> layer;
2708 ASSERT_NO_FATAL_FAILURE(
2709 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2710
2711 sp<GraphicBuffer> buffer =
2712 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2713 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2714 BufferUsage::COMPOSER_OVERLAY,
2715 "test");
2716 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2717
2718 HdrMetadata hdrMetadata;
2719 hdrMetadata.validTypes = 0;
2720 Transaction()
2721 .setBuffer(layer, buffer)
2722 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002723 .apply();
2724
Alec Mouri80863a62019-01-17 15:19:35 -08002725 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002726 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2727 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002728}
2729
Alec Mouri80863a62019-01-17 15:19:35 -08002730TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002731 sp<SurfaceControl> layer;
2732 ASSERT_NO_FATAL_FAILURE(
2733 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2734
2735 sp<GraphicBuffer> buffer =
2736 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2737 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2738 BufferUsage::COMPOSER_OVERLAY,
2739 "test");
2740 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2741
2742 Region region;
2743 region.set(32, 32);
2744 Transaction()
2745 .setBuffer(layer, buffer)
2746 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002747 .apply();
2748
Alec Mouri80863a62019-01-17 15:19:35 -08002749 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002750 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2751 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002752}
2753
Alec Mouri80863a62019-01-17 15:19:35 -08002754TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002755 sp<SurfaceControl> layer;
2756 ASSERT_NO_FATAL_FAILURE(
2757 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2758
2759 sp<GraphicBuffer> buffer =
2760 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2761 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2762 BufferUsage::COMPOSER_OVERLAY,
2763 "test");
2764 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2765
2766 Transaction()
2767 .setBuffer(layer, buffer)
2768 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002769 .apply();
2770
Alec Mouri80863a62019-01-17 15:19:35 -08002771 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002772 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2773 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002774}
2775
2776TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2777 sp<SurfaceControl> layer;
2778 ASSERT_NO_FATAL_FAILURE(
2779 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2780
2781 // verify this doesn't cause a crash
2782 Transaction().setSidebandStream(layer, nullptr).apply();
2783}
2784
Robert Carr54cf5b12019-01-25 14:02:28 -08002785TEST_F(LayerTransactionTest, ReparentToSelf) {
2786 sp<SurfaceControl> layer;
2787 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2788 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2789 Transaction().reparent(layer, layer->getHandle()).apply();
2790
2791 {
2792 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2793 // to still be functioning.
2794 SCOPED_TRACE("after reparent to self");
2795 const Rect rect(0, 0, 32, 32);
2796 auto shot = screenshot();
2797 shot->expectColor(rect, Color::RED);
2798 shot->expectBorder(rect, Color::BLACK);
2799 }
2800}
2801
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002802class ColorTransformHelper {
2803public:
2804 static void DegammaColorSingle(half& s) {
2805 if (s <= 0.03928f)
2806 s = s / 12.92f;
2807 else
2808 s = pow((s + 0.055f) / 1.055f, 2.4f);
2809 }
2810
2811 static void DegammaColor(half3& color) {
2812 DegammaColorSingle(color.r);
2813 DegammaColorSingle(color.g);
2814 DegammaColorSingle(color.b);
2815 }
2816
2817 static void GammaColorSingle(half& s) {
2818 if (s <= 0.0031308f) {
2819 s = s * 12.92f;
2820 } else {
2821 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2822 }
2823 }
2824
2825 static void GammaColor(half3& color) {
2826 GammaColorSingle(color.r);
2827 GammaColorSingle(color.g);
2828 GammaColorSingle(color.b);
2829 }
2830
2831 static void applyMatrix(half3& color, const mat3& mat) {
2832 half3 ret = half3(0);
2833
2834 for (int i = 0; i < 3; i++) {
2835 for (int j = 0; j < 3; j++) {
2836 ret[i] = ret[i] + color[j] * mat[j][i];
2837 }
2838 }
2839 color = ret;
2840 }
2841};
2842
Alec Mouri80863a62019-01-17 15:19:35 -08002843TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002844 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002845 ASSERT_NO_FATAL_FAILURE(colorLayer =
2846 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2847 ISurfaceComposerClient::eFXSurfaceColor));
2848 Transaction()
2849 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2850 .setLayer(colorLayer, mLayerZBase + 1)
2851 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002852 {
2853 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002854 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002855 }
2856
2857 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002858 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002859 mat3 matrix;
2860 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2861 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2862 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002863
2864 // degamma before applying the matrix
2865 if (mColorManagementUsed) {
2866 ColorTransformHelper::DegammaColor(expected);
2867 }
2868
2869 ColorTransformHelper::applyMatrix(expected, matrix);
2870
2871 if (mColorManagementUsed) {
2872 ColorTransformHelper::GammaColor(expected);
2873 }
2874
2875 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2876 uint8_t(expected.b * 255), 255};
2877
2878 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2879 // channel) should be less than one
2880 const uint8_t tolerance = 1;
2881
Peiyong Lind3788632018-09-18 16:01:31 -07002882 Transaction().setColor(colorLayer, color)
2883 .setColorTransform(colorLayer, matrix, vec3()).apply();
2884 {
2885 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002886 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002887 }
2888}
2889
Alec Mouri80863a62019-01-17 15:19:35 -08002890TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002891 sp<SurfaceControl> parentLayer;
2892 sp<SurfaceControl> colorLayer;
2893 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2894 0 /* buffer height */,
2895 ISurfaceComposerClient::eFXSurfaceContainer));
2896 ASSERT_NO_FATAL_FAILURE(
2897 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2898 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2899
2900 Transaction()
2901 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2902 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2903 .setLayer(parentLayer, mLayerZBase + 1)
2904 .apply();
2905 {
2906 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002907 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002908 }
2909
2910 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2911 half3 expected = color;
2912 mat3 matrix;
2913 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2914 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2915 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2916
2917 // degamma before applying the matrix
2918 if (mColorManagementUsed) {
2919 ColorTransformHelper::DegammaColor(expected);
2920 }
2921
2922 ColorTransformHelper::applyMatrix(expected, matrix);
2923
2924 if (mColorManagementUsed) {
2925 ColorTransformHelper::GammaColor(expected);
2926 }
2927
2928 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2929 uint8_t(expected.b * 255), 255};
2930
2931 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2932 // channel) should be less than one
2933 const uint8_t tolerance = 1;
2934
2935 Transaction()
2936 .setColor(colorLayer, color)
2937 .setColorTransform(parentLayer, matrix, vec3())
2938 .apply();
2939 {
2940 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002941 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002942 }
2943}
2944
Alec Mouri80863a62019-01-17 15:19:35 -08002945TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002946 sp<SurfaceControl> parentLayer;
2947 sp<SurfaceControl> colorLayer;
2948 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2949 0 /* buffer height */,
2950 ISurfaceComposerClient::eFXSurfaceContainer));
2951 ASSERT_NO_FATAL_FAILURE(
2952 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2953 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2954
2955 Transaction()
2956 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2957 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2958 .setLayer(parentLayer, mLayerZBase + 1)
2959 .apply();
2960 {
2961 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002962 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002963 }
2964
2965 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2966 half3 expected = color;
2967 mat3 matrixChild;
2968 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2969 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2970 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2971 mat3 matrixParent;
2972 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2973 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2974 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2975
2976 // degamma before applying the matrix
2977 if (mColorManagementUsed) {
2978 ColorTransformHelper::DegammaColor(expected);
2979 }
2980
2981 ColorTransformHelper::applyMatrix(expected, matrixChild);
2982 ColorTransformHelper::applyMatrix(expected, matrixParent);
2983
2984 if (mColorManagementUsed) {
2985 ColorTransformHelper::GammaColor(expected);
2986 }
2987
2988 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2989 uint8_t(expected.b * 255), 255};
2990
2991 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2992 // channel) should be less than one
2993 const uint8_t tolerance = 1;
2994
2995 Transaction()
2996 .setColor(colorLayer, color)
2997 .setColorTransform(parentLayer, matrixParent, vec3())
2998 .setColorTransform(colorLayer, matrixChild, vec3())
2999 .apply();
3000 {
3001 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003002 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003003 }
3004}
3005
Marissa Wall80d94ad2019-01-18 16:04:36 -08003006struct CallbackData {
3007 CallbackData() = default;
3008 CallbackData(nsecs_t time, const sp<Fence>& fence,
3009 const std::vector<SurfaceControlStats>& stats)
3010 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3011
3012 nsecs_t latchTime;
3013 sp<Fence> presentFence;
3014 std::vector<SurfaceControlStats> surfaceControlStats;
3015};
3016
Marissa Wallfda30bb2018-10-12 11:34:28 -07003017class ExpectedResult {
3018public:
3019 enum Transaction {
3020 NOT_PRESENTED = 0,
3021 PRESENTED,
3022 };
3023
3024 enum Buffer {
3025 NOT_ACQUIRED = 0,
3026 ACQUIRED,
3027 };
3028
3029 enum PreviousBuffer {
3030 NOT_RELEASED = 0,
3031 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003032 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003033 };
3034
3035 void reset() {
3036 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3037 mExpectedSurfaceResults.clear();
3038 }
3039
3040 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003041 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003042 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3043 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003044 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003045 std::forward_as_tuple(bufferResult, previousBufferResult));
3046 }
3047
3048 void addSurfaces(ExpectedResult::Transaction transactionResult,
3049 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003050 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003051 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3052 for (const auto& layer : layers) {
3053 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3054 }
3055 }
3056
Marissa Wall17b4e452018-12-26 16:32:34 -08003057 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3058 mExpectedPresentTime = expectedPresentTime;
3059 }
3060
Marissa Wall80d94ad2019-01-18 16:04:36 -08003061 void verifyCallbackData(const CallbackData& callbackData) const {
3062 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003063 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3064 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003065 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003066 if (mExpectedPresentTime >= 0) {
3067 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3068 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3069 // if the panel is running at 30 hz, at the worst case, our expected time just
3070 // misses vsync and we have to wait another 33.3ms
3071 ASSERT_LE(presentFence->getSignalTime(),
3072 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3073 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003074 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003075 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003076 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3077 }
3078
Marissa Wall80d94ad2019-01-18 16:04:36 -08003079 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003080 << "wrong number of surfaces";
3081
Marissa Wall80d94ad2019-01-18 16:04:36 -08003082 for (const auto& stats : surfaceControlStats) {
3083 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3084
Marissa Wallfda30bb2018-10-12 11:34:28 -07003085 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3086 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3087 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003088 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003089 }
3090 }
3091
3092private:
3093 class ExpectedSurfaceResult {
3094 public:
3095 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3096 ExpectedResult::PreviousBuffer previousBufferResult)
3097 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3098
Marissa Wall80d94ad2019-01-18 16:04:36 -08003099 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3100 nsecs_t latchTime) const {
3101 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003102
3103 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3104 << "bad acquire time";
3105 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003106
3107 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3108 ASSERT_NE(previousReleaseFence, nullptr)
3109 << "failed to set release prev buffer fence";
3110 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3111 ASSERT_EQ(previousReleaseFence, nullptr)
3112 << "should not have set released prev buffer fence";
3113 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003114 }
3115
3116 private:
3117 ExpectedResult::Buffer mBufferResult;
3118 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3119 };
3120
Marissa Wall80d94ad2019-01-18 16:04:36 -08003121 struct SCHash {
3122 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3123 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003124 }
3125 };
3126 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003127 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003128 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003129};
3130
3131class CallbackHelper {
3132public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003133 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3134 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003135 if (!callbackContext) {
3136 ALOGE("failed to get callback context");
3137 }
3138 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3139 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003140 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003141 helper->mConditionVariable.notify_all();
3142 }
3143
Marissa Wall80d94ad2019-01-18 16:04:36 -08003144 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003145 std::unique_lock lock(mMutex);
3146
Marissa Wall80d94ad2019-01-18 16:04:36 -08003147 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003148 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3149 std::cv_status::timeout)
3150 << "did not receive callback";
3151 }
3152
Marissa Wall80d94ad2019-01-18 16:04:36 -08003153 *outData = std::move(mCallbackDataQueue.front());
3154 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003155 }
3156
3157 void verifyFinalState() {
3158 // Wait to see if there are extra callbacks
3159 std::this_thread::sleep_for(500ms);
3160
3161 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003162 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3163 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003164 }
3165
3166 void* getContext() { return static_cast<void*>(this); }
3167
3168 std::mutex mMutex;
3169 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003170 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003171};
3172
3173class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003174public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003175 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003176 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003177 }
3178
Marissa Wall713b63f2018-10-17 15:42:43 -07003179 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003180 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3181 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003182 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003183 sp<GraphicBuffer> buffer;
3184 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003185 if (setBuffer) {
3186 int err = getBuffer(&buffer, &fence);
3187 if (err != NO_ERROR) {
3188 return err;
3189 }
3190
3191 transaction.setBuffer(layer, buffer);
3192 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003193 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003194
Valerie Hauaa194562019-02-05 16:21:38 -08003195 if (setBackgroundColor) {
3196 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3197 ui::Dataspace::UNKNOWN);
3198 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003199 }
3200
3201 transaction.addTransactionCompletedCallback(callbackHelper->function,
3202 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003204 }
3205
Marissa Wall861616d2018-10-22 12:52:23 -07003206 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3207 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003208 CallbackData callbackData;
3209 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3210 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003211
3212 if (finalState) {
3213 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3214 }
3215 }
3216
Marissa Wall861616d2018-10-22 12:52:23 -07003217 static void waitForCallbacks(CallbackHelper& helper,
3218 const std::vector<ExpectedResult>& expectedResults,
3219 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003220 for (const auto& expectedResult : expectedResults) {
3221 waitForCallback(helper, expectedResult);
3222 }
3223 if (finalState) {
3224 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3225 }
3226 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003227};
3228
Valerie Hauaa194562019-02-05 16:21:38 -08003229TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003230 sp<SurfaceControl> layer;
3231 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3232
3233 Transaction transaction;
3234 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003235 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003236 if (err) {
3237 GTEST_SUCCEED() << "test not supported";
3238 return;
3239 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003240
3241 transaction.apply();
3242
3243 ExpectedResult expected;
3244 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3245 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3246}
3247
Valerie Hauaa194562019-02-05 16:21:38 -08003248TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003249 sp<SurfaceControl> layer;
3250 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3251
3252 Transaction transaction;
3253 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003254 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003255 if (err) {
3256 GTEST_SUCCEED() << "test not supported";
3257 return;
3258 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259
Marissa Wall861616d2018-10-22 12:52:23 -07003260 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003261
3262 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003263 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3264 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003265 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3266}
3267
Valerie Hauaa194562019-02-05 16:21:38 -08003268TEST_F(LayerCallbackTest, BufferNoColor) {
3269 sp<SurfaceControl> layer;
3270 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3271
3272 Transaction transaction;
3273 CallbackHelper callback;
3274 int err = fillTransaction(transaction, &callback, layer, true, false);
3275 if (err) {
3276 GTEST_SUCCEED() << "test not supported";
3277 return;
3278 }
3279
3280 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3281
3282 ExpectedResult expected;
3283 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3284 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3285}
3286
3287TEST_F(LayerCallbackTest, NoBufferColor) {
3288 sp<SurfaceControl> layer;
3289 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3290
3291 Transaction transaction;
3292 CallbackHelper callback;
3293 int err = fillTransaction(transaction, &callback, layer, false, true);
3294 if (err) {
3295 GTEST_SUCCEED() << "test not supported";
3296 return;
3297 }
3298
3299 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3300
3301 ExpectedResult expected;
3302 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3303 ExpectedResult::Buffer::NOT_ACQUIRED);
3304 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3305}
3306
Marissa Wallfda30bb2018-10-12 11:34:28 -07003307TEST_F(LayerCallbackTest, NoStateChange) {
3308 Transaction transaction;
3309 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003310 int err = fillTransaction(transaction, &callback);
3311 if (err) {
3312 GTEST_SUCCEED() << "test not supported";
3313 return;
3314 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003315
3316 transaction.apply();
3317
3318 ExpectedResult expected;
3319 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3320}
3321
3322TEST_F(LayerCallbackTest, OffScreen) {
3323 sp<SurfaceControl> layer;
3324 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3325
3326 Transaction transaction;
3327 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003328 int err = fillTransaction(transaction, &callback, layer);
3329 if (err) {
3330 GTEST_SUCCEED() << "test not supported";
3331 return;
3332 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003333
Marissa Wall861616d2018-10-22 12:52:23 -07003334 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003335
3336 ExpectedResult expected;
3337 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3338 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3339}
3340
Valerie Hauaa194562019-02-05 16:21:38 -08003341TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003342 sp<SurfaceControl> layer1, layer2;
3343 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3344 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3345
3346 Transaction transaction1, transaction2;
3347 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003348 int err = fillTransaction(transaction1, &callback1, layer1);
3349 if (err) {
3350 GTEST_SUCCEED() << "test not supported";
3351 return;
3352 }
3353 err = fillTransaction(transaction2, &callback2, layer2);
3354 if (err) {
3355 GTEST_SUCCEED() << "test not supported";
3356 return;
3357 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003358
Marissa Wall861616d2018-10-22 12:52:23 -07003359 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3360 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003361
3362 ExpectedResult expected;
3363 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3364 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3365 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3366}
3367
Valerie Hauaa194562019-02-05 16:21:38 -08003368TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3369 sp<SurfaceControl> layer1, layer2;
3370 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3371 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3372
3373 Transaction transaction1, transaction2;
3374 CallbackHelper callback1, callback2;
3375 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3376 if (err) {
3377 GTEST_SUCCEED() << "test not supported";
3378 return;
3379 }
3380 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3381 if (err) {
3382 GTEST_SUCCEED() << "test not supported";
3383 return;
3384 }
3385
3386 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3387 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3388
3389 ExpectedResult expected;
3390 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3391 ExpectedResult::Buffer::NOT_ACQUIRED);
3392 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3393 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3394}
3395
3396TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3397 sp<SurfaceControl> layer1, layer2;
3398 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3399 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3400
3401 Transaction transaction1, transaction2;
3402 CallbackHelper callback1, callback2;
3403 int err = fillTransaction(transaction1, &callback1, layer1);
3404 if (err) {
3405 GTEST_SUCCEED() << "test not supported";
3406 return;
3407 }
3408 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3409 if (err) {
3410 GTEST_SUCCEED() << "test not supported";
3411 return;
3412 }
3413
3414 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3415 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3416
3417 ExpectedResult expected;
3418 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3419 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3420 ExpectedResult::Buffer::NOT_ACQUIRED);
3421 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3422 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3423}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003424TEST_F(LayerCallbackTest, Merge_SameCallback) {
3425 sp<SurfaceControl> layer1, layer2;
3426 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3427 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3428
3429 Transaction transaction1, transaction2;
3430 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003431 int err = fillTransaction(transaction1, &callback, layer1);
3432 if (err) {
3433 GTEST_SUCCEED() << "test not supported";
3434 return;
3435 }
3436 err = fillTransaction(transaction2, &callback, layer2);
3437 if (err) {
3438 GTEST_SUCCEED() << "test not supported";
3439 return;
3440 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003441
3442 transaction2.merge(std::move(transaction1)).apply();
3443
3444 ExpectedResult expected;
3445 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3446 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3447 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3448}
3449
3450TEST_F(LayerCallbackTest, Merge_SameLayer) {
3451 sp<SurfaceControl> layer;
3452 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3453
3454 Transaction transaction1, transaction2;
3455 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003456 int err = fillTransaction(transaction1, &callback1, layer);
3457 if (err) {
3458 GTEST_SUCCEED() << "test not supported";
3459 return;
3460 }
3461 err = fillTransaction(transaction2, &callback2, layer);
3462 if (err) {
3463 GTEST_SUCCEED() << "test not supported";
3464 return;
3465 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003466
3467 transaction2.merge(std::move(transaction1)).apply();
3468
3469 ExpectedResult expected;
3470 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3471 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3472 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3473}
3474
Marissa Wallfda30bb2018-10-12 11:34:28 -07003475TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3476 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3477 client2(new SurfaceComposerClient);
3478
3479 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3480 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3481
3482 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003483 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003484 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003485 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003486 ISurfaceComposerClient::eFXSurfaceBufferState));
3487
3488 Transaction transaction1, transaction2;
3489 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003490 int err = fillTransaction(transaction1, &callback1, layer1);
3491 if (err) {
3492 GTEST_SUCCEED() << "test not supported";
3493 return;
3494 }
3495 err = fillTransaction(transaction2, &callback2, layer2);
3496 if (err) {
3497 GTEST_SUCCEED() << "test not supported";
3498 return;
3499 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003500
Marissa Wall861616d2018-10-22 12:52:23 -07003501 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3502 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003503
3504 ExpectedResult expected;
3505 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3506 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3507 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3508}
3509
3510TEST_F(LayerCallbackTest, MultipleTransactions) {
3511 sp<SurfaceControl> layer;
3512 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3513
3514 Transaction transaction;
3515 CallbackHelper callback;
3516 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003517 int err = fillTransaction(transaction, &callback, layer);
3518 if (err) {
3519 GTEST_SUCCEED() << "test not supported";
3520 return;
3521 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003522
3523 transaction.apply();
3524
3525 ExpectedResult expected;
3526 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003527 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003528 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3529 : ExpectedResult::PreviousBuffer::RELEASED);
3530 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3531 }
3532 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3533}
3534
3535TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3536 sp<SurfaceControl> layer;
3537 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3538
3539 Transaction transaction;
3540 CallbackHelper callback;
3541 for (size_t i = 0; i < 10; i++) {
3542 ExpectedResult expected;
3543
3544 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003545 int err = fillTransaction(transaction, &callback, layer);
3546 if (err) {
3547 GTEST_SUCCEED() << "test not supported";
3548 return;
3549 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003550 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3551 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003552 int err = fillTransaction(transaction, &callback);
3553 if (err) {
3554 GTEST_SUCCEED() << "test not supported";
3555 return;
3556 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003557 }
3558
3559 transaction.apply();
3560
3561 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3562 }
3563 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3564}
3565
3566TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3567 sp<SurfaceControl> layer;
3568 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3569
3570 Transaction transaction;
3571 CallbackHelper callback;
3572 for (size_t i = 0; i < 10; i++) {
3573 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003574 int err = fillTransaction(transaction, &callback, layer);
3575 if (err) {
3576 GTEST_SUCCEED() << "test not supported";
3577 return;
3578 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003579 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003580 int err = fillTransaction(transaction, &callback);
3581 if (err) {
3582 GTEST_SUCCEED() << "test not supported";
3583 return;
3584 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003585 }
3586
Marissa Wall861616d2018-10-22 12:52:23 -07003587 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003588
3589 ExpectedResult expected;
3590 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3591 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003592 layer,
3593 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3594 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003595 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3596 }
3597 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3598}
3599
3600TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3601 sp<SurfaceControl> layer1, layer2;
3602 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3603 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3604
3605 Transaction transaction1, transaction2;
3606 CallbackHelper callback1, callback2;
3607 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003608 int err = fillTransaction(transaction1, &callback1, layer1);
3609 if (err) {
3610 GTEST_SUCCEED() << "test not supported";
3611 return;
3612 }
3613 err = fillTransaction(transaction2, &callback2, layer2);
3614 if (err) {
3615 GTEST_SUCCEED() << "test not supported";
3616 return;
3617 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003618
Marissa Wall861616d2018-10-22 12:52:23 -07003619 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3620 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003621
3622 ExpectedResult expected;
3623 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003624 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003625 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3626 : ExpectedResult::PreviousBuffer::RELEASED);
3627 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3628 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3629 }
3630 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3631 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3632}
3633
3634TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3635 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3636 client2(new SurfaceComposerClient);
3637 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3638 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3639
3640 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003641 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003642 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003643 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003644 ISurfaceComposerClient::eFXSurfaceBufferState));
3645
3646 Transaction transaction1, transaction2;
3647 CallbackHelper callback1, callback2;
3648 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003649 int err = fillTransaction(transaction1, &callback1, layer1);
3650 if (err) {
3651 GTEST_SUCCEED() << "test not supported";
3652 return;
3653 }
3654 err = fillTransaction(transaction2, &callback2, layer2);
3655 if (err) {
3656 GTEST_SUCCEED() << "test not supported";
3657 return;
3658 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003659
Marissa Wall861616d2018-10-22 12:52:23 -07003660 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3661 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003662
3663 ExpectedResult expected;
3664 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003665 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003666 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3667 : ExpectedResult::PreviousBuffer::RELEASED);
3668 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3669 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3670 }
3671 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3672 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3673}
3674
3675TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3676 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3677 client2(new SurfaceComposerClient);
3678 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3679 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3680
3681 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003682 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003683 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003684 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003685 ISurfaceComposerClient::eFXSurfaceBufferState));
3686
3687 Transaction transaction1, transaction2;
3688 CallbackHelper callback1, callback2;
3689
3690 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003691 int err = fillTransaction(transaction1, &callback1, layer1);
3692 if (err) {
3693 GTEST_SUCCEED() << "test not supported";
3694 return;
3695 }
3696 err = fillTransaction(transaction2, &callback2, layer2);
3697 if (err) {
3698 GTEST_SUCCEED() << "test not supported";
3699 return;
3700 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003701
Marissa Wall861616d2018-10-22 12:52:23 -07003702 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3703 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003704
3705 ExpectedResult expected;
3706 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3707 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3708 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3709 expected.reset();
3710
3711 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003712 err = fillTransaction(transaction1, &callback1);
3713 if (err) {
3714 GTEST_SUCCEED() << "test not supported";
3715 return;
3716 }
3717 err = fillTransaction(transaction2, &callback2);
3718 if (err) {
3719 GTEST_SUCCEED() << "test not supported";
3720 return;
3721 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003722
3723 transaction2.merge(std::move(transaction1)).apply();
3724
3725 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3726 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3727}
3728
3729TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3730 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3731 client2(new SurfaceComposerClient);
3732
3733 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3734 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3735
3736 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003737 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003738 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003739 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003740 ISurfaceComposerClient::eFXSurfaceBufferState));
3741
3742 Transaction transaction1, transaction2;
3743 CallbackHelper callback1, callback2;
3744
3745 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003746 int err = fillTransaction(transaction1, &callback1, layer1);
3747 if (err) {
3748 GTEST_SUCCEED() << "test not supported";
3749 return;
3750 }
3751 err = fillTransaction(transaction2, &callback2, layer2);
3752 if (err) {
3753 GTEST_SUCCEED() << "test not supported";
3754 return;
3755 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003756
Marissa Wall861616d2018-10-22 12:52:23 -07003757 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3758 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003759
3760 ExpectedResult expected;
3761 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3762 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3763 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3764 expected.reset();
3765
3766 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003767 err = fillTransaction(transaction1, &callback1);
3768 if (err) {
3769 GTEST_SUCCEED() << "test not supported";
3770 return;
3771 }
3772 err = fillTransaction(transaction2, &callback2);
3773 if (err) {
3774 GTEST_SUCCEED() << "test not supported";
3775 return;
3776 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003777
Marissa Wall861616d2018-10-22 12:52:23 -07003778 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003779
Marissa Wall713b63f2018-10-17 15:42:43 -07003780 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3781 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003782 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3783 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3784}
3785
3786TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3787 sp<SurfaceControl> layer;
3788 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3789
3790 Transaction transaction;
3791 CallbackHelper callback;
3792 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003793 for (auto& expected : expectedResults) {
3794 expected.reset();
3795 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003796 ExpectedResult::Buffer::ACQUIRED,
3797 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003798
Marissa Wall713b63f2018-10-17 15:42:43 -07003799 int err = fillTransaction(transaction, &callback, layer);
3800 if (err) {
3801 GTEST_SUCCEED() << "test not supported";
3802 return;
3803 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003804
3805 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003806 }
3807 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3808}
3809
3810TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3811 sp<SurfaceControl> layer;
3812 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3813
Marissa Wall713b63f2018-10-17 15:42:43 -07003814 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003815 Transaction transaction;
3816 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003817 int err = fillTransaction(transaction, &callback, layer);
3818 if (err) {
3819 GTEST_SUCCEED() << "test not supported";
3820 return;
3821 }
3822
3823 transaction.apply();
3824
3825 ExpectedResult expected;
3826 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3827 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3828
3829 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003830 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003831 for (auto& expected : expectedResults) {
3832 expected.reset();
3833
Marissa Wall713b63f2018-10-17 15:42:43 -07003834 err = fillTransaction(transaction, &callback);
3835 if (err) {
3836 GTEST_SUCCEED() << "test not supported";
3837 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003838 }
3839
3840 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003841 }
3842 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3843}
3844
3845TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3846 sp<SurfaceControl> layer;
3847 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3848
3849 // Normal call to set up test
3850 Transaction transaction;
3851 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003852 int err = fillTransaction(transaction, &callback, layer);
3853 if (err) {
3854 GTEST_SUCCEED() << "test not supported";
3855 return;
3856 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003857
Marissa Wall861616d2018-10-22 12:52:23 -07003858 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003859
3860 ExpectedResult expectedResult;
3861 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3862 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3863
3864 // Test
3865 std::vector<ExpectedResult> expectedResults(50);
3866 for (auto& expected : expectedResults) {
3867 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003868 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3869 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003870
Marissa Wall713b63f2018-10-17 15:42:43 -07003871 err = fillTransaction(transaction, &callback);
3872 if (err) {
3873 GTEST_SUCCEED() << "test not supported";
3874 return;
3875 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003876
Marissa Wall861616d2018-10-22 12:52:23 -07003877 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003878 }
3879 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3880}
3881
Marissa Wall17b4e452018-12-26 16:32:34 -08003882TEST_F(LayerCallbackTest, DesiredPresentTime) {
3883 sp<SurfaceControl> layer;
3884 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3885
3886 Transaction transaction;
3887 CallbackHelper callback;
3888 int err = fillTransaction(transaction, &callback, layer);
3889 if (err) {
3890 GTEST_SUCCEED() << "test not supported";
3891 return;
3892 }
3893
3894 // Try to present 100ms in the future
3895 nsecs_t time = systemTime() + (100 * 1e6);
3896
3897 transaction.setDesiredPresentTime(time);
3898 transaction.apply();
3899
3900 ExpectedResult expected;
3901 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3902 expected.addExpectedPresentTime(time);
3903 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3904}
3905
3906TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3907 sp<SurfaceControl> layer;
3908 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3909
3910 Transaction transaction;
3911 CallbackHelper callback1;
3912 int err = fillTransaction(transaction, &callback1, layer);
3913 if (err) {
3914 GTEST_SUCCEED() << "test not supported";
3915 return;
3916 }
3917
3918 // Try to present 100ms in the future
3919 nsecs_t time = systemTime() + (100 * 1e6);
3920
3921 transaction.setDesiredPresentTime(time);
3922 transaction.apply();
3923
3924 ExpectedResult expected1;
3925 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3926 expected1.addExpectedPresentTime(time);
3927
3928 CallbackHelper callback2;
3929 err = fillTransaction(transaction, &callback2, layer);
3930 if (err) {
3931 GTEST_SUCCEED() << "test not supported";
3932 return;
3933 }
3934
3935 // Try to present 33ms after the first frame
3936 time += (33.3 * 1e6);
3937
3938 transaction.setDesiredPresentTime(time);
3939 transaction.apply();
3940
3941 ExpectedResult expected2;
3942 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3943 ExpectedResult::Buffer::ACQUIRED,
3944 ExpectedResult::PreviousBuffer::RELEASED);
3945 expected2.addExpectedPresentTime(time);
3946
3947 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3948 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3949}
3950
3951TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3952 sp<SurfaceControl> layer;
3953 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3954
3955 Transaction transaction;
3956 CallbackHelper callback1;
3957 int err = fillTransaction(transaction, &callback1, layer);
3958 if (err) {
3959 GTEST_SUCCEED() << "test not supported";
3960 return;
3961 }
3962
3963 // Try to present 100ms in the future
3964 nsecs_t time = systemTime() + (100 * 1e6);
3965
3966 transaction.setDesiredPresentTime(time);
3967 transaction.apply();
3968
3969 ExpectedResult expected1;
3970 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3971 expected1.addExpectedPresentTime(time);
3972
3973 CallbackHelper callback2;
3974 err = fillTransaction(transaction, &callback2, layer);
3975 if (err) {
3976 GTEST_SUCCEED() << "test not supported";
3977 return;
3978 }
3979
3980 // Try to present 33ms before the previous frame
3981 time -= (33.3 * 1e6);
3982
3983 transaction.setDesiredPresentTime(time);
3984 transaction.apply();
3985
3986 ExpectedResult expected2;
3987 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3988 ExpectedResult::Buffer::ACQUIRED,
3989 ExpectedResult::PreviousBuffer::RELEASED);
3990
3991 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3992 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3993}
3994
3995TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3996 sp<SurfaceControl> layer;
3997 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3998
3999 Transaction transaction;
4000 CallbackHelper callback;
4001 int err = fillTransaction(transaction, &callback, layer);
4002 if (err) {
4003 GTEST_SUCCEED() << "test not supported";
4004 return;
4005 }
4006
4007 // Try to present 100ms in the past
4008 nsecs_t time = systemTime() - (100 * 1e6);
4009
4010 transaction.setDesiredPresentTime(time);
4011 transaction.apply();
4012
4013 ExpectedResult expected;
4014 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4015 expected.addExpectedPresentTime(systemTime());
4016 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4017}
4018
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004019class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004020protected:
4021 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004022 LayerTransactionTest::SetUp();
4023 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004024
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004025 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4026 ASSERT_FALSE(display == nullptr);
4027
Mathias Agopianc666cae2012-07-25 18:56:13 -07004028 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004029 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004030
4031 ssize_t displayWidth = info.w;
4032 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004033
4034 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004035 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4036 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004037 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004038 ASSERT_TRUE(mBGSurfaceControl->isValid());
4039 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4040
4041 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004042 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4043
Peiyong Lin566a3b42018-01-09 18:22:43 -08004044 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004045 ASSERT_TRUE(mFGSurfaceControl->isValid());
4046
4047 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4048
4049 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004050 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004051 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004052 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4053
4054 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4055
Robert Carr4cdc58f2017-08-23 14:22:20 -07004056 asTransaction([&](Transaction& t) {
4057 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004058
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004059 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004060
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004061 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4062 .setPosition(mFGSurfaceControl, 64, 64)
4063 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004064
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004065 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4066 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4067 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004068 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004069 }
4070
4071 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004072 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004073 mBGSurfaceControl = 0;
4074 mFGSurfaceControl = 0;
4075 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004076 }
4077
4078 void waitForPostedBuffers() {
4079 // Since the sync surface is in synchronous mode (i.e. double buffered)
4080 // posting three buffers to it should ensure that at least two
4081 // SurfaceFlinger::handlePageFlip calls have been made, which should
4082 // guaranteed that a buffer posted to another Surface has been retired.
4083 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4084 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4085 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4086 }
4087
Robert Carr4cdc58f2017-08-23 14:22:20 -07004088 void asTransaction(const std::function<void(Transaction&)>& exec) {
4089 Transaction t;
4090 exec(t);
4091 t.apply(true);
4092 }
4093
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004094 sp<SurfaceControl> mBGSurfaceControl;
4095 sp<SurfaceControl> mFGSurfaceControl;
4096
4097 // This surface is used to ensure that the buffers posted to
4098 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4099 sp<SurfaceControl> mSyncSurfaceControl;
4100};
4101
Robert Carr7f619b22017-11-06 12:56:35 -08004102TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004103
chaviw0e3479f2018-09-10 16:49:30 -07004104 std::unique_ptr<ScreenCapture> sc;
4105
4106 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004107 fillSurfaceRGBA8(relative, 10, 10, 10);
4108 waitForPostedBuffers();
4109
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004110 Transaction{}
4111 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004112 .setPosition(relative, 64, 64)
4113 .apply();
4114
4115 {
4116 // The relative should be on top of the FG control.
4117 ScreenCapture::captureScreen(&sc);
4118 sc->checkPixel(64, 64, 10, 10, 10);
4119 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004120 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004121
4122 {
4123 // Nothing should change at this point.
4124 ScreenCapture::captureScreen(&sc);
4125 sc->checkPixel(64, 64, 10, 10, 10);
4126 }
4127
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004128 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004129
4130 {
4131 // Ensure that the relative was actually hidden, rather than
4132 // being left in the detached but visible state.
4133 ScreenCapture::captureScreen(&sc);
4134 sc->expectFGColor(64, 64);
4135 }
4136}
4137
Robert Carr8d5227b2017-03-16 15:41:03 -07004138class GeometryLatchingTest : public LayerUpdateTest {
4139protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004140 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004141 SCOPED_TRACE(trace);
4142 ScreenCapture::captureScreen(&sc);
4143 // We find the leading edge of the FG surface.
4144 sc->expectFGColor(127, 127);
4145 sc->expectBGColor(128, 128);
4146 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004147
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004148 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004149
4150 void unlockFGBuffer() {
4151 sp<Surface> s = mFGSurfaceControl->getSurface();
4152 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4153 waitForPostedBuffers();
4154 }
4155
Robert Carr8d5227b2017-03-16 15:41:03 -07004156 void completeFGResize() {
4157 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4158 waitForPostedBuffers();
4159 }
4160 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004161 asTransaction([&](Transaction& t) {
4162 t.setSize(mFGSurfaceControl, 64, 64);
4163 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004164 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004165 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004166
4167 EXPECT_INITIAL_STATE("After restoring initial state");
4168 }
chaviw0e3479f2018-09-10 16:49:30 -07004169 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004170};
4171
Robert Carr8d5227b2017-03-16 15:41:03 -07004172class CropLatchingTest : public GeometryLatchingTest {
4173protected:
4174 void EXPECT_CROPPED_STATE(const char* trace) {
4175 SCOPED_TRACE(trace);
4176 ScreenCapture::captureScreen(&sc);
4177 // The edge should be moved back one pixel by our crop.
4178 sc->expectFGColor(126, 126);
4179 sc->expectBGColor(127, 127);
4180 sc->expectBGColor(128, 128);
4181 }
chaviw59f5c562017-06-28 16:39:06 -07004182
4183 void EXPECT_RESIZE_STATE(const char* trace) {
4184 SCOPED_TRACE(trace);
4185 ScreenCapture::captureScreen(&sc);
4186 // The FG is now resized too 128,128 at 64,64
4187 sc->expectFGColor(64, 64);
4188 sc->expectFGColor(191, 191);
4189 sc->expectBGColor(192, 192);
4190 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004191};
4192
Pablo Ceballos05289c22016-04-14 15:49:55 -07004193TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004194 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004195 {
4196 SCOPED_TRACE("before anything");
4197 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004198 sc->expectBGColor(32, 32);
4199 sc->expectFGColor(96, 96);
4200 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004201 }
4202
4203 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004204 asTransaction([&](Transaction& t) {
4205 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004206 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4207 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004208 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004209
Robert Carr4cdc58f2017-08-23 14:22:20 -07004210 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004211 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004212 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4213 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004214 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004215
4216 {
4217 SCOPED_TRACE("before any trigger");
4218 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004219 sc->expectBGColor(32, 32);
4220 sc->expectFGColor(96, 96);
4221 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004222 }
4223
4224 // should trigger the first deferred transaction, but not the second one
4225 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4226 {
4227 SCOPED_TRACE("after first trigger");
4228 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004229 sc->expectBGColor(32, 32);
4230 sc->checkPixel(96, 96, 162, 63, 96);
4231 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004232 }
4233
4234 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004235 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004236
4237 // trigger the second deferred transaction
4238 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4239 {
4240 SCOPED_TRACE("after second trigger");
4241 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004242 sc->expectBGColor(32, 32);
4243 sc->expectBGColor(96, 96);
4244 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004245 }
4246}
4247
Robert Carre392b552017-09-19 12:16:05 -07004248TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004249 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004250
4251 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004252 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4253 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4254 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4255 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004256 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004257 SurfaceComposerClient::Transaction{}
4258 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4259 .show(childNoBuffer)
4260 .show(childBuffer)
4261 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004262 {
4263 ScreenCapture::captureScreen(&sc);
4264 sc->expectChildColor(73, 73);
4265 sc->expectFGColor(74, 74);
4266 }
Vishnu Nair60356342018-11-13 13:00:45 -08004267 SurfaceComposerClient::Transaction{}
4268 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4269 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004270 {
4271 ScreenCapture::captureScreen(&sc);
4272 sc->expectChildColor(73, 73);
4273 sc->expectChildColor(74, 74);
4274 }
4275}
4276
Robert Carr2c5f6d22017-09-26 12:30:35 -07004277TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004278 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004279 {
4280 SCOPED_TRACE("before move");
4281 ScreenCapture::captureScreen(&sc);
4282 sc->expectBGColor(0, 12);
4283 sc->expectFGColor(75, 75);
4284 sc->expectBGColor(145, 145);
4285 }
4286
4287 Transaction t1, t2;
4288 t1.setPosition(mFGSurfaceControl, 128, 128);
4289 t2.setPosition(mFGSurfaceControl, 0, 0);
4290 // We expect that the position update from t2 now
4291 // overwrites the position update from t1.
4292 t1.merge(std::move(t2));
4293 t1.apply();
4294
4295 {
4296 ScreenCapture::captureScreen(&sc);
4297 sc->expectFGColor(1, 1);
4298 }
4299}
4300
Robert Carr1f0a16a2016-10-24 16:27:39 -07004301class ChildLayerTest : public LayerUpdateTest {
4302protected:
4303 void SetUp() override {
4304 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004305 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4306 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004307 fillSurfaceRGBA8(mChild, 200, 200, 200);
4308
4309 {
4310 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004311 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004312 mCapture->expectChildColor(64, 64);
4313 }
4314 }
4315 void TearDown() override {
4316 LayerUpdateTest::TearDown();
4317 mChild = 0;
4318 }
4319
4320 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004321 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004322};
4323
4324TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004325 asTransaction([&](Transaction& t) {
4326 t.show(mChild);
4327 t.setPosition(mChild, 10, 10);
4328 t.setPosition(mFGSurfaceControl, 64, 64);
4329 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004330
4331 {
chaviw0e3479f2018-09-10 16:49:30 -07004332 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004333 // Top left of foreground must now be visible
4334 mCapture->expectFGColor(64, 64);
4335 // But 10 pixels in we should see the child surface
4336 mCapture->expectChildColor(74, 74);
4337 // And 10 more pixels we should be back to the foreground surface
4338 mCapture->expectFGColor(84, 84);
4339 }
4340
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 {
chaviw0e3479f2018-09-10 16:49:30 -07004344 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004345 // Top left of foreground should now be at 0, 0
4346 mCapture->expectFGColor(0, 0);
4347 // But 10 pixels in we should see the child surface
4348 mCapture->expectChildColor(10, 10);
4349 // And 10 more pixels we should be back to the foreground surface
4350 mCapture->expectFGColor(20, 20);
4351 }
4352}
4353
Robert Carr41b08b52017-06-01 16:11:34 -07004354TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004355 asTransaction([&](Transaction& t) {
4356 t.show(mChild);
4357 t.setPosition(mChild, 0, 0);
4358 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004359 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004360 });
Robert Carr41b08b52017-06-01 16:11:34 -07004361
4362 {
chaviw0e3479f2018-09-10 16:49:30 -07004363 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004364 mCapture->expectChildColor(0, 0);
4365 mCapture->expectChildColor(4, 4);
4366 mCapture->expectBGColor(5, 5);
4367 }
4368}
4369
Robert Carr1f0a16a2016-10-24 16:27:39 -07004370TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004371 asTransaction([&](Transaction& t) {
4372 t.show(mChild);
4373 t.setPosition(mFGSurfaceControl, 0, 0);
4374 t.setPosition(mChild, 63, 63);
4375 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004376
4377 {
chaviw0e3479f2018-09-10 16:49:30 -07004378 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004379 mCapture->expectFGColor(0, 0);
4380 // Last pixel in foreground should now be the child.
4381 mCapture->expectChildColor(63, 63);
4382 // But the child should be constrained and the next pixel
4383 // must be the background
4384 mCapture->expectBGColor(64, 64);
4385 }
4386}
4387
4388TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004389 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004390
4391 // Find the boundary between the parent and child
4392 {
chaviw0e3479f2018-09-10 16:49:30 -07004393 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004394 mCapture->expectChildColor(9, 9);
4395 mCapture->expectFGColor(10, 10);
4396 }
4397
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004398 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004399
4400 // The boundary should be twice as far from the origin now.
4401 // The pixels from the last test should all be child now
4402 {
chaviw0e3479f2018-09-10 16:49:30 -07004403 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004404 mCapture->expectChildColor(9, 9);
4405 mCapture->expectChildColor(10, 10);
4406 mCapture->expectChildColor(19, 19);
4407 mCapture->expectFGColor(20, 20);
4408 }
4409}
Robert Carr9524cb32017-02-13 11:32:32 -08004410
Robert Carr6452f122017-03-21 10:41:29 -07004411TEST_F(ChildLayerTest, ChildLayerAlpha) {
4412 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4413 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4414 fillSurfaceRGBA8(mChild, 0, 254, 0);
4415 waitForPostedBuffers();
4416
Robert Carr4cdc58f2017-08-23 14:22:20 -07004417 asTransaction([&](Transaction& t) {
4418 t.show(mChild);
4419 t.setPosition(mChild, 0, 0);
4420 t.setPosition(mFGSurfaceControl, 0, 0);
4421 });
Robert Carr6452f122017-03-21 10:41:29 -07004422
4423 {
chaviw0e3479f2018-09-10 16:49:30 -07004424 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004425 // Unblended child color
4426 mCapture->checkPixel(0, 0, 0, 254, 0);
4427 }
4428
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004429 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004430
4431 {
chaviw0e3479f2018-09-10 16:49:30 -07004432 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004433 // Child and BG blended.
4434 mCapture->checkPixel(0, 0, 127, 127, 0);
4435 }
4436
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004437 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004438
4439 {
chaviw0e3479f2018-09-10 16:49:30 -07004440 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004441 // Child and BG blended.
4442 mCapture->checkPixel(0, 0, 95, 64, 95);
4443 }
4444}
4445
Robert Carr9524cb32017-02-13 11:32:32 -08004446TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004447 asTransaction([&](Transaction& t) {
4448 t.show(mChild);
4449 t.setPosition(mChild, 10, 10);
4450 t.setPosition(mFGSurfaceControl, 64, 64);
4451 });
Robert Carr9524cb32017-02-13 11:32:32 -08004452
4453 {
chaviw0e3479f2018-09-10 16:49:30 -07004454 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004455 // Top left of foreground must now be visible
4456 mCapture->expectFGColor(64, 64);
4457 // But 10 pixels in we should see the child surface
4458 mCapture->expectChildColor(74, 74);
4459 // And 10 more pixels we should be back to the foreground surface
4460 mCapture->expectFGColor(84, 84);
4461 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004462
4463 asTransaction([&](Transaction& t) {
4464 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4465 });
4466
Robert Carr9524cb32017-02-13 11:32:32 -08004467 {
chaviw0e3479f2018-09-10 16:49:30 -07004468 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004469 mCapture->expectFGColor(64, 64);
4470 // In reparenting we should have exposed the entire foreground surface.
4471 mCapture->expectFGColor(74, 74);
4472 // And the child layer should now begin at 10, 10 (since the BG
4473 // layer is at (0, 0)).
4474 mCapture->expectBGColor(9, 9);
4475 mCapture->expectChildColor(10, 10);
4476 }
4477}
4478
Robert Carr2e102c92018-10-23 12:11:15 -07004479TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4480 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004481 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004482 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4483
4484 {
4485 SCOPED_TRACE("Grandchild visible");
4486 ScreenCapture::captureScreen(&mCapture);
4487 mCapture->checkPixel(64, 64, 111, 111, 111);
4488 }
4489
Robert Carr87246532019-02-04 15:20:26 -08004490 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004491
4492 {
4493 SCOPED_TRACE("After destroying child");
4494 ScreenCapture::captureScreen(&mCapture);
4495 mCapture->expectFGColor(64, 64);
4496 }
4497
4498 asTransaction([&](Transaction& t) {
4499 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4500 });
4501
4502 {
4503 SCOPED_TRACE("After reparenting grandchild");
4504 ScreenCapture::captureScreen(&mCapture);
4505 mCapture->checkPixel(64, 64, 111, 111, 111);
4506 }
4507}
4508
chaviw161410b02017-07-27 10:46:08 -07004509TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004510 asTransaction([&](Transaction& t) {
4511 t.show(mChild);
4512 t.setPosition(mChild, 10, 10);
4513 t.setPosition(mFGSurfaceControl, 64, 64);
4514 });
Robert Carr9524cb32017-02-13 11:32:32 -08004515
4516 {
chaviw0e3479f2018-09-10 16:49:30 -07004517 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004518 // Top left of foreground must now be visible
4519 mCapture->expectFGColor(64, 64);
4520 // But 10 pixels in we should see the child surface
4521 mCapture->expectChildColor(74, 74);
4522 // And 10 more pixels we should be back to the foreground surface
4523 mCapture->expectFGColor(84, 84);
4524 }
4525
chaviw0e3479f2018-09-10 16:49:30 -07004526
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004527 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004528
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004529 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004530
chaviw161410b02017-07-27 10:46:08 -07004531 // Since the child has the same client as the parent, it will not get
4532 // detached and will be hidden.
4533 {
chaviw0e3479f2018-09-10 16:49:30 -07004534 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004535 mCapture->expectFGColor(64, 64);
4536 mCapture->expectFGColor(74, 74);
4537 mCapture->expectFGColor(84, 84);
4538 }
4539}
4540
4541TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4542 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004543 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004544 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4545 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004546
chaviw161410b02017-07-27 10:46:08 -07004547 ASSERT_TRUE(mChildNewClient->isValid());
4548
4549 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4550
Robert Carr4cdc58f2017-08-23 14:22:20 -07004551 asTransaction([&](Transaction& t) {
4552 t.hide(mChild);
4553 t.show(mChildNewClient);
4554 t.setPosition(mChildNewClient, 10, 10);
4555 t.setPosition(mFGSurfaceControl, 64, 64);
4556 });
chaviw161410b02017-07-27 10:46:08 -07004557
4558 {
chaviw0e3479f2018-09-10 16:49:30 -07004559 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004560 // Top left of foreground must now be visible
4561 mCapture->expectFGColor(64, 64);
4562 // But 10 pixels in we should see the child surface
4563 mCapture->expectChildColor(74, 74);
4564 // And 10 more pixels we should be back to the foreground surface
4565 mCapture->expectFGColor(84, 84);
4566 }
4567
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004568 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004569
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004570 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004571
Robert Carr9524cb32017-02-13 11:32:32 -08004572 // Nothing should have changed.
4573 {
chaviw0e3479f2018-09-10 16:49:30 -07004574 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004575 mCapture->expectFGColor(64, 64);
4576 mCapture->expectChildColor(74, 74);
4577 mCapture->expectFGColor(84, 84);
4578 }
4579}
4580
chaviw5aedec92018-10-22 10:40:38 -07004581TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4582 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4583 sp<SurfaceControl> childNewClient =
4584 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4585 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4586
4587 ASSERT_TRUE(childNewClient != nullptr);
4588 ASSERT_TRUE(childNewClient->isValid());
4589
4590 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4591
4592 Transaction()
4593 .hide(mChild)
4594 .show(childNewClient)
4595 .setPosition(childNewClient, 10, 10)
4596 .setPosition(mFGSurfaceControl, 64, 64)
4597 .apply();
4598
4599 {
4600 mCapture = screenshot();
4601 // Top left of foreground must now be visible
4602 mCapture->expectFGColor(64, 64);
4603 // But 10 pixels in we should see the child surface
4604 mCapture->expectChildColor(74, 74);
4605 // And 10 more pixels we should be back to the foreground surface
4606 mCapture->expectFGColor(84, 84);
4607 }
4608
4609 Transaction().detachChildren(mFGSurfaceControl).apply();
4610 Transaction().hide(childNewClient).apply();
4611
4612 // Nothing should have changed.
4613 {
4614 mCapture = screenshot();
4615 mCapture->expectFGColor(64, 64);
4616 mCapture->expectChildColor(74, 74);
4617 mCapture->expectFGColor(84, 84);
4618 }
4619
4620 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4621 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4622 32);
4623 Transaction()
4624 .setLayer(newParentSurface, INT32_MAX - 1)
4625 .show(newParentSurface)
4626 .setPosition(newParentSurface, 20, 20)
4627 .reparent(childNewClient, newParentSurface->getHandle())
4628 .apply();
4629 {
4630 mCapture = screenshot();
4631 // Child is now hidden.
4632 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4633 }
4634}
4635
Robert Carr9b429f42017-04-17 14:56:57 -07004636TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004637 asTransaction([&](Transaction& t) {
4638 t.show(mChild);
4639 t.setPosition(mChild, 0, 0);
4640 t.setPosition(mFGSurfaceControl, 0, 0);
4641 });
Robert Carr9b429f42017-04-17 14:56:57 -07004642
4643 {
chaviw0e3479f2018-09-10 16:49:30 -07004644 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004645 // We've positioned the child in the top left.
4646 mCapture->expectChildColor(0, 0);
4647 // But it's only 10x10.
4648 mCapture->expectFGColor(10, 10);
4649 }
4650
Robert Carr4cdc58f2017-08-23 14:22:20 -07004651 asTransaction([&](Transaction& t) {
4652 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4653 // We cause scaling by 2.
4654 t.setSize(mFGSurfaceControl, 128, 128);
4655 });
Robert Carr9b429f42017-04-17 14:56:57 -07004656
4657 {
chaviw0e3479f2018-09-10 16:49:30 -07004658 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004659 // We've positioned the child in the top left.
4660 mCapture->expectChildColor(0, 0);
4661 mCapture->expectChildColor(10, 10);
4662 mCapture->expectChildColor(19, 19);
4663 // And now it should be scaled all the way to 20x20
4664 mCapture->expectFGColor(20, 20);
4665 }
4666}
4667
Robert Carr1725eee2017-04-26 18:32:15 -07004668// Regression test for b/37673612
4669TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004670 asTransaction([&](Transaction& t) {
4671 t.show(mChild);
4672 t.setPosition(mChild, 0, 0);
4673 t.setPosition(mFGSurfaceControl, 0, 0);
4674 });
Robert Carr1725eee2017-04-26 18:32:15 -07004675
4676 {
chaviw0e3479f2018-09-10 16:49:30 -07004677 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004678 // We've positioned the child in the top left.
4679 mCapture->expectChildColor(0, 0);
4680 // But it's only 10x10.
4681 mCapture->expectFGColor(10, 10);
4682 }
Robert Carr1725eee2017-04-26 18:32:15 -07004683 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4684 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004685 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004686 sp<Surface> s = mFGSurfaceControl->getSurface();
4687 auto anw = static_cast<ANativeWindow*>(s.get());
4688 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4689 native_window_set_buffers_dimensions(anw, 64, 128);
4690 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4691 waitForPostedBuffers();
4692
4693 {
4694 // The child should still be in the same place and not have any strange scaling as in
4695 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004696 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004697 mCapture->expectChildColor(0, 0);
4698 mCapture->expectFGColor(10, 10);
4699 }
4700}
4701
Dan Stoza412903f2017-04-27 13:42:17 -07004702TEST_F(ChildLayerTest, Bug36858924) {
4703 // Destroy the child layer
4704 mChild.clear();
4705
4706 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004707 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4708 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004709
4710 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004711 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004712 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4713 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004714 t.show(mChild);
4715 });
Dan Stoza412903f2017-04-27 13:42:17 -07004716
4717 // Render the foreground surface a few times
4718 //
4719 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4720 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4721 // never acquire/release the first buffer
4722 ALOGI("Filling 1");
4723 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4724 ALOGI("Filling 2");
4725 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4726 ALOGI("Filling 3");
4727 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4728 ALOGI("Filling 4");
4729 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4730}
4731
chaviwf1961f72017-09-18 16:41:07 -07004732TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004733 asTransaction([&](Transaction& t) {
4734 t.show(mChild);
4735 t.setPosition(mChild, 10, 10);
4736 t.setPosition(mFGSurfaceControl, 64, 64);
4737 });
chaviw06178942017-07-27 10:25:59 -07004738
4739 {
chaviw0e3479f2018-09-10 16:49:30 -07004740 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004741 // Top left of foreground must now be visible
4742 mCapture->expectFGColor(64, 64);
4743 // But 10 pixels in we should see the child surface
4744 mCapture->expectChildColor(74, 74);
4745 // And 10 more pixels we should be back to the foreground surface
4746 mCapture->expectFGColor(84, 84);
4747 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004748
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004749 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004750
chaviw06178942017-07-27 10:25:59 -07004751 {
chaviw0e3479f2018-09-10 16:49:30 -07004752 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004753 mCapture->expectFGColor(64, 64);
4754 // In reparenting we should have exposed the entire foreground surface.
4755 mCapture->expectFGColor(74, 74);
4756 // And the child layer should now begin at 10, 10 (since the BG
4757 // layer is at (0, 0)).
4758 mCapture->expectBGColor(9, 9);
4759 mCapture->expectChildColor(10, 10);
4760 }
4761}
4762
chaviwf1961f72017-09-18 16:41:07 -07004763TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004764 asTransaction([&](Transaction& t) {
4765 t.show(mChild);
4766 t.setPosition(mChild, 10, 10);
4767 t.setPosition(mFGSurfaceControl, 64, 64);
4768 });
chaviwf1961f72017-09-18 16:41:07 -07004769
4770 {
chaviw0e3479f2018-09-10 16:49:30 -07004771 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004772 // Top left of foreground must now be visible
4773 mCapture->expectFGColor(64, 64);
4774 // But 10 pixels in we should see the child surface
4775 mCapture->expectChildColor(74, 74);
4776 // And 10 more pixels we should be back to the foreground surface
4777 mCapture->expectFGColor(84, 84);
4778 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004779 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004780 {
chaviw0e3479f2018-09-10 16:49:30 -07004781 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004782 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004783 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004784 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004785 mCapture->expectFGColor(84, 84);
4786 }
4787}
4788
4789TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004790 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004791 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004792 ASSERT_TRUE(newSurface->isValid());
4793
4794 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004795 asTransaction([&](Transaction& t) {
4796 t.hide(mChild);
4797 t.show(newSurface);
4798 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004799 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004800 t.setPosition(mFGSurfaceControl, 64, 64);
4801 });
chaviwf1961f72017-09-18 16:41:07 -07004802
4803 {
chaviw0e3479f2018-09-10 16:49:30 -07004804 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004805 // Top left of foreground must now be visible
4806 mCapture->expectFGColor(64, 64);
4807 // At 10, 10 we should see the new surface
4808 mCapture->checkPixel(10, 10, 63, 195, 63);
4809 }
4810
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004811 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004812
4813 {
chaviw0e3479f2018-09-10 16:49:30 -07004814 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004815 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4816 // mFGSurface, putting it at 74, 74.
4817 mCapture->expectFGColor(64, 64);
4818 mCapture->checkPixel(74, 74, 63, 195, 63);
4819 mCapture->expectFGColor(84, 84);
4820 }
4821}
4822
chaviwc9674332017-08-28 12:32:18 -07004823TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004824 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4825 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004826 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4827
4828 {
chaviw0e3479f2018-09-10 16:49:30 -07004829 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004830 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4831 // which begins at 64, 64
4832 mCapture->checkPixel(64, 64, 50, 50, 50);
4833 }
4834}
4835
Robert Carr503c7042017-09-27 15:06:08 -07004836TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004837 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004838 fillSurfaceRGBA8(relative, 255, 255, 255);
4839
4840 Transaction t;
4841 t.setLayer(relative, INT32_MAX)
4842 .setRelativeLayer(mChild, relative->getHandle(), 1)
4843 .setPosition(mFGSurfaceControl, 0, 0)
4844 .apply(true);
4845
4846 // We expect that the child should have been elevated above our
4847 // INT_MAX layer even though it's not a child of it.
4848 {
chaviw0e3479f2018-09-10 16:49:30 -07004849 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004850 mCapture->expectChildColor(0, 0);
4851 mCapture->expectChildColor(9, 9);
4852 mCapture->checkPixel(10, 10, 255, 255, 255);
4853 }
4854}
Vishnu Nair60356342018-11-13 13:00:45 -08004855class BoundlessLayerTest : public LayerUpdateTest {
4856protected:
4857 std::unique_ptr<ScreenCapture> mCapture;
4858};
4859
4860// Verify setting a size on a buffer layer has no effect.
4861TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4862 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004863 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4864 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004865 ASSERT_TRUE(bufferLayer->isValid());
4866 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4867 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4868 {
4869 mCapture = screenshot();
4870 // Top left of background must now be visible
4871 mCapture->expectBGColor(0, 0);
4872 // Foreground Surface bounds must be color layer
4873 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4874 // Buffer layer should not extend past buffer bounds
4875 mCapture->expectFGColor(95, 95);
4876 }
4877}
4878
4879// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4880// which will crop the color layer.
4881TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4882 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004883 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4884 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004885 ASSERT_TRUE(colorLayer->isValid());
4886 asTransaction([&](Transaction& t) {
4887 t.setColor(colorLayer, half3{0, 0, 0});
4888 t.show(colorLayer);
4889 });
4890 {
4891 mCapture = screenshot();
4892 // Top left of background must now be visible
4893 mCapture->expectBGColor(0, 0);
4894 // Foreground Surface bounds must be color layer
4895 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4896 // Color layer should not extend past foreground bounds
4897 mCapture->expectBGColor(129, 129);
4898 }
4899}
4900
4901// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4902// a crop which will be used to crop the color layer.
4903TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004904 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4905 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004906 ASSERT_TRUE(cropLayer->isValid());
4907 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004908 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4909 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004910 ASSERT_TRUE(colorLayer->isValid());
4911 asTransaction([&](Transaction& t) {
4912 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4913 t.setColor(colorLayer, half3{0, 0, 0});
4914 t.show(cropLayer);
4915 t.show(colorLayer);
4916 });
4917 {
4918 mCapture = screenshot();
4919 // Top left of background must now be visible
4920 mCapture->expectBGColor(0, 0);
4921 // Top left of foreground must now be visible
4922 mCapture->expectFGColor(64, 64);
4923 // 5 pixels from the foreground we should see the child surface
4924 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4925 // 10 pixels from the foreground we should be back to the foreground surface
4926 mCapture->expectFGColor(74, 74);
4927 }
4928}
4929
4930// Verify for boundless layer with no children, their transforms have no effect.
4931TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4932 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004933 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4934 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004935 ASSERT_TRUE(colorLayer->isValid());
4936 asTransaction([&](Transaction& t) {
4937 t.setPosition(colorLayer, 320, 320);
4938 t.setMatrix(colorLayer, 2, 0, 0, 2);
4939 t.setColor(colorLayer, half3{0, 0, 0});
4940 t.show(colorLayer);
4941 });
4942 {
4943 mCapture = screenshot();
4944 // Top left of background must now be visible
4945 mCapture->expectBGColor(0, 0);
4946 // Foreground Surface bounds must be color layer
4947 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4948 // Color layer should not extend past foreground bounds
4949 mCapture->expectBGColor(129, 129);
4950 }
4951}
4952
4953// Verify for boundless layer with children, their transforms have an effect.
4954TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4955 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004956 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4957 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004958 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4959 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004960 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4961 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004962 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4963 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004964 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4965 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004966 ASSERT_TRUE(colorLayer->isValid());
4967 asTransaction([&](Transaction& t) {
4968 t.setPosition(boundlessLayerRightShift, 32, 0);
4969 t.show(boundlessLayerRightShift);
4970 t.setPosition(boundlessLayerDownShift, 0, 32);
4971 t.show(boundlessLayerDownShift);
4972 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4973 t.setColor(colorLayer, half3{0, 0, 0});
4974 t.show(colorLayer);
4975 });
4976 {
4977 mCapture = screenshot();
4978 // Top left of background must now be visible
4979 mCapture->expectBGColor(0, 0);
4980 // Top left of foreground must now be visible
4981 mCapture->expectFGColor(64, 64);
4982 // Foreground Surface bounds must be color layer
4983 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4984 // Color layer should not extend past foreground bounds
4985 mCapture->expectBGColor(129, 129);
4986 }
4987}
4988
4989// Verify child layers do not get clipped if they temporarily move into the negative
4990// coordinate space as the result of an intermediate transformation.
4991TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4992 sp<SurfaceControl> boundlessLayer =
4993 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4994 0 /* flags */, mFGSurfaceControl.get());
4995 ASSERT_TRUE(boundlessLayer != nullptr);
4996 ASSERT_TRUE(boundlessLayer->isValid());
4997 sp<SurfaceControl> colorLayer =
4998 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4999 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5000 ASSERT_TRUE(colorLayer != nullptr);
5001 ASSERT_TRUE(colorLayer->isValid());
5002 asTransaction([&](Transaction& t) {
5003 // shift child layer off bounds. If this layer was not boundless, we will
5004 // expect the child layer to be cropped.
5005 t.setPosition(boundlessLayer, 32, 32);
5006 t.show(boundlessLayer);
5007 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5008 // undo shift by parent
5009 t.setPosition(colorLayer, -32, -32);
5010 t.setColor(colorLayer, half3{0, 0, 0});
5011 t.show(colorLayer);
5012 });
5013 {
5014 mCapture = screenshot();
5015 // Top left of background must now be visible
5016 mCapture->expectBGColor(0, 0);
5017 // Foreground Surface bounds must be color layer
5018 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5019 // Color layer should not extend past foreground bounds
5020 mCapture->expectBGColor(129, 129);
5021 }
5022}
5023
5024// Verify for boundless root layers with children, their transforms have an effect.
5025TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005026 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5027 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005028 ASSERT_TRUE(rootBoundlessLayer->isValid());
5029 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005030 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5031 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5032
Vishnu Nair60356342018-11-13 13:00:45 -08005033 ASSERT_TRUE(colorLayer->isValid());
5034 asTransaction([&](Transaction& t) {
5035 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5036 t.setPosition(rootBoundlessLayer, 32, 32);
5037 t.show(rootBoundlessLayer);
5038 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5039 t.setColor(colorLayer, half3{0, 0, 0});
5040 t.show(colorLayer);
5041 t.hide(mFGSurfaceControl);
5042 });
5043 {
5044 mCapture = screenshot();
5045 // Top left of background must now be visible
5046 mCapture->expectBGColor(0, 0);
5047 // Top left of foreground must now be visible
5048 mCapture->expectBGColor(31, 31);
5049 // Foreground Surface bounds must be color layer
5050 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5051 // Color layer should not extend past foreground bounds
5052 mCapture->expectBGColor(97, 97);
5053 }
5054}
Robert Carr503c7042017-09-27 15:06:08 -07005055
chaviwa76b2712017-09-20 12:02:26 -07005056class ScreenCaptureTest : public LayerUpdateTest {
5057protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005058 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005059};
5060
5061TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5062 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005063 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005064 mCapture->expectBGColor(0, 0);
5065 // Doesn't capture FG layer which is at 64, 64
5066 mCapture->expectBGColor(64, 64);
5067}
5068
5069TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5070 auto fgHandle = mFGSurfaceControl->getHandle();
5071
Vishnu Nair88a11f22018-11-28 18:30:57 -08005072 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5073 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005074 fillSurfaceRGBA8(child, 200, 200, 200);
5075
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005076 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005077
5078 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005079 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005080 mCapture->expectFGColor(10, 10);
5081 mCapture->expectChildColor(0, 0);
5082}
5083
Robert Carr578038f2018-03-09 12:25:24 -08005084TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5085 auto fgHandle = mFGSurfaceControl->getHandle();
5086
Vishnu Nair88a11f22018-11-28 18:30:57 -08005087 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5088 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005089 fillSurfaceRGBA8(child, 200, 200, 200);
5090
5091 SurfaceComposerClient::Transaction().show(child).apply(true);
5092
5093 // Captures mFGSurfaceControl's child
5094 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5095 mCapture->checkPixel(10, 10, 0, 0, 0);
5096 mCapture->expectChildColor(0, 0);
5097}
5098
chaviw50da5042018-04-09 13:49:37 -07005099TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005100 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5101 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005102
5103 fillSurfaceRGBA8(child, 200, 200, 200);
5104
5105 SurfaceComposerClient::Transaction().show(child).apply(true);
5106
5107 auto childHandle = child->getHandle();
5108
5109 // Captures child
5110 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5111 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5112 // Area outside of child's bounds is transparent.
5113 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5114}
5115
chaviw4b129c22018-04-09 16:19:43 -07005116TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5117 auto fgHandle = mFGSurfaceControl->getHandle();
5118
Vishnu Nair88a11f22018-11-28 18:30:57 -08005119 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5120 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5121 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005122 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005123 fillSurfaceRGBA8(child, 200, 200, 200);
5124 fillSurfaceRGBA8(relative, 100, 100, 100);
5125
5126 SurfaceComposerClient::Transaction()
5127 .show(child)
5128 // Set relative layer above fg layer so should be shown above when computing all layers.
5129 .setRelativeLayer(relative, fgHandle, 1)
5130 .show(relative)
5131 .apply(true);
5132
5133 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5134 ScreenCapture::captureLayers(&mCapture, fgHandle);
5135 mCapture->expectFGColor(10, 10);
5136 mCapture->expectChildColor(0, 0);
5137}
5138
5139TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5140 auto fgHandle = mFGSurfaceControl->getHandle();
5141
Vishnu Nair88a11f22018-11-28 18:30:57 -08005142 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5143 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5144 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5145 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005146 fillSurfaceRGBA8(child, 200, 200, 200);
5147 fillSurfaceRGBA8(relative, 100, 100, 100);
5148
5149 SurfaceComposerClient::Transaction()
5150 .show(child)
5151 // Set relative layer below fg layer but relative to child layer so it should be shown
5152 // above child layer.
5153 .setLayer(relative, -1)
5154 .setRelativeLayer(relative, child->getHandle(), 1)
5155 .show(relative)
5156 .apply(true);
5157
5158 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5159 // relative value should be taken into account, placing it above child layer.
5160 ScreenCapture::captureLayers(&mCapture, fgHandle);
5161 mCapture->expectFGColor(10, 10);
5162 // Relative layer is showing on top of child layer
5163 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5164}
Robert Carr578038f2018-03-09 12:25:24 -08005165
5166// In the following tests we verify successful skipping of a parent layer,
5167// so we use the same verification logic and only change how we mutate
5168// the parent layer to verify that various properties are ignored.
5169class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5170public:
5171 void SetUp() override {
5172 LayerUpdateTest::SetUp();
5173
Vishnu Nair88a11f22018-11-28 18:30:57 -08005174 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5175 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005176 fillSurfaceRGBA8(mChild, 200, 200, 200);
5177
5178 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5179 }
5180
Vishnu Nair333a9572019-02-15 16:05:56 -08005181 void verify(std::function<void()> verifyStartingState) {
5182 // Verify starting state before a screenshot is taken.
5183 verifyStartingState();
5184
5185 // Verify child layer does not inherit any of the properties of its
5186 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005187 auto fgHandle = mFGSurfaceControl->getHandle();
5188 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5189 mCapture->checkPixel(10, 10, 0, 0, 0);
5190 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005191
5192 // Verify all assumptions are still true after the screenshot is taken.
5193 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005194 }
5195
5196 std::unique_ptr<ScreenCapture> mCapture;
5197 sp<SurfaceControl> mChild;
5198};
5199
Vishnu Nair333a9572019-02-15 16:05:56 -08005200// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005201TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5202
5203 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5204
5205 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005206
5207 // Before and after reparenting, verify child is properly hidden
5208 // when rendering full-screen.
5209 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005210}
5211
5212TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005213 SurfaceComposerClient::Transaction()
5214 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5215 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005216
5217 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005218
5219 // Before and after reparenting, verify child is cropped by parent.
5220 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005221}
5222
Vishnu Nair333a9572019-02-15 16:05:56 -08005223// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005224TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005225 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005226
5227 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005228
Vishnu Nair333a9572019-02-15 16:05:56 -08005229 // Before and after reparenting, verify child is properly scaled.
5230 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005231}
5232
5233
chaviwa76b2712017-09-20 12:02:26 -07005234TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5235 auto fgHandle = mFGSurfaceControl->getHandle();
5236
Vishnu Nair88a11f22018-11-28 18:30:57 -08005237 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5238 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005239 fillSurfaceRGBA8(child, 200, 200, 200);
5240
Vishnu Nair88a11f22018-11-28 18:30:57 -08005241 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5242 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005243
5244 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5245 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005246 .show(child)
5247 .setPosition(grandchild, 5, 5)
5248 .show(grandchild)
5249 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005250
5251 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005252 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005253 mCapture->expectFGColor(10, 10);
5254 mCapture->expectChildColor(0, 0);
5255 mCapture->checkPixel(5, 5, 50, 50, 50);
5256}
5257
5258TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005259 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5260 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005261 fillSurfaceRGBA8(child, 200, 200, 200);
5262 auto childHandle = child->getHandle();
5263
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005264 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005265
5266 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005267 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005268 mCapture->expectChildColor(0, 0);
5269 mCapture->expectChildColor(9, 9);
5270}
5271
5272TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005273 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5274 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005275 fillSurfaceRGBA8(child, 200, 200, 200);
5276 auto childHandle = child->getHandle();
5277
Vishnu Nair88a11f22018-11-28 18:30:57 -08005278 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5279 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005280 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5281
5282 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005283 .show(child)
5284 .setPosition(grandchild, 5, 5)
5285 .show(grandchild)
5286 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005287
5288 auto grandchildHandle = grandchild->getHandle();
5289
5290 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005291 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005292 mCapture->checkPixel(0, 0, 50, 50, 50);
5293 mCapture->checkPixel(4, 4, 50, 50, 50);
5294}
5295
chaviw7206d492017-11-10 16:16:12 -08005296TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005297 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005298 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5299 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005300
Marissa Wall61c58622018-07-18 10:12:20 -07005301 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5302 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005303
5304 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005305 .setLayer(redLayer, INT32_MAX - 1)
5306 .show(redLayer)
5307 .show(blueLayer)
5308 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005309
5310 auto redLayerHandle = redLayer->getHandle();
5311
5312 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005313 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5314 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5315 // red area below the blue area
5316 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5317 // red area to the right of the blue area
5318 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005319
Marissa Wall861616d2018-10-22 12:52:23 -07005320 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005321 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005322 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5323 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005324 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005325 mCapture->checkPixel(30, 30, 0, 0, 0);
5326}
5327
5328TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005329 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005330 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5331 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005332
Marissa Wall61c58622018-07-18 10:12:20 -07005333 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5334 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005335
5336 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005337 .setLayer(redLayer, INT32_MAX - 1)
5338 .show(redLayer)
5339 .show(blueLayer)
5340 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005341
5342 auto redLayerHandle = redLayer->getHandle();
5343
5344 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005345 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5346 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5347 // red area below the blue area
5348 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5349 // red area to the right of the blue area
5350 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005351
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005352 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005353 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005354 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5355 // red area below the blue area
5356 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5357 // red area to the right of the blue area
5358 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005359 mCapture->checkPixel(30, 30, 0, 0, 0);
5360}
5361
5362TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005363 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005364
Marissa Wall61c58622018-07-18 10:12:20 -07005365 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005366
5367 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005368 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005369 SurfaceComposerClient::Transaction().apply(true);
5370
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005371 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005372
5373 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005374 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5375 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005376}
5377
chaviw8e3fe5d2018-02-22 10:55:42 -08005378
5379class DereferenceSurfaceControlTest : public LayerTransactionTest {
5380protected:
5381 void SetUp() override {
5382 LayerTransactionTest::SetUp();
5383 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005384 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005385 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005386 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005387 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5388 {
5389 SCOPED_TRACE("before anything");
5390 auto shot = screenshot();
5391 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5392 }
5393 }
5394 void TearDown() override {
5395 LayerTransactionTest::TearDown();
5396 bgLayer = 0;
5397 fgLayer = 0;
5398 }
5399
5400 sp<SurfaceControl> bgLayer;
5401 sp<SurfaceControl> fgLayer;
5402};
5403
5404TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5405 fgLayer = nullptr;
5406 {
5407 SCOPED_TRACE("after setting null");
5408 auto shot = screenshot();
5409 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5410 }
5411}
5412
5413TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5414 auto transaction = Transaction().show(fgLayer);
5415 fgLayer = nullptr;
5416 {
5417 SCOPED_TRACE("after setting null");
5418 auto shot = screenshot();
5419 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5420 }
5421}
5422
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005423} // namespace android