blob: 34cdff778a3811e60d6a8a69e118b0c157652670 [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 Wall861616d2018-10-22 12:52:23 -07002016 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2017 shot->expectBorder(Rect(0, 0, 32, 32), 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();
Alec Mouri80863a62019-01-17 15:19:35 -08002047 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), 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();
Alec Mouri80863a62019-01-17 15:19:35 -08002053 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), 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;
2070 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", mDisplayWidth, mDisplayHeight / 2,
2071 ISurfaceComposerClient::eFXSurfaceBufferState));
2072 sp<GraphicBuffer> buffer =
2073 new GraphicBuffer(mDisplayWidth, mDisplayHeight / 2, PIXEL_FORMAT_RGBA_8888, 1,
2074 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2075 BufferUsage::COMPOSER_OVERLAY,
2076 "test");
2077 fillGraphicBufferColor(buffer, Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2078 fillGraphicBufferColor(buffer, Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2079 Color::RED);
2080
2081 Transaction().setBuffer(layer, buffer).apply();
2082
2083 // Partially out of bounds in the negative (upper left) direction
2084 Transaction().setCrop(layer, Rect(-128, -128, mDisplayWidth, mDisplayHeight / 4)).apply();
2085 {
2086 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002087 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002088 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLUE);
2089 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2090 }
2091
2092 // Partially out of bounds in the positive (lower right) direction
2093 Transaction()
2094 .setCrop(layer, Rect(0, mDisplayHeight / 4, mDisplayWidth + 1, mDisplayHeight))
2095 .apply();
2096 {
2097 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002098 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002099 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::RED);
2100 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight / 2), Color::BLACK);
2101 }
2102
2103 // Fully out of buffer space bounds
2104 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2105 {
2106 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002107 auto shot = getScreenCapture();
Valerie Hau0bc09152018-12-20 07:42:47 -08002108 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight / 4), Color::BLUE);
2109 shot->expectColor(Rect(0, mDisplayHeight / 4, mDisplayWidth, mDisplayHeight / 2),
2110 Color::RED);
2111 }
2112}
2113
Alec Mouri80863a62019-01-17 15:19:35 -08002114TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002115 sp<SurfaceControl> layer;
2116 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002117 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002118
2119 const Point position(32, 32);
2120 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002121 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002122 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002123 shot->expectColor(crop + position, Color::RED);
2124 shot->expectBorder(crop + position, Color::BLACK);
2125}
2126
Alec Mouri80863a62019-01-17 15:19:35 -08002127TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002128 sp<SurfaceControl> layer;
2129 ASSERT_NO_FATAL_FAILURE(
2130 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2131 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2132
Marissa Wall861616d2018-10-22 12:52:23 -07002133 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002134 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002135 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002136 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002137 shot->expectColor(frame, Color::RED);
2138 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002139}
2140
Alec Mouri80863a62019-01-17 15:19:35 -08002141TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002142 sp<SurfaceControl> layer;
2143 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002144 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002145
Marissa Wall861616d2018-10-22 12:52:23 -07002146 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002147 Transaction()
2148 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002149 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002150 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002151 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002152 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2153 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2154}
2155
Alec Mouri80863a62019-01-17 15:19:35 -08002156TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002157 sp<SurfaceControl> layer;
2158 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002159 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002160
Marissa Wallf58c14b2018-07-24 10:50:43 -07002161 // setCrop_legacy is applied immediately by default, with or without resize pending
2162 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002163 {
2164 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002165 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002166 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2167 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2168 }
2169
Marissa Wall61c58622018-07-18 10:12:20 -07002170 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002171 {
2172 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002173 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002174 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2175 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2176 }
2177}
2178
Alec Mouri80863a62019-01-17 15:19:35 -08002179TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002180 sp<SurfaceControl> layer;
2181 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002182 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002183
Marissa Wallf58c14b2018-07-24 10:50:43 -07002184 // request setCrop_legacy to be applied with the next resize
2185 Transaction()
2186 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2187 .setGeometryAppliesWithResize(layer)
2188 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189 {
2190 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002191 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002192 }
2193
Marissa Wallf58c14b2018-07-24 10:50:43 -07002194 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002195 {
2196 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002197 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198 }
2199
2200 Transaction().setSize(layer, 16, 16).apply();
2201 {
2202 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002203 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002204 }
2205
2206 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002207 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002208 {
2209 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002210 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002211 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2212 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2213 }
2214}
2215
Alec Mouri80863a62019-01-17 15:19:35 -08002216TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002217 sp<SurfaceControl> layer;
2218 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002219 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002220
Marissa Wallf58c14b2018-07-24 10:50:43 -07002221 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002222 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002223 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002224 .setSize(layer, 16, 16)
2225 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2226 .setGeometryAppliesWithResize(layer)
2227 .apply();
2228 {
2229 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002230 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002231 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2232 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2233 }
2234
2235 // XXX crop is never latched without other geometry change (b/69315677)
2236 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002237 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002238 Transaction().setPosition(layer, 0, 0).apply();
2239 {
2240 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002241 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002242 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2243 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2244 }
2245}
2246
Alec Mouri80863a62019-01-17 15:19:35 -08002247TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002248 sp<SurfaceControl> layer;
2249 ASSERT_NO_FATAL_FAILURE(
2250 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2251 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2252 const Rect frame(8, 8, 24, 24);
2253
2254 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002255 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002256 shot->expectColor(frame, Color::RED);
2257 shot->expectBorder(frame, Color::BLACK);
2258}
2259
Alec Mouri80863a62019-01-17 15:19:35 -08002260TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002261 sp<SurfaceControl> layer;
2262 ASSERT_NO_FATAL_FAILURE(
2263 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2264 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2265
Marissa Wall61c58622018-07-18 10:12:20 -07002266 {
Marissa Wall861616d2018-10-22 12:52:23 -07002267 SCOPED_TRACE("empty rect");
2268 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002269 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002270 }
2271
Marissa Wall61c58622018-07-18 10:12:20 -07002272 {
Marissa Wall861616d2018-10-22 12:52:23 -07002273 SCOPED_TRACE("negative rect");
2274 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002275 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002276 }
2277}
2278
Alec Mouri80863a62019-01-17 15:19:35 -08002279TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002280 sp<SurfaceControl> layer;
2281 ASSERT_NO_FATAL_FAILURE(
2282 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2283 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2284
2285 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002286 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002287 shot->expectColor(Rect(0, 0, 10, 10), Color::RED);
2288 shot->expectBorder(Rect(0, 0, 10, 10), Color::BLACK);
2289}
2290
Alec Mouri80863a62019-01-17 15:19:35 -08002291TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002292 sp<SurfaceControl> parent, child;
2293 ASSERT_NO_FATAL_FAILURE(
2294 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2295 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2296 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2297
2298 ASSERT_NO_FATAL_FAILURE(
2299 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2300 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2301
2302 Transaction().reparent(child, parent->getHandle()).apply();
2303
2304 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002305 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002306 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2307 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2308}
2309
Alec Mouri80863a62019-01-17 15:19:35 -08002310TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002311 sp<SurfaceControl> parent, child;
2312 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2313 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2314
2315 ASSERT_NO_FATAL_FAILURE(
2316 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2317 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2318
2319 Transaction().reparent(child, parent->getHandle()).apply();
2320
2321 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002322 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002323 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2324 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2325}
2326
Alec Mouri80863a62019-01-17 15:19:35 -08002327TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002328 sp<SurfaceControl> layer;
2329 ASSERT_NO_FATAL_FAILURE(
2330 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2331 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2332 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2333
2334 std::this_thread::sleep_for(500ms);
2335
2336 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2337
Alec Mouri80863a62019-01-17 15:19:35 -08002338 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002339 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2340 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2341}
2342
Alec Mouri80863a62019-01-17 15:19:35 -08002343TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002344 sp<SurfaceControl> parent, child;
2345 ASSERT_NO_FATAL_FAILURE(
2346 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2347 ASSERT_NO_FATAL_FAILURE(
2348 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2349 Transaction().reparent(child, parent->getHandle()).apply();
2350
2351 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2352 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2353
2354 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2355 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2356
Alec Mouri80863a62019-01-17 15:19:35 -08002357 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002358 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2359 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2360 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2361}
2362
Alec Mouri80863a62019-01-17 15:19:35 -08002363TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002364 sp<SurfaceControl> layer;
2365 ASSERT_NO_FATAL_FAILURE(
2366 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2367
2368 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2369
Alec Mouri80863a62019-01-17 15:19:35 -08002370 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002371 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2372 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2373}
2374
Alec Mouri80863a62019-01-17 15:19:35 -08002375TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002376 sp<SurfaceControl> layer;
2377 ASSERT_NO_FATAL_FAILURE(
2378 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2379
2380 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2381
2382 {
2383 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002384 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002385 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2386 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2387 }
2388
2389 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2390
2391 {
2392 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002393 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002394 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2395 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2396 }
2397
2398 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2399
2400 {
2401 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002402 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002403 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2404 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2405 }
2406}
2407
Alec Mouri80863a62019-01-17 15:19:35 -08002408TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002409 sp<SurfaceControl> layer1;
2410 ASSERT_NO_FATAL_FAILURE(
2411 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2412
2413 sp<SurfaceControl> layer2;
2414 ASSERT_NO_FATAL_FAILURE(
2415 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2416
2417 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2418
Marissa Wall861616d2018-10-22 12:52:23 -07002419 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002420 {
2421 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002422 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002423 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2424 }
2425
2426 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2427
Marissa Wall861616d2018-10-22 12:52:23 -07002428 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002429 {
2430 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002431 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002432 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2433 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2434 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2435 }
2436
2437 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2438 {
2439 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002440 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002441 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2442 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2443 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2444 }
2445
2446 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2447
2448 {
2449 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002450 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002451 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2452 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2453 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2454 }
2455}
2456
Valerie Haua6b15a12019-02-05 14:16:30 -08002457TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002458 sp<SurfaceControl> layer;
2459 ASSERT_NO_FATAL_FAILURE(
2460 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2461
2462 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2463
2464 std::array<sp<GraphicBuffer>, 10> buffers;
2465
2466 size_t idx = 0;
2467 for (auto& buffer : buffers) {
2468 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2469 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2470 BufferUsage::COMPOSER_OVERLAY,
2471 "test");
2472 Color color = colors[idx % colors.size()];
2473 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2474 idx++;
2475 }
2476
2477 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2478 // cache is working.
2479 idx = 0;
2480 for (auto& buffer : buffers) {
2481 for (int i = 0; i < 2; i++) {
2482 Transaction().setBuffer(layer, buffer).apply();
2483
2484 Color color = colors[idx % colors.size()];
2485 auto shot = screenshot();
2486 shot->expectColor(Rect(0, 0, 32, 32), color);
2487 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2488 }
2489 idx++;
2490 }
2491}
2492
Valerie Haua6b15a12019-02-05 14:16:30 -08002493TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002494 sp<SurfaceControl> layer;
2495 ASSERT_NO_FATAL_FAILURE(
2496 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2497
2498 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2499
2500 std::array<sp<GraphicBuffer>, 70> buffers;
2501
2502 size_t idx = 0;
2503 for (auto& buffer : buffers) {
2504 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2505 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2506 BufferUsage::COMPOSER_OVERLAY,
2507 "test");
2508 Color color = colors[idx % colors.size()];
2509 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2510 idx++;
2511 }
2512
2513 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2514 // cache is working.
2515 idx = 0;
2516 for (auto& buffer : buffers) {
2517 for (int i = 0; i < 2; i++) {
2518 Transaction().setBuffer(layer, buffer).apply();
2519
2520 Color color = colors[idx % colors.size()];
2521 auto shot = screenshot();
2522 shot->expectColor(Rect(0, 0, 32, 32), color);
2523 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2524 }
2525 idx++;
2526 }
2527}
2528
Valerie Haua6b15a12019-02-05 14:16:30 -08002529TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002530 sp<SurfaceControl> layer;
2531 ASSERT_NO_FATAL_FAILURE(
2532 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2533
2534 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2535
2536 std::array<sp<GraphicBuffer>, 65> buffers;
2537
2538 size_t idx = 0;
2539 for (auto& buffer : buffers) {
2540 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2541 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2542 BufferUsage::COMPOSER_OVERLAY,
2543 "test");
2544 Color color = colors[idx % colors.size()];
2545 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2546 idx++;
2547 }
2548
2549 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2550 // cache is working.
2551 idx = 0;
2552 for (auto& buffer : buffers) {
2553 for (int i = 0; i < 2; i++) {
2554 Transaction().setBuffer(layer, buffer).apply();
2555
2556 Color color = colors[idx % colors.size()];
2557 auto shot = screenshot();
2558 shot->expectColor(Rect(0, 0, 32, 32), color);
2559 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2560 }
2561 if (idx == 0) {
2562 buffers[0].clear();
2563 }
2564 idx++;
2565 }
2566}
2567
Alec Mouri80863a62019-01-17 15:19:35 -08002568TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002569 sp<SurfaceControl> layer;
2570 ASSERT_NO_FATAL_FAILURE(
2571 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2572
2573 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2574 Color::BLUE, Color::WHITE));
2575
Marissa Wall861616d2018-10-22 12:52:23 -07002576 Transaction()
2577 .setFrame(layer, Rect(0, 0, 32, 32))
2578 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2579 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002580
Alec Mouri80863a62019-01-17 15:19:35 -08002581 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2582 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002583}
2584
Alec Mouri80863a62019-01-17 15:19:35 -08002585TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002586 sp<SurfaceControl> layer;
2587 ASSERT_NO_FATAL_FAILURE(
2588 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2589
2590 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2591 Color::BLUE, Color::WHITE));
2592
Marissa Wall861616d2018-10-22 12:52:23 -07002593 Transaction()
2594 .setFrame(layer, Rect(0, 0, 32, 32))
2595 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2596 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002597
Alec Mouri80863a62019-01-17 15:19:35 -08002598 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2599 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002600}
2601
Alec Mouri80863a62019-01-17 15:19:35 -08002602TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002603 sp<SurfaceControl> layer;
2604 ASSERT_NO_FATAL_FAILURE(
2605 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2606
2607 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2608 Color::BLUE, Color::WHITE));
2609
Marissa Wall861616d2018-10-22 12:52:23 -07002610 Transaction()
2611 .setFrame(layer, Rect(0, 0, 32, 32))
2612 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2613 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002614
Alec Mouri80863a62019-01-17 15:19:35 -08002615 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2616 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002617}
2618
2619TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2620 sp<SurfaceControl> layer;
2621 ASSERT_NO_FATAL_FAILURE(
2622 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2623
2624 Transaction().setTransformToDisplayInverse(layer, false).apply();
2625
2626 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2627
2628 Transaction().setTransformToDisplayInverse(layer, true).apply();
2629}
2630
Alec Mouri80863a62019-01-17 15:19:35 -08002631TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002632 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002633 Transaction transaction;
2634 ASSERT_NO_FATAL_FAILURE(
2635 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2636
2637 sp<GraphicBuffer> buffer =
2638 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2639 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2640 BufferUsage::COMPOSER_OVERLAY,
2641 "test");
2642 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2643
2644 sp<Fence> fence;
2645 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2646 GTEST_SUCCEED() << "test not supported";
2647 return;
2648 }
2649
2650 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2651
2652 status_t status = fence->wait(1000);
2653 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2654 std::this_thread::sleep_for(200ms);
2655
Alec Mouri80863a62019-01-17 15:19:35 -08002656 auto shot = getScreenCapture();
Marissa Wall713b63f2018-10-17 15:42:43 -07002657 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2658 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2659}
2660
Alec Mouri80863a62019-01-17 15:19:35 -08002661TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002662 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002663 ASSERT_NO_FATAL_FAILURE(
2664 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2665
2666 sp<GraphicBuffer> buffer =
2667 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2668 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2669 BufferUsage::COMPOSER_OVERLAY,
2670 "test");
2671 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2672
Marissa Wallfda30bb2018-10-12 11:34:28 -07002673 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002674
2675 Transaction()
2676 .setBuffer(layer, buffer)
2677 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002678 .apply();
2679
Alec Mouri80863a62019-01-17 15:19:35 -08002680 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002681 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2682 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2683}
2684
Alec Mouri80863a62019-01-17 15:19:35 -08002685TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002686 sp<SurfaceControl> layer;
2687 ASSERT_NO_FATAL_FAILURE(
2688 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2689
2690 sp<GraphicBuffer> buffer =
2691 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2692 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2693 BufferUsage::COMPOSER_OVERLAY,
2694 "test");
2695 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2696
2697 Transaction()
2698 .setBuffer(layer, buffer)
2699 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002700 .apply();
2701
Alec Mouri80863a62019-01-17 15:19:35 -08002702 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002703 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2704 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2705}
2706
Alec Mouri80863a62019-01-17 15:19:35 -08002707TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002708 sp<SurfaceControl> layer;
2709 ASSERT_NO_FATAL_FAILURE(
2710 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2711
2712 sp<GraphicBuffer> buffer =
2713 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2714 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2715 BufferUsage::COMPOSER_OVERLAY,
2716 "test");
2717 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2718
2719 HdrMetadata hdrMetadata;
2720 hdrMetadata.validTypes = 0;
2721 Transaction()
2722 .setBuffer(layer, buffer)
2723 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002724 .apply();
2725
Alec Mouri80863a62019-01-17 15:19:35 -08002726 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002727 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2728 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2729}
2730
Alec Mouri80863a62019-01-17 15:19:35 -08002731TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002732 sp<SurfaceControl> layer;
2733 ASSERT_NO_FATAL_FAILURE(
2734 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2735
2736 sp<GraphicBuffer> buffer =
2737 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2738 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2739 BufferUsage::COMPOSER_OVERLAY,
2740 "test");
2741 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2742
2743 Region region;
2744 region.set(32, 32);
2745 Transaction()
2746 .setBuffer(layer, buffer)
2747 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002748 .apply();
2749
Alec Mouri80863a62019-01-17 15:19:35 -08002750 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002751 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2752 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2753}
2754
Alec Mouri80863a62019-01-17 15:19:35 -08002755TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002756 sp<SurfaceControl> layer;
2757 ASSERT_NO_FATAL_FAILURE(
2758 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2759
2760 sp<GraphicBuffer> buffer =
2761 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2762 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2763 BufferUsage::COMPOSER_OVERLAY,
2764 "test");
2765 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2766
2767 Transaction()
2768 .setBuffer(layer, buffer)
2769 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002770 .apply();
2771
Alec Mouri80863a62019-01-17 15:19:35 -08002772 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002773 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2774 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2775}
2776
2777TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2778 sp<SurfaceControl> layer;
2779 ASSERT_NO_FATAL_FAILURE(
2780 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2781
2782 // verify this doesn't cause a crash
2783 Transaction().setSidebandStream(layer, nullptr).apply();
2784}
2785
Robert Carr54cf5b12019-01-25 14:02:28 -08002786TEST_F(LayerTransactionTest, ReparentToSelf) {
2787 sp<SurfaceControl> layer;
2788 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2789 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2790 Transaction().reparent(layer, layer->getHandle()).apply();
2791
2792 {
2793 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2794 // to still be functioning.
2795 SCOPED_TRACE("after reparent to self");
2796 const Rect rect(0, 0, 32, 32);
2797 auto shot = screenshot();
2798 shot->expectColor(rect, Color::RED);
2799 shot->expectBorder(rect, Color::BLACK);
2800 }
2801}
2802
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002803class ColorTransformHelper {
2804public:
2805 static void DegammaColorSingle(half& s) {
2806 if (s <= 0.03928f)
2807 s = s / 12.92f;
2808 else
2809 s = pow((s + 0.055f) / 1.055f, 2.4f);
2810 }
2811
2812 static void DegammaColor(half3& color) {
2813 DegammaColorSingle(color.r);
2814 DegammaColorSingle(color.g);
2815 DegammaColorSingle(color.b);
2816 }
2817
2818 static void GammaColorSingle(half& s) {
2819 if (s <= 0.0031308f) {
2820 s = s * 12.92f;
2821 } else {
2822 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2823 }
2824 }
2825
2826 static void GammaColor(half3& color) {
2827 GammaColorSingle(color.r);
2828 GammaColorSingle(color.g);
2829 GammaColorSingle(color.b);
2830 }
2831
2832 static void applyMatrix(half3& color, const mat3& mat) {
2833 half3 ret = half3(0);
2834
2835 for (int i = 0; i < 3; i++) {
2836 for (int j = 0; j < 3; j++) {
2837 ret[i] = ret[i] + color[j] * mat[j][i];
2838 }
2839 }
2840 color = ret;
2841 }
2842};
2843
Alec Mouri80863a62019-01-17 15:19:35 -08002844TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002845 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002846 ASSERT_NO_FATAL_FAILURE(colorLayer =
2847 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2848 ISurfaceComposerClient::eFXSurfaceColor));
2849 Transaction()
2850 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2851 .setLayer(colorLayer, mLayerZBase + 1)
2852 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002853 {
2854 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002855 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002856 }
2857
2858 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002859 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002860 mat3 matrix;
2861 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2862 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2863 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002864
2865 // degamma before applying the matrix
2866 if (mColorManagementUsed) {
2867 ColorTransformHelper::DegammaColor(expected);
2868 }
2869
2870 ColorTransformHelper::applyMatrix(expected, matrix);
2871
2872 if (mColorManagementUsed) {
2873 ColorTransformHelper::GammaColor(expected);
2874 }
2875
2876 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2877 uint8_t(expected.b * 255), 255};
2878
2879 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2880 // channel) should be less than one
2881 const uint8_t tolerance = 1;
2882
Peiyong Lind3788632018-09-18 16:01:31 -07002883 Transaction().setColor(colorLayer, color)
2884 .setColorTransform(colorLayer, matrix, vec3()).apply();
2885 {
2886 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002887 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002888 }
2889}
2890
Alec Mouri80863a62019-01-17 15:19:35 -08002891TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002892 sp<SurfaceControl> parentLayer;
2893 sp<SurfaceControl> colorLayer;
2894 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2895 0 /* buffer height */,
2896 ISurfaceComposerClient::eFXSurfaceContainer));
2897 ASSERT_NO_FATAL_FAILURE(
2898 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2899 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2900
2901 Transaction()
2902 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2903 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2904 .setLayer(parentLayer, mLayerZBase + 1)
2905 .apply();
2906 {
2907 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002908 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002909 }
2910
2911 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2912 half3 expected = color;
2913 mat3 matrix;
2914 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2915 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2916 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2917
2918 // degamma before applying the matrix
2919 if (mColorManagementUsed) {
2920 ColorTransformHelper::DegammaColor(expected);
2921 }
2922
2923 ColorTransformHelper::applyMatrix(expected, matrix);
2924
2925 if (mColorManagementUsed) {
2926 ColorTransformHelper::GammaColor(expected);
2927 }
2928
2929 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2930 uint8_t(expected.b * 255), 255};
2931
2932 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2933 // channel) should be less than one
2934 const uint8_t tolerance = 1;
2935
2936 Transaction()
2937 .setColor(colorLayer, color)
2938 .setColorTransform(parentLayer, matrix, vec3())
2939 .apply();
2940 {
2941 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002942 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002943 }
2944}
2945
Alec Mouri80863a62019-01-17 15:19:35 -08002946TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002947 sp<SurfaceControl> parentLayer;
2948 sp<SurfaceControl> colorLayer;
2949 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2950 0 /* buffer height */,
2951 ISurfaceComposerClient::eFXSurfaceContainer));
2952 ASSERT_NO_FATAL_FAILURE(
2953 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2954 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2955
2956 Transaction()
2957 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2958 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2959 .setLayer(parentLayer, mLayerZBase + 1)
2960 .apply();
2961 {
2962 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002963 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002964 }
2965
2966 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2967 half3 expected = color;
2968 mat3 matrixChild;
2969 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2970 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2971 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2972 mat3 matrixParent;
2973 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2974 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2975 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2976
2977 // degamma before applying the matrix
2978 if (mColorManagementUsed) {
2979 ColorTransformHelper::DegammaColor(expected);
2980 }
2981
2982 ColorTransformHelper::applyMatrix(expected, matrixChild);
2983 ColorTransformHelper::applyMatrix(expected, matrixParent);
2984
2985 if (mColorManagementUsed) {
2986 ColorTransformHelper::GammaColor(expected);
2987 }
2988
2989 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2990 uint8_t(expected.b * 255), 255};
2991
2992 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2993 // channel) should be less than one
2994 const uint8_t tolerance = 1;
2995
2996 Transaction()
2997 .setColor(colorLayer, color)
2998 .setColorTransform(parentLayer, matrixParent, vec3())
2999 .setColorTransform(colorLayer, matrixChild, vec3())
3000 .apply();
3001 {
3002 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003003 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003004 }
3005}
3006
Marissa Wall80d94ad2019-01-18 16:04:36 -08003007struct CallbackData {
3008 CallbackData() = default;
3009 CallbackData(nsecs_t time, const sp<Fence>& fence,
3010 const std::vector<SurfaceControlStats>& stats)
3011 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3012
3013 nsecs_t latchTime;
3014 sp<Fence> presentFence;
3015 std::vector<SurfaceControlStats> surfaceControlStats;
3016};
3017
Marissa Wallfda30bb2018-10-12 11:34:28 -07003018class ExpectedResult {
3019public:
3020 enum Transaction {
3021 NOT_PRESENTED = 0,
3022 PRESENTED,
3023 };
3024
3025 enum Buffer {
3026 NOT_ACQUIRED = 0,
3027 ACQUIRED,
3028 };
3029
3030 enum PreviousBuffer {
3031 NOT_RELEASED = 0,
3032 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003033 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003034 };
3035
3036 void reset() {
3037 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3038 mExpectedSurfaceResults.clear();
3039 }
3040
3041 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003042 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003043 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3044 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003045 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003046 std::forward_as_tuple(bufferResult, previousBufferResult));
3047 }
3048
3049 void addSurfaces(ExpectedResult::Transaction transactionResult,
3050 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003051 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003052 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3053 for (const auto& layer : layers) {
3054 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3055 }
3056 }
3057
Marissa Wall17b4e452018-12-26 16:32:34 -08003058 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3059 mExpectedPresentTime = expectedPresentTime;
3060 }
3061
Marissa Wall80d94ad2019-01-18 16:04:36 -08003062 void verifyCallbackData(const CallbackData& callbackData) const {
3063 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003064 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3065 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003066 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003067 if (mExpectedPresentTime >= 0) {
3068 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3069 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3070 // if the panel is running at 30 hz, at the worst case, our expected time just
3071 // misses vsync and we have to wait another 33.3ms
3072 ASSERT_LE(presentFence->getSignalTime(),
3073 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3074 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003075 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003076 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003077 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3078 }
3079
Marissa Wall80d94ad2019-01-18 16:04:36 -08003080 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003081 << "wrong number of surfaces";
3082
Marissa Wall80d94ad2019-01-18 16:04:36 -08003083 for (const auto& stats : surfaceControlStats) {
3084 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3085
Marissa Wallfda30bb2018-10-12 11:34:28 -07003086 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3087 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3088 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003089 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003090 }
3091 }
3092
3093private:
3094 class ExpectedSurfaceResult {
3095 public:
3096 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3097 ExpectedResult::PreviousBuffer previousBufferResult)
3098 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3099
Marissa Wall80d94ad2019-01-18 16:04:36 -08003100 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3101 nsecs_t latchTime) const {
3102 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003103
3104 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3105 << "bad acquire time";
3106 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003107
3108 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3109 ASSERT_NE(previousReleaseFence, nullptr)
3110 << "failed to set release prev buffer fence";
3111 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3112 ASSERT_EQ(previousReleaseFence, nullptr)
3113 << "should not have set released prev buffer fence";
3114 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003115 }
3116
3117 private:
3118 ExpectedResult::Buffer mBufferResult;
3119 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3120 };
3121
Marissa Wall80d94ad2019-01-18 16:04:36 -08003122 struct SCHash {
3123 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3124 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003125 }
3126 };
3127 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003128 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003129 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003130};
3131
3132class CallbackHelper {
3133public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003134 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3135 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003136 if (!callbackContext) {
3137 ALOGE("failed to get callback context");
3138 }
3139 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3140 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003141 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003142 helper->mConditionVariable.notify_all();
3143 }
3144
Marissa Wall80d94ad2019-01-18 16:04:36 -08003145 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003146 std::unique_lock lock(mMutex);
3147
Marissa Wall80d94ad2019-01-18 16:04:36 -08003148 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003149 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3150 std::cv_status::timeout)
3151 << "did not receive callback";
3152 }
3153
Marissa Wall80d94ad2019-01-18 16:04:36 -08003154 *outData = std::move(mCallbackDataQueue.front());
3155 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003156 }
3157
3158 void verifyFinalState() {
3159 // Wait to see if there are extra callbacks
3160 std::this_thread::sleep_for(500ms);
3161
3162 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003163 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3164 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003165 }
3166
3167 void* getContext() { return static_cast<void*>(this); }
3168
3169 std::mutex mMutex;
3170 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003171 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003172};
3173
3174class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003175public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003176 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003177 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003178 }
3179
Marissa Wall713b63f2018-10-17 15:42:43 -07003180 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003181 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3182 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003183 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003184 sp<GraphicBuffer> buffer;
3185 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003186 if (setBuffer) {
3187 int err = getBuffer(&buffer, &fence);
3188 if (err != NO_ERROR) {
3189 return err;
3190 }
3191
3192 transaction.setBuffer(layer, buffer);
3193 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003194 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003195
Valerie Hauaa194562019-02-05 16:21:38 -08003196 if (setBackgroundColor) {
3197 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3198 ui::Dataspace::UNKNOWN);
3199 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003200 }
3201
3202 transaction.addTransactionCompletedCallback(callbackHelper->function,
3203 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003204 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003205 }
3206
Marissa Wall861616d2018-10-22 12:52:23 -07003207 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3208 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003209 CallbackData callbackData;
3210 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3211 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003212
3213 if (finalState) {
3214 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3215 }
3216 }
3217
Marissa Wall861616d2018-10-22 12:52:23 -07003218 static void waitForCallbacks(CallbackHelper& helper,
3219 const std::vector<ExpectedResult>& expectedResults,
3220 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003221 for (const auto& expectedResult : expectedResults) {
3222 waitForCallback(helper, expectedResult);
3223 }
3224 if (finalState) {
3225 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3226 }
3227 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003228};
3229
Valerie Hauaa194562019-02-05 16:21:38 -08003230TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003231 sp<SurfaceControl> layer;
3232 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3233
3234 Transaction transaction;
3235 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003236 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003237 if (err) {
3238 GTEST_SUCCEED() << "test not supported";
3239 return;
3240 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003241
3242 transaction.apply();
3243
3244 ExpectedResult expected;
3245 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3246 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3247}
3248
Valerie Hauaa194562019-02-05 16:21:38 -08003249TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003250 sp<SurfaceControl> layer;
3251 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3252
3253 Transaction transaction;
3254 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003255 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003256 if (err) {
3257 GTEST_SUCCEED() << "test not supported";
3258 return;
3259 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003260
Marissa Wall861616d2018-10-22 12:52:23 -07003261 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003262
3263 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003264 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3265 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003266 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3267}
3268
Valerie Hauaa194562019-02-05 16:21:38 -08003269TEST_F(LayerCallbackTest, BufferNoColor) {
3270 sp<SurfaceControl> layer;
3271 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3272
3273 Transaction transaction;
3274 CallbackHelper callback;
3275 int err = fillTransaction(transaction, &callback, layer, true, false);
3276 if (err) {
3277 GTEST_SUCCEED() << "test not supported";
3278 return;
3279 }
3280
3281 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3282
3283 ExpectedResult expected;
3284 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3285 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3286}
3287
3288TEST_F(LayerCallbackTest, NoBufferColor) {
3289 sp<SurfaceControl> layer;
3290 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3291
3292 Transaction transaction;
3293 CallbackHelper callback;
3294 int err = fillTransaction(transaction, &callback, layer, false, true);
3295 if (err) {
3296 GTEST_SUCCEED() << "test not supported";
3297 return;
3298 }
3299
3300 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3301
3302 ExpectedResult expected;
3303 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3304 ExpectedResult::Buffer::NOT_ACQUIRED);
3305 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3306}
3307
Marissa Wallfda30bb2018-10-12 11:34:28 -07003308TEST_F(LayerCallbackTest, NoStateChange) {
3309 Transaction transaction;
3310 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003311 int err = fillTransaction(transaction, &callback);
3312 if (err) {
3313 GTEST_SUCCEED() << "test not supported";
3314 return;
3315 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003316
3317 transaction.apply();
3318
3319 ExpectedResult expected;
3320 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3321}
3322
3323TEST_F(LayerCallbackTest, OffScreen) {
3324 sp<SurfaceControl> layer;
3325 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3326
3327 Transaction transaction;
3328 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003329 int err = fillTransaction(transaction, &callback, layer);
3330 if (err) {
3331 GTEST_SUCCEED() << "test not supported";
3332 return;
3333 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003334
Marissa Wall861616d2018-10-22 12:52:23 -07003335 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003336
3337 ExpectedResult expected;
3338 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3339 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3340}
3341
Valerie Hauaa194562019-02-05 16:21:38 -08003342TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003343 sp<SurfaceControl> layer1, layer2;
3344 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3345 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3346
3347 Transaction transaction1, transaction2;
3348 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003349 int err = fillTransaction(transaction1, &callback1, layer1);
3350 if (err) {
3351 GTEST_SUCCEED() << "test not supported";
3352 return;
3353 }
3354 err = fillTransaction(transaction2, &callback2, layer2);
3355 if (err) {
3356 GTEST_SUCCEED() << "test not supported";
3357 return;
3358 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003359
Marissa Wall861616d2018-10-22 12:52:23 -07003360 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3361 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003362
3363 ExpectedResult expected;
3364 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3365 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3366 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3367}
3368
Valerie Hauaa194562019-02-05 16:21:38 -08003369TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3370 sp<SurfaceControl> layer1, layer2;
3371 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3372 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3373
3374 Transaction transaction1, transaction2;
3375 CallbackHelper callback1, callback2;
3376 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3377 if (err) {
3378 GTEST_SUCCEED() << "test not supported";
3379 return;
3380 }
3381 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3382 if (err) {
3383 GTEST_SUCCEED() << "test not supported";
3384 return;
3385 }
3386
3387 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3388 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3389
3390 ExpectedResult expected;
3391 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3392 ExpectedResult::Buffer::NOT_ACQUIRED);
3393 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3394 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3395}
3396
3397TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3398 sp<SurfaceControl> layer1, layer2;
3399 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3400 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3401
3402 Transaction transaction1, transaction2;
3403 CallbackHelper callback1, callback2;
3404 int err = fillTransaction(transaction1, &callback1, layer1);
3405 if (err) {
3406 GTEST_SUCCEED() << "test not supported";
3407 return;
3408 }
3409 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3410 if (err) {
3411 GTEST_SUCCEED() << "test not supported";
3412 return;
3413 }
3414
3415 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3416 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3417
3418 ExpectedResult expected;
3419 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3420 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3421 ExpectedResult::Buffer::NOT_ACQUIRED);
3422 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3423 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3424}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003425TEST_F(LayerCallbackTest, Merge_SameCallback) {
3426 sp<SurfaceControl> layer1, layer2;
3427 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3428 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3429
3430 Transaction transaction1, transaction2;
3431 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003432 int err = fillTransaction(transaction1, &callback, layer1);
3433 if (err) {
3434 GTEST_SUCCEED() << "test not supported";
3435 return;
3436 }
3437 err = fillTransaction(transaction2, &callback, layer2);
3438 if (err) {
3439 GTEST_SUCCEED() << "test not supported";
3440 return;
3441 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003442
3443 transaction2.merge(std::move(transaction1)).apply();
3444
3445 ExpectedResult expected;
3446 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3447 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3448 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3449}
3450
3451TEST_F(LayerCallbackTest, Merge_SameLayer) {
3452 sp<SurfaceControl> layer;
3453 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3454
3455 Transaction transaction1, transaction2;
3456 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003457 int err = fillTransaction(transaction1, &callback1, layer);
3458 if (err) {
3459 GTEST_SUCCEED() << "test not supported";
3460 return;
3461 }
3462 err = fillTransaction(transaction2, &callback2, layer);
3463 if (err) {
3464 GTEST_SUCCEED() << "test not supported";
3465 return;
3466 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003467
3468 transaction2.merge(std::move(transaction1)).apply();
3469
3470 ExpectedResult expected;
3471 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3472 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3473 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3474}
3475
Marissa Wallfda30bb2018-10-12 11:34:28 -07003476TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3477 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3478 client2(new SurfaceComposerClient);
3479
3480 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3481 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3482
3483 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003484 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003485 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003486 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003487 ISurfaceComposerClient::eFXSurfaceBufferState));
3488
3489 Transaction transaction1, transaction2;
3490 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003491 int err = fillTransaction(transaction1, &callback1, layer1);
3492 if (err) {
3493 GTEST_SUCCEED() << "test not supported";
3494 return;
3495 }
3496 err = fillTransaction(transaction2, &callback2, layer2);
3497 if (err) {
3498 GTEST_SUCCEED() << "test not supported";
3499 return;
3500 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003501
Marissa Wall861616d2018-10-22 12:52:23 -07003502 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3503 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003504
3505 ExpectedResult expected;
3506 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3507 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3508 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3509}
3510
3511TEST_F(LayerCallbackTest, MultipleTransactions) {
3512 sp<SurfaceControl> layer;
3513 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3514
3515 Transaction transaction;
3516 CallbackHelper callback;
3517 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003518 int err = fillTransaction(transaction, &callback, layer);
3519 if (err) {
3520 GTEST_SUCCEED() << "test not supported";
3521 return;
3522 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003523
3524 transaction.apply();
3525
3526 ExpectedResult expected;
3527 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003528 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003529 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3530 : ExpectedResult::PreviousBuffer::RELEASED);
3531 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3532 }
3533 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3534}
3535
3536TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3537 sp<SurfaceControl> layer;
3538 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3539
3540 Transaction transaction;
3541 CallbackHelper callback;
3542 for (size_t i = 0; i < 10; i++) {
3543 ExpectedResult expected;
3544
3545 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003546 int err = fillTransaction(transaction, &callback, layer);
3547 if (err) {
3548 GTEST_SUCCEED() << "test not supported";
3549 return;
3550 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003551 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3552 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003553 int err = fillTransaction(transaction, &callback);
3554 if (err) {
3555 GTEST_SUCCEED() << "test not supported";
3556 return;
3557 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003558 }
3559
3560 transaction.apply();
3561
3562 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3563 }
3564 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3565}
3566
3567TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3568 sp<SurfaceControl> layer;
3569 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3570
3571 Transaction transaction;
3572 CallbackHelper callback;
3573 for (size_t i = 0; i < 10; i++) {
3574 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003575 int err = fillTransaction(transaction, &callback, layer);
3576 if (err) {
3577 GTEST_SUCCEED() << "test not supported";
3578 return;
3579 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003580 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003581 int err = fillTransaction(transaction, &callback);
3582 if (err) {
3583 GTEST_SUCCEED() << "test not supported";
3584 return;
3585 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003586 }
3587
Marissa Wall861616d2018-10-22 12:52:23 -07003588 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003589
3590 ExpectedResult expected;
3591 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3592 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003593 layer,
3594 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3595 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003596 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3597 }
3598 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3599}
3600
3601TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3602 sp<SurfaceControl> layer1, layer2;
3603 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3604 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3605
3606 Transaction transaction1, transaction2;
3607 CallbackHelper callback1, callback2;
3608 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003609 int err = fillTransaction(transaction1, &callback1, layer1);
3610 if (err) {
3611 GTEST_SUCCEED() << "test not supported";
3612 return;
3613 }
3614 err = fillTransaction(transaction2, &callback2, layer2);
3615 if (err) {
3616 GTEST_SUCCEED() << "test not supported";
3617 return;
3618 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003619
Marissa Wall861616d2018-10-22 12:52:23 -07003620 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3621 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003622
3623 ExpectedResult expected;
3624 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003625 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003626 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3627 : ExpectedResult::PreviousBuffer::RELEASED);
3628 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3629 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3630 }
3631 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3632 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3633}
3634
3635TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3636 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3637 client2(new SurfaceComposerClient);
3638 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3639 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3640
3641 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003642 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003643 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003644 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003645 ISurfaceComposerClient::eFXSurfaceBufferState));
3646
3647 Transaction transaction1, transaction2;
3648 CallbackHelper callback1, callback2;
3649 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003650 int err = fillTransaction(transaction1, &callback1, layer1);
3651 if (err) {
3652 GTEST_SUCCEED() << "test not supported";
3653 return;
3654 }
3655 err = fillTransaction(transaction2, &callback2, layer2);
3656 if (err) {
3657 GTEST_SUCCEED() << "test not supported";
3658 return;
3659 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003660
Marissa Wall861616d2018-10-22 12:52:23 -07003661 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3662 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003663
3664 ExpectedResult expected;
3665 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003666 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003667 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3668 : ExpectedResult::PreviousBuffer::RELEASED);
3669 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3670 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3671 }
3672 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3673 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3674}
3675
3676TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3677 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3678 client2(new SurfaceComposerClient);
3679 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3680 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3681
3682 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003683 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003684 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003685 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003686 ISurfaceComposerClient::eFXSurfaceBufferState));
3687
3688 Transaction transaction1, transaction2;
3689 CallbackHelper callback1, callback2;
3690
3691 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003692 int err = fillTransaction(transaction1, &callback1, layer1);
3693 if (err) {
3694 GTEST_SUCCEED() << "test not supported";
3695 return;
3696 }
3697 err = fillTransaction(transaction2, &callback2, layer2);
3698 if (err) {
3699 GTEST_SUCCEED() << "test not supported";
3700 return;
3701 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003702
Marissa Wall861616d2018-10-22 12:52:23 -07003703 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3704 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003705
3706 ExpectedResult expected;
3707 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3708 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3709 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3710 expected.reset();
3711
3712 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003713 err = fillTransaction(transaction1, &callback1);
3714 if (err) {
3715 GTEST_SUCCEED() << "test not supported";
3716 return;
3717 }
3718 err = fillTransaction(transaction2, &callback2);
3719 if (err) {
3720 GTEST_SUCCEED() << "test not supported";
3721 return;
3722 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003723
3724 transaction2.merge(std::move(transaction1)).apply();
3725
3726 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3727 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3728}
3729
3730TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3731 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3732 client2(new SurfaceComposerClient);
3733
3734 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3735 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3736
3737 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003738 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003739 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003740 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003741 ISurfaceComposerClient::eFXSurfaceBufferState));
3742
3743 Transaction transaction1, transaction2;
3744 CallbackHelper callback1, callback2;
3745
3746 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003747 int err = fillTransaction(transaction1, &callback1, layer1);
3748 if (err) {
3749 GTEST_SUCCEED() << "test not supported";
3750 return;
3751 }
3752 err = fillTransaction(transaction2, &callback2, layer2);
3753 if (err) {
3754 GTEST_SUCCEED() << "test not supported";
3755 return;
3756 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003757
Marissa Wall861616d2018-10-22 12:52:23 -07003758 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3759 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003760
3761 ExpectedResult expected;
3762 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3763 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3764 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3765 expected.reset();
3766
3767 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003768 err = fillTransaction(transaction1, &callback1);
3769 if (err) {
3770 GTEST_SUCCEED() << "test not supported";
3771 return;
3772 }
3773 err = fillTransaction(transaction2, &callback2);
3774 if (err) {
3775 GTEST_SUCCEED() << "test not supported";
3776 return;
3777 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003778
Marissa Wall861616d2018-10-22 12:52:23 -07003779 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003780
Marissa Wall713b63f2018-10-17 15:42:43 -07003781 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3782 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003783 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3784 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3785}
3786
3787TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3788 sp<SurfaceControl> layer;
3789 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3790
3791 Transaction transaction;
3792 CallbackHelper callback;
3793 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003794 for (auto& expected : expectedResults) {
3795 expected.reset();
3796 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003797 ExpectedResult::Buffer::ACQUIRED,
3798 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003799
Marissa Wall713b63f2018-10-17 15:42:43 -07003800 int err = fillTransaction(transaction, &callback, layer);
3801 if (err) {
3802 GTEST_SUCCEED() << "test not supported";
3803 return;
3804 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003805
3806 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003807 }
3808 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3809}
3810
3811TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3812 sp<SurfaceControl> layer;
3813 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3814
Marissa Wall713b63f2018-10-17 15:42:43 -07003815 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003816 Transaction transaction;
3817 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003818 int err = fillTransaction(transaction, &callback, layer);
3819 if (err) {
3820 GTEST_SUCCEED() << "test not supported";
3821 return;
3822 }
3823
3824 transaction.apply();
3825
3826 ExpectedResult expected;
3827 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3828 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3829
3830 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003831 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003832 for (auto& expected : expectedResults) {
3833 expected.reset();
3834
Marissa Wall713b63f2018-10-17 15:42:43 -07003835 err = fillTransaction(transaction, &callback);
3836 if (err) {
3837 GTEST_SUCCEED() << "test not supported";
3838 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003839 }
3840
3841 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003842 }
3843 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3844}
3845
3846TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3847 sp<SurfaceControl> layer;
3848 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3849
3850 // Normal call to set up test
3851 Transaction transaction;
3852 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003853 int err = fillTransaction(transaction, &callback, layer);
3854 if (err) {
3855 GTEST_SUCCEED() << "test not supported";
3856 return;
3857 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003858
Marissa Wall861616d2018-10-22 12:52:23 -07003859 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003860
3861 ExpectedResult expectedResult;
3862 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3863 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3864
3865 // Test
3866 std::vector<ExpectedResult> expectedResults(50);
3867 for (auto& expected : expectedResults) {
3868 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003869 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3870 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003871
Marissa Wall713b63f2018-10-17 15:42:43 -07003872 err = fillTransaction(transaction, &callback);
3873 if (err) {
3874 GTEST_SUCCEED() << "test not supported";
3875 return;
3876 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003877
Marissa Wall861616d2018-10-22 12:52:23 -07003878 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003879 }
3880 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3881}
3882
Marissa Wall17b4e452018-12-26 16:32:34 -08003883TEST_F(LayerCallbackTest, DesiredPresentTime) {
3884 sp<SurfaceControl> layer;
3885 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3886
3887 Transaction transaction;
3888 CallbackHelper callback;
3889 int err = fillTransaction(transaction, &callback, layer);
3890 if (err) {
3891 GTEST_SUCCEED() << "test not supported";
3892 return;
3893 }
3894
3895 // Try to present 100ms in the future
3896 nsecs_t time = systemTime() + (100 * 1e6);
3897
3898 transaction.setDesiredPresentTime(time);
3899 transaction.apply();
3900
3901 ExpectedResult expected;
3902 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3903 expected.addExpectedPresentTime(time);
3904 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3905}
3906
3907TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3908 sp<SurfaceControl> layer;
3909 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3910
3911 Transaction transaction;
3912 CallbackHelper callback1;
3913 int err = fillTransaction(transaction, &callback1, layer);
3914 if (err) {
3915 GTEST_SUCCEED() << "test not supported";
3916 return;
3917 }
3918
3919 // Try to present 100ms in the future
3920 nsecs_t time = systemTime() + (100 * 1e6);
3921
3922 transaction.setDesiredPresentTime(time);
3923 transaction.apply();
3924
3925 ExpectedResult expected1;
3926 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3927 expected1.addExpectedPresentTime(time);
3928
3929 CallbackHelper callback2;
3930 err = fillTransaction(transaction, &callback2, layer);
3931 if (err) {
3932 GTEST_SUCCEED() << "test not supported";
3933 return;
3934 }
3935
3936 // Try to present 33ms after the first frame
3937 time += (33.3 * 1e6);
3938
3939 transaction.setDesiredPresentTime(time);
3940 transaction.apply();
3941
3942 ExpectedResult expected2;
3943 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3944 ExpectedResult::Buffer::ACQUIRED,
3945 ExpectedResult::PreviousBuffer::RELEASED);
3946 expected2.addExpectedPresentTime(time);
3947
3948 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3949 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3950}
3951
3952TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3953 sp<SurfaceControl> layer;
3954 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3955
3956 Transaction transaction;
3957 CallbackHelper callback1;
3958 int err = fillTransaction(transaction, &callback1, layer);
3959 if (err) {
3960 GTEST_SUCCEED() << "test not supported";
3961 return;
3962 }
3963
3964 // Try to present 100ms in the future
3965 nsecs_t time = systemTime() + (100 * 1e6);
3966
3967 transaction.setDesiredPresentTime(time);
3968 transaction.apply();
3969
3970 ExpectedResult expected1;
3971 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3972 expected1.addExpectedPresentTime(time);
3973
3974 CallbackHelper callback2;
3975 err = fillTransaction(transaction, &callback2, layer);
3976 if (err) {
3977 GTEST_SUCCEED() << "test not supported";
3978 return;
3979 }
3980
3981 // Try to present 33ms before the previous frame
3982 time -= (33.3 * 1e6);
3983
3984 transaction.setDesiredPresentTime(time);
3985 transaction.apply();
3986
3987 ExpectedResult expected2;
3988 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3989 ExpectedResult::Buffer::ACQUIRED,
3990 ExpectedResult::PreviousBuffer::RELEASED);
3991
3992 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3993 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3994}
3995
3996TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
3997 sp<SurfaceControl> layer;
3998 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3999
4000 Transaction transaction;
4001 CallbackHelper callback;
4002 int err = fillTransaction(transaction, &callback, layer);
4003 if (err) {
4004 GTEST_SUCCEED() << "test not supported";
4005 return;
4006 }
4007
4008 // Try to present 100ms in the past
4009 nsecs_t time = systemTime() - (100 * 1e6);
4010
4011 transaction.setDesiredPresentTime(time);
4012 transaction.apply();
4013
4014 ExpectedResult expected;
4015 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4016 expected.addExpectedPresentTime(systemTime());
4017 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4018}
4019
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004020class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004021protected:
4022 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004023 LayerTransactionTest::SetUp();
4024 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004025
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004026 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4027 ASSERT_FALSE(display == nullptr);
4028
Mathias Agopianc666cae2012-07-25 18:56:13 -07004029 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004030 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004031
4032 ssize_t displayWidth = info.w;
4033 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004034
4035 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004036 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4037 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004038 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004039 ASSERT_TRUE(mBGSurfaceControl->isValid());
4040 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4041
4042 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004043 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4044
Peiyong Lin566a3b42018-01-09 18:22:43 -08004045 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004046 ASSERT_TRUE(mFGSurfaceControl->isValid());
4047
4048 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4049
4050 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004051 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004052 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004053 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4054
4055 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4056
Robert Carr4cdc58f2017-08-23 14:22:20 -07004057 asTransaction([&](Transaction& t) {
4058 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004059
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004060 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004061
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004062 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4063 .setPosition(mFGSurfaceControl, 64, 64)
4064 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004065
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004066 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4067 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4068 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004069 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004070 }
4071
4072 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004073 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004074 mBGSurfaceControl = 0;
4075 mFGSurfaceControl = 0;
4076 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004077 }
4078
4079 void waitForPostedBuffers() {
4080 // Since the sync surface is in synchronous mode (i.e. double buffered)
4081 // posting three buffers to it should ensure that at least two
4082 // SurfaceFlinger::handlePageFlip calls have been made, which should
4083 // guaranteed that a buffer posted to another Surface has been retired.
4084 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4085 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4086 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4087 }
4088
Robert Carr4cdc58f2017-08-23 14:22:20 -07004089 void asTransaction(const std::function<void(Transaction&)>& exec) {
4090 Transaction t;
4091 exec(t);
4092 t.apply(true);
4093 }
4094
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004095 sp<SurfaceControl> mBGSurfaceControl;
4096 sp<SurfaceControl> mFGSurfaceControl;
4097
4098 // This surface is used to ensure that the buffers posted to
4099 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4100 sp<SurfaceControl> mSyncSurfaceControl;
4101};
4102
Robert Carr7f619b22017-11-06 12:56:35 -08004103TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004104
chaviw0e3479f2018-09-10 16:49:30 -07004105 std::unique_ptr<ScreenCapture> sc;
4106
4107 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004108 fillSurfaceRGBA8(relative, 10, 10, 10);
4109 waitForPostedBuffers();
4110
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004111 Transaction{}
4112 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004113 .setPosition(relative, 64, 64)
4114 .apply();
4115
4116 {
4117 // The relative should be on top of the FG control.
4118 ScreenCapture::captureScreen(&sc);
4119 sc->checkPixel(64, 64, 10, 10, 10);
4120 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004121 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004122
4123 {
4124 // Nothing should change at this point.
4125 ScreenCapture::captureScreen(&sc);
4126 sc->checkPixel(64, 64, 10, 10, 10);
4127 }
4128
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004129 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004130
4131 {
4132 // Ensure that the relative was actually hidden, rather than
4133 // being left in the detached but visible state.
4134 ScreenCapture::captureScreen(&sc);
4135 sc->expectFGColor(64, 64);
4136 }
4137}
4138
Robert Carr8d5227b2017-03-16 15:41:03 -07004139class GeometryLatchingTest : public LayerUpdateTest {
4140protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004141 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004142 SCOPED_TRACE(trace);
4143 ScreenCapture::captureScreen(&sc);
4144 // We find the leading edge of the FG surface.
4145 sc->expectFGColor(127, 127);
4146 sc->expectBGColor(128, 128);
4147 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004148
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004149 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004150
4151 void unlockFGBuffer() {
4152 sp<Surface> s = mFGSurfaceControl->getSurface();
4153 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4154 waitForPostedBuffers();
4155 }
4156
Robert Carr8d5227b2017-03-16 15:41:03 -07004157 void completeFGResize() {
4158 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4159 waitForPostedBuffers();
4160 }
4161 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004162 asTransaction([&](Transaction& t) {
4163 t.setSize(mFGSurfaceControl, 64, 64);
4164 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004165 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004166 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004167
4168 EXPECT_INITIAL_STATE("After restoring initial state");
4169 }
chaviw0e3479f2018-09-10 16:49:30 -07004170 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004171};
4172
Robert Carr8d5227b2017-03-16 15:41:03 -07004173class CropLatchingTest : public GeometryLatchingTest {
4174protected:
4175 void EXPECT_CROPPED_STATE(const char* trace) {
4176 SCOPED_TRACE(trace);
4177 ScreenCapture::captureScreen(&sc);
4178 // The edge should be moved back one pixel by our crop.
4179 sc->expectFGColor(126, 126);
4180 sc->expectBGColor(127, 127);
4181 sc->expectBGColor(128, 128);
4182 }
chaviw59f5c562017-06-28 16:39:06 -07004183
4184 void EXPECT_RESIZE_STATE(const char* trace) {
4185 SCOPED_TRACE(trace);
4186 ScreenCapture::captureScreen(&sc);
4187 // The FG is now resized too 128,128 at 64,64
4188 sc->expectFGColor(64, 64);
4189 sc->expectFGColor(191, 191);
4190 sc->expectBGColor(192, 192);
4191 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004192};
4193
Pablo Ceballos05289c22016-04-14 15:49:55 -07004194TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004195 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004196 {
4197 SCOPED_TRACE("before anything");
4198 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004199 sc->expectBGColor(32, 32);
4200 sc->expectFGColor(96, 96);
4201 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004202 }
4203
4204 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004205 asTransaction([&](Transaction& t) {
4206 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004207 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4208 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004209 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004210
Robert Carr4cdc58f2017-08-23 14:22:20 -07004211 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004212 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004213 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4214 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004215 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004216
4217 {
4218 SCOPED_TRACE("before any trigger");
4219 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004220 sc->expectBGColor(32, 32);
4221 sc->expectFGColor(96, 96);
4222 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004223 }
4224
4225 // should trigger the first deferred transaction, but not the second one
4226 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4227 {
4228 SCOPED_TRACE("after first trigger");
4229 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004230 sc->expectBGColor(32, 32);
4231 sc->checkPixel(96, 96, 162, 63, 96);
4232 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004233 }
4234
4235 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004236 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004237
4238 // trigger the second deferred transaction
4239 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4240 {
4241 SCOPED_TRACE("after second trigger");
4242 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004243 sc->expectBGColor(32, 32);
4244 sc->expectBGColor(96, 96);
4245 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004246 }
4247}
4248
Robert Carre392b552017-09-19 12:16:05 -07004249TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004250 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004251
4252 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004253 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4254 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4255 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4256 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004257 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004258 SurfaceComposerClient::Transaction{}
4259 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4260 .show(childNoBuffer)
4261 .show(childBuffer)
4262 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004263 {
4264 ScreenCapture::captureScreen(&sc);
4265 sc->expectChildColor(73, 73);
4266 sc->expectFGColor(74, 74);
4267 }
Vishnu Nair60356342018-11-13 13:00:45 -08004268 SurfaceComposerClient::Transaction{}
4269 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4270 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004271 {
4272 ScreenCapture::captureScreen(&sc);
4273 sc->expectChildColor(73, 73);
4274 sc->expectChildColor(74, 74);
4275 }
4276}
4277
Robert Carr2c5f6d22017-09-26 12:30:35 -07004278TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004279 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004280 {
4281 SCOPED_TRACE("before move");
4282 ScreenCapture::captureScreen(&sc);
4283 sc->expectBGColor(0, 12);
4284 sc->expectFGColor(75, 75);
4285 sc->expectBGColor(145, 145);
4286 }
4287
4288 Transaction t1, t2;
4289 t1.setPosition(mFGSurfaceControl, 128, 128);
4290 t2.setPosition(mFGSurfaceControl, 0, 0);
4291 // We expect that the position update from t2 now
4292 // overwrites the position update from t1.
4293 t1.merge(std::move(t2));
4294 t1.apply();
4295
4296 {
4297 ScreenCapture::captureScreen(&sc);
4298 sc->expectFGColor(1, 1);
4299 }
4300}
4301
Robert Carr1f0a16a2016-10-24 16:27:39 -07004302class ChildLayerTest : public LayerUpdateTest {
4303protected:
4304 void SetUp() override {
4305 LayerUpdateTest::SetUp();
Vishnu Nair88a11f22018-11-28 18:30:57 -08004306 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
4307 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004308 fillSurfaceRGBA8(mChild, 200, 200, 200);
4309
4310 {
4311 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004312 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004313 mCapture->expectChildColor(64, 64);
4314 }
4315 }
4316 void TearDown() override {
4317 LayerUpdateTest::TearDown();
4318 mChild = 0;
4319 }
4320
4321 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004322 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004323};
4324
4325TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004326 asTransaction([&](Transaction& t) {
4327 t.show(mChild);
4328 t.setPosition(mChild, 10, 10);
4329 t.setPosition(mFGSurfaceControl, 64, 64);
4330 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004331
4332 {
chaviw0e3479f2018-09-10 16:49:30 -07004333 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004334 // Top left of foreground must now be visible
4335 mCapture->expectFGColor(64, 64);
4336 // But 10 pixels in we should see the child surface
4337 mCapture->expectChildColor(74, 74);
4338 // And 10 more pixels we should be back to the foreground surface
4339 mCapture->expectFGColor(84, 84);
4340 }
4341
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004342 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004343
4344 {
chaviw0e3479f2018-09-10 16:49:30 -07004345 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004346 // Top left of foreground should now be at 0, 0
4347 mCapture->expectFGColor(0, 0);
4348 // But 10 pixels in we should see the child surface
4349 mCapture->expectChildColor(10, 10);
4350 // And 10 more pixels we should be back to the foreground surface
4351 mCapture->expectFGColor(20, 20);
4352 }
4353}
4354
Robert Carr41b08b52017-06-01 16:11:34 -07004355TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004356 asTransaction([&](Transaction& t) {
4357 t.show(mChild);
4358 t.setPosition(mChild, 0, 0);
4359 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004360 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004361 });
Robert Carr41b08b52017-06-01 16:11:34 -07004362
4363 {
chaviw0e3479f2018-09-10 16:49:30 -07004364 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004365 mCapture->expectChildColor(0, 0);
4366 mCapture->expectChildColor(4, 4);
4367 mCapture->expectBGColor(5, 5);
4368 }
4369}
4370
Robert Carr1f0a16a2016-10-24 16:27:39 -07004371TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004372 asTransaction([&](Transaction& t) {
4373 t.show(mChild);
4374 t.setPosition(mFGSurfaceControl, 0, 0);
4375 t.setPosition(mChild, 63, 63);
4376 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004377
4378 {
chaviw0e3479f2018-09-10 16:49:30 -07004379 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004380 mCapture->expectFGColor(0, 0);
4381 // Last pixel in foreground should now be the child.
4382 mCapture->expectChildColor(63, 63);
4383 // But the child should be constrained and the next pixel
4384 // must be the background
4385 mCapture->expectBGColor(64, 64);
4386 }
4387}
4388
4389TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004390 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004391
4392 // Find the boundary between the parent and child
4393 {
chaviw0e3479f2018-09-10 16:49:30 -07004394 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004395 mCapture->expectChildColor(9, 9);
4396 mCapture->expectFGColor(10, 10);
4397 }
4398
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004399 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004400
4401 // The boundary should be twice as far from the origin now.
4402 // The pixels from the last test should all be child now
4403 {
chaviw0e3479f2018-09-10 16:49:30 -07004404 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004405 mCapture->expectChildColor(9, 9);
4406 mCapture->expectChildColor(10, 10);
4407 mCapture->expectChildColor(19, 19);
4408 mCapture->expectFGColor(20, 20);
4409 }
4410}
Robert Carr9524cb32017-02-13 11:32:32 -08004411
Robert Carr6452f122017-03-21 10:41:29 -07004412TEST_F(ChildLayerTest, ChildLayerAlpha) {
4413 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4414 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4415 fillSurfaceRGBA8(mChild, 0, 254, 0);
4416 waitForPostedBuffers();
4417
Robert Carr4cdc58f2017-08-23 14:22:20 -07004418 asTransaction([&](Transaction& t) {
4419 t.show(mChild);
4420 t.setPosition(mChild, 0, 0);
4421 t.setPosition(mFGSurfaceControl, 0, 0);
4422 });
Robert Carr6452f122017-03-21 10:41:29 -07004423
4424 {
chaviw0e3479f2018-09-10 16:49:30 -07004425 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004426 // Unblended child color
4427 mCapture->checkPixel(0, 0, 0, 254, 0);
4428 }
4429
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004430 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004431
4432 {
chaviw0e3479f2018-09-10 16:49:30 -07004433 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004434 // Child and BG blended.
4435 mCapture->checkPixel(0, 0, 127, 127, 0);
4436 }
4437
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004438 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004439
4440 {
chaviw0e3479f2018-09-10 16:49:30 -07004441 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004442 // Child and BG blended.
4443 mCapture->checkPixel(0, 0, 95, 64, 95);
4444 }
4445}
4446
Robert Carr9524cb32017-02-13 11:32:32 -08004447TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004448 asTransaction([&](Transaction& t) {
4449 t.show(mChild);
4450 t.setPosition(mChild, 10, 10);
4451 t.setPosition(mFGSurfaceControl, 64, 64);
4452 });
Robert Carr9524cb32017-02-13 11:32:32 -08004453
4454 {
chaviw0e3479f2018-09-10 16:49:30 -07004455 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004456 // Top left of foreground must now be visible
4457 mCapture->expectFGColor(64, 64);
4458 // But 10 pixels in we should see the child surface
4459 mCapture->expectChildColor(74, 74);
4460 // And 10 more pixels we should be back to the foreground surface
4461 mCapture->expectFGColor(84, 84);
4462 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004463
4464 asTransaction([&](Transaction& t) {
4465 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4466 });
4467
Robert Carr9524cb32017-02-13 11:32:32 -08004468 {
chaviw0e3479f2018-09-10 16:49:30 -07004469 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004470 mCapture->expectFGColor(64, 64);
4471 // In reparenting we should have exposed the entire foreground surface.
4472 mCapture->expectFGColor(74, 74);
4473 // And the child layer should now begin at 10, 10 (since the BG
4474 // layer is at (0, 0)).
4475 mCapture->expectBGColor(9, 9);
4476 mCapture->expectChildColor(10, 10);
4477 }
4478}
4479
Robert Carr2e102c92018-10-23 12:11:15 -07004480TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4481 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004482 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004483 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4484
4485 {
4486 SCOPED_TRACE("Grandchild visible");
4487 ScreenCapture::captureScreen(&mCapture);
4488 mCapture->checkPixel(64, 64, 111, 111, 111);
4489 }
4490
Robert Carr87246532019-02-04 15:20:26 -08004491 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004492
4493 {
4494 SCOPED_TRACE("After destroying child");
4495 ScreenCapture::captureScreen(&mCapture);
4496 mCapture->expectFGColor(64, 64);
4497 }
4498
4499 asTransaction([&](Transaction& t) {
4500 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4501 });
4502
4503 {
4504 SCOPED_TRACE("After reparenting grandchild");
4505 ScreenCapture::captureScreen(&mCapture);
4506 mCapture->checkPixel(64, 64, 111, 111, 111);
4507 }
4508}
4509
chaviw161410b02017-07-27 10:46:08 -07004510TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004511 asTransaction([&](Transaction& t) {
4512 t.show(mChild);
4513 t.setPosition(mChild, 10, 10);
4514 t.setPosition(mFGSurfaceControl, 64, 64);
4515 });
Robert Carr9524cb32017-02-13 11:32:32 -08004516
4517 {
chaviw0e3479f2018-09-10 16:49:30 -07004518 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004519 // Top left of foreground must now be visible
4520 mCapture->expectFGColor(64, 64);
4521 // But 10 pixels in we should see the child surface
4522 mCapture->expectChildColor(74, 74);
4523 // And 10 more pixels we should be back to the foreground surface
4524 mCapture->expectFGColor(84, 84);
4525 }
4526
chaviw0e3479f2018-09-10 16:49:30 -07004527
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004528 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004529
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004530 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004531
chaviw161410b02017-07-27 10:46:08 -07004532 // Since the child has the same client as the parent, it will not get
4533 // detached and will be hidden.
4534 {
chaviw0e3479f2018-09-10 16:49:30 -07004535 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004536 mCapture->expectFGColor(64, 64);
4537 mCapture->expectFGColor(74, 74);
4538 mCapture->expectFGColor(84, 84);
4539 }
4540}
4541
4542TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4543 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004544 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004545 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4546 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004547
chaviw161410b02017-07-27 10:46:08 -07004548 ASSERT_TRUE(mChildNewClient->isValid());
4549
4550 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4551
Robert Carr4cdc58f2017-08-23 14:22:20 -07004552 asTransaction([&](Transaction& t) {
4553 t.hide(mChild);
4554 t.show(mChildNewClient);
4555 t.setPosition(mChildNewClient, 10, 10);
4556 t.setPosition(mFGSurfaceControl, 64, 64);
4557 });
chaviw161410b02017-07-27 10:46:08 -07004558
4559 {
chaviw0e3479f2018-09-10 16:49:30 -07004560 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004561 // Top left of foreground must now be visible
4562 mCapture->expectFGColor(64, 64);
4563 // But 10 pixels in we should see the child surface
4564 mCapture->expectChildColor(74, 74);
4565 // And 10 more pixels we should be back to the foreground surface
4566 mCapture->expectFGColor(84, 84);
4567 }
4568
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004569 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004570
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004571 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004572
Robert Carr9524cb32017-02-13 11:32:32 -08004573 // Nothing should have changed.
4574 {
chaviw0e3479f2018-09-10 16:49:30 -07004575 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004576 mCapture->expectFGColor(64, 64);
4577 mCapture->expectChildColor(74, 74);
4578 mCapture->expectFGColor(84, 84);
4579 }
4580}
4581
chaviw5aedec92018-10-22 10:40:38 -07004582TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4583 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4584 sp<SurfaceControl> childNewClient =
4585 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4586 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4587
4588 ASSERT_TRUE(childNewClient != nullptr);
4589 ASSERT_TRUE(childNewClient->isValid());
4590
4591 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4592
4593 Transaction()
4594 .hide(mChild)
4595 .show(childNewClient)
4596 .setPosition(childNewClient, 10, 10)
4597 .setPosition(mFGSurfaceControl, 64, 64)
4598 .apply();
4599
4600 {
4601 mCapture = screenshot();
4602 // Top left of foreground must now be visible
4603 mCapture->expectFGColor(64, 64);
4604 // But 10 pixels in we should see the child surface
4605 mCapture->expectChildColor(74, 74);
4606 // And 10 more pixels we should be back to the foreground surface
4607 mCapture->expectFGColor(84, 84);
4608 }
4609
4610 Transaction().detachChildren(mFGSurfaceControl).apply();
4611 Transaction().hide(childNewClient).apply();
4612
4613 // Nothing should have changed.
4614 {
4615 mCapture = screenshot();
4616 mCapture->expectFGColor(64, 64);
4617 mCapture->expectChildColor(74, 74);
4618 mCapture->expectFGColor(84, 84);
4619 }
4620
4621 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4622 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4623 32);
4624 Transaction()
4625 .setLayer(newParentSurface, INT32_MAX - 1)
4626 .show(newParentSurface)
4627 .setPosition(newParentSurface, 20, 20)
4628 .reparent(childNewClient, newParentSurface->getHandle())
4629 .apply();
4630 {
4631 mCapture = screenshot();
4632 // Child is now hidden.
4633 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4634 }
4635}
4636
Robert Carr9b429f42017-04-17 14:56:57 -07004637TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004638 asTransaction([&](Transaction& t) {
4639 t.show(mChild);
4640 t.setPosition(mChild, 0, 0);
4641 t.setPosition(mFGSurfaceControl, 0, 0);
4642 });
Robert Carr9b429f42017-04-17 14:56:57 -07004643
4644 {
chaviw0e3479f2018-09-10 16:49:30 -07004645 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004646 // We've positioned the child in the top left.
4647 mCapture->expectChildColor(0, 0);
4648 // But it's only 10x10.
4649 mCapture->expectFGColor(10, 10);
4650 }
4651
Robert Carr4cdc58f2017-08-23 14:22:20 -07004652 asTransaction([&](Transaction& t) {
4653 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4654 // We cause scaling by 2.
4655 t.setSize(mFGSurfaceControl, 128, 128);
4656 });
Robert Carr9b429f42017-04-17 14:56:57 -07004657
4658 {
chaviw0e3479f2018-09-10 16:49:30 -07004659 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004660 // We've positioned the child in the top left.
4661 mCapture->expectChildColor(0, 0);
4662 mCapture->expectChildColor(10, 10);
4663 mCapture->expectChildColor(19, 19);
4664 // And now it should be scaled all the way to 20x20
4665 mCapture->expectFGColor(20, 20);
4666 }
4667}
4668
Robert Carr1725eee2017-04-26 18:32:15 -07004669// Regression test for b/37673612
4670TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004671 asTransaction([&](Transaction& t) {
4672 t.show(mChild);
4673 t.setPosition(mChild, 0, 0);
4674 t.setPosition(mFGSurfaceControl, 0, 0);
4675 });
Robert Carr1725eee2017-04-26 18:32:15 -07004676
4677 {
chaviw0e3479f2018-09-10 16:49:30 -07004678 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004679 // We've positioned the child in the top left.
4680 mCapture->expectChildColor(0, 0);
4681 // But it's only 10x10.
4682 mCapture->expectFGColor(10, 10);
4683 }
Robert Carr1725eee2017-04-26 18:32:15 -07004684 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4685 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004686 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004687 sp<Surface> s = mFGSurfaceControl->getSurface();
4688 auto anw = static_cast<ANativeWindow*>(s.get());
4689 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4690 native_window_set_buffers_dimensions(anw, 64, 128);
4691 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4692 waitForPostedBuffers();
4693
4694 {
4695 // The child should still be in the same place and not have any strange scaling as in
4696 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004697 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004698 mCapture->expectChildColor(0, 0);
4699 mCapture->expectFGColor(10, 10);
4700 }
4701}
4702
Dan Stoza412903f2017-04-27 13:42:17 -07004703TEST_F(ChildLayerTest, Bug36858924) {
4704 // Destroy the child layer
4705 mChild.clear();
4706
4707 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004708 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4709 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004710
4711 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004712 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004713 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4714 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004715 t.show(mChild);
4716 });
Dan Stoza412903f2017-04-27 13:42:17 -07004717
4718 // Render the foreground surface a few times
4719 //
4720 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4721 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4722 // never acquire/release the first buffer
4723 ALOGI("Filling 1");
4724 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4725 ALOGI("Filling 2");
4726 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4727 ALOGI("Filling 3");
4728 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4729 ALOGI("Filling 4");
4730 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4731}
4732
chaviwf1961f72017-09-18 16:41:07 -07004733TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004734 asTransaction([&](Transaction& t) {
4735 t.show(mChild);
4736 t.setPosition(mChild, 10, 10);
4737 t.setPosition(mFGSurfaceControl, 64, 64);
4738 });
chaviw06178942017-07-27 10:25:59 -07004739
4740 {
chaviw0e3479f2018-09-10 16:49:30 -07004741 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004742 // Top left of foreground must now be visible
4743 mCapture->expectFGColor(64, 64);
4744 // But 10 pixels in we should see the child surface
4745 mCapture->expectChildColor(74, 74);
4746 // And 10 more pixels we should be back to the foreground surface
4747 mCapture->expectFGColor(84, 84);
4748 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004749
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004750 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004751
chaviw06178942017-07-27 10:25:59 -07004752 {
chaviw0e3479f2018-09-10 16:49:30 -07004753 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004754 mCapture->expectFGColor(64, 64);
4755 // In reparenting we should have exposed the entire foreground surface.
4756 mCapture->expectFGColor(74, 74);
4757 // And the child layer should now begin at 10, 10 (since the BG
4758 // layer is at (0, 0)).
4759 mCapture->expectBGColor(9, 9);
4760 mCapture->expectChildColor(10, 10);
4761 }
4762}
4763
chaviwf1961f72017-09-18 16:41:07 -07004764TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004765 asTransaction([&](Transaction& t) {
4766 t.show(mChild);
4767 t.setPosition(mChild, 10, 10);
4768 t.setPosition(mFGSurfaceControl, 64, 64);
4769 });
chaviwf1961f72017-09-18 16:41:07 -07004770
4771 {
chaviw0e3479f2018-09-10 16:49:30 -07004772 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004773 // Top left of foreground must now be visible
4774 mCapture->expectFGColor(64, 64);
4775 // But 10 pixels in we should see the child surface
4776 mCapture->expectChildColor(74, 74);
4777 // And 10 more pixels we should be back to the foreground surface
4778 mCapture->expectFGColor(84, 84);
4779 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004780 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004781 {
chaviw0e3479f2018-09-10 16:49:30 -07004782 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004783 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004784 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004785 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004786 mCapture->expectFGColor(84, 84);
4787 }
4788}
4789
4790TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004791 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004792 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004793 ASSERT_TRUE(newSurface->isValid());
4794
4795 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004796 asTransaction([&](Transaction& t) {
4797 t.hide(mChild);
4798 t.show(newSurface);
4799 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004800 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004801 t.setPosition(mFGSurfaceControl, 64, 64);
4802 });
chaviwf1961f72017-09-18 16:41:07 -07004803
4804 {
chaviw0e3479f2018-09-10 16:49:30 -07004805 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004806 // Top left of foreground must now be visible
4807 mCapture->expectFGColor(64, 64);
4808 // At 10, 10 we should see the new surface
4809 mCapture->checkPixel(10, 10, 63, 195, 63);
4810 }
4811
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004812 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004813
4814 {
chaviw0e3479f2018-09-10 16:49:30 -07004815 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004816 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4817 // mFGSurface, putting it at 74, 74.
4818 mCapture->expectFGColor(64, 64);
4819 mCapture->checkPixel(74, 74, 63, 195, 63);
4820 mCapture->expectFGColor(84, 84);
4821 }
4822}
4823
chaviwc9674332017-08-28 12:32:18 -07004824TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004825 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4826 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004827 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4828
4829 {
chaviw0e3479f2018-09-10 16:49:30 -07004830 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004831 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4832 // which begins at 64, 64
4833 mCapture->checkPixel(64, 64, 50, 50, 50);
4834 }
4835}
4836
Robert Carr503c7042017-09-27 15:06:08 -07004837TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004838 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004839 fillSurfaceRGBA8(relative, 255, 255, 255);
4840
4841 Transaction t;
4842 t.setLayer(relative, INT32_MAX)
4843 .setRelativeLayer(mChild, relative->getHandle(), 1)
4844 .setPosition(mFGSurfaceControl, 0, 0)
4845 .apply(true);
4846
4847 // We expect that the child should have been elevated above our
4848 // INT_MAX layer even though it's not a child of it.
4849 {
chaviw0e3479f2018-09-10 16:49:30 -07004850 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07004851 mCapture->expectChildColor(0, 0);
4852 mCapture->expectChildColor(9, 9);
4853 mCapture->checkPixel(10, 10, 255, 255, 255);
4854 }
4855}
Vishnu Nair60356342018-11-13 13:00:45 -08004856class BoundlessLayerTest : public LayerUpdateTest {
4857protected:
4858 std::unique_ptr<ScreenCapture> mCapture;
4859};
4860
4861// Verify setting a size on a buffer layer has no effect.
4862TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
4863 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004864 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
4865 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004866 ASSERT_TRUE(bufferLayer->isValid());
4867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
4868 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
4869 {
4870 mCapture = screenshot();
4871 // Top left of background must now be visible
4872 mCapture->expectBGColor(0, 0);
4873 // Foreground Surface bounds must be color layer
4874 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
4875 // Buffer layer should not extend past buffer bounds
4876 mCapture->expectFGColor(95, 95);
4877 }
4878}
4879
4880// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
4881// which will crop the color layer.
4882TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
4883 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004884 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4885 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004886 ASSERT_TRUE(colorLayer->isValid());
4887 asTransaction([&](Transaction& t) {
4888 t.setColor(colorLayer, half3{0, 0, 0});
4889 t.show(colorLayer);
4890 });
4891 {
4892 mCapture = screenshot();
4893 // Top left of background must now be visible
4894 mCapture->expectBGColor(0, 0);
4895 // Foreground Surface bounds must be color layer
4896 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4897 // Color layer should not extend past foreground bounds
4898 mCapture->expectBGColor(129, 129);
4899 }
4900}
4901
4902// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
4903// a crop which will be used to crop the color layer.
4904TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004905 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4906 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004907 ASSERT_TRUE(cropLayer->isValid());
4908 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004909 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4910 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004911 ASSERT_TRUE(colorLayer->isValid());
4912 asTransaction([&](Transaction& t) {
4913 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
4914 t.setColor(colorLayer, half3{0, 0, 0});
4915 t.show(cropLayer);
4916 t.show(colorLayer);
4917 });
4918 {
4919 mCapture = screenshot();
4920 // Top left of background must now be visible
4921 mCapture->expectBGColor(0, 0);
4922 // Top left of foreground must now be visible
4923 mCapture->expectFGColor(64, 64);
4924 // 5 pixels from the foreground we should see the child surface
4925 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
4926 // 10 pixels from the foreground we should be back to the foreground surface
4927 mCapture->expectFGColor(74, 74);
4928 }
4929}
4930
4931// Verify for boundless layer with no children, their transforms have no effect.
4932TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
4933 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004934 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4935 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004936 ASSERT_TRUE(colorLayer->isValid());
4937 asTransaction([&](Transaction& t) {
4938 t.setPosition(colorLayer, 320, 320);
4939 t.setMatrix(colorLayer, 2, 0, 0, 2);
4940 t.setColor(colorLayer, half3{0, 0, 0});
4941 t.show(colorLayer);
4942 });
4943 {
4944 mCapture = screenshot();
4945 // Top left of background must now be visible
4946 mCapture->expectBGColor(0, 0);
4947 // Foreground Surface bounds must be color layer
4948 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
4949 // Color layer should not extend past foreground bounds
4950 mCapture->expectBGColor(129, 129);
4951 }
4952}
4953
4954// Verify for boundless layer with children, their transforms have an effect.
4955TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
4956 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004957 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4958 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004959 ASSERT_TRUE(boundlessLayerRightShift->isValid());
4960 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004961 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
4962 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004963 ASSERT_TRUE(boundlessLayerDownShift->isValid());
4964 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004965 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
4966 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08004967 ASSERT_TRUE(colorLayer->isValid());
4968 asTransaction([&](Transaction& t) {
4969 t.setPosition(boundlessLayerRightShift, 32, 0);
4970 t.show(boundlessLayerRightShift);
4971 t.setPosition(boundlessLayerDownShift, 0, 32);
4972 t.show(boundlessLayerDownShift);
4973 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
4974 t.setColor(colorLayer, half3{0, 0, 0});
4975 t.show(colorLayer);
4976 });
4977 {
4978 mCapture = screenshot();
4979 // Top left of background must now be visible
4980 mCapture->expectBGColor(0, 0);
4981 // Top left of foreground must now be visible
4982 mCapture->expectFGColor(64, 64);
4983 // Foreground Surface bounds must be color layer
4984 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
4985 // Color layer should not extend past foreground bounds
4986 mCapture->expectBGColor(129, 129);
4987 }
4988}
4989
4990// Verify child layers do not get clipped if they temporarily move into the negative
4991// coordinate space as the result of an intermediate transformation.
4992TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
4993 sp<SurfaceControl> boundlessLayer =
4994 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
4995 0 /* flags */, mFGSurfaceControl.get());
4996 ASSERT_TRUE(boundlessLayer != nullptr);
4997 ASSERT_TRUE(boundlessLayer->isValid());
4998 sp<SurfaceControl> colorLayer =
4999 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5000 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5001 ASSERT_TRUE(colorLayer != nullptr);
5002 ASSERT_TRUE(colorLayer->isValid());
5003 asTransaction([&](Transaction& t) {
5004 // shift child layer off bounds. If this layer was not boundless, we will
5005 // expect the child layer to be cropped.
5006 t.setPosition(boundlessLayer, 32, 32);
5007 t.show(boundlessLayer);
5008 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5009 // undo shift by parent
5010 t.setPosition(colorLayer, -32, -32);
5011 t.setColor(colorLayer, half3{0, 0, 0});
5012 t.show(colorLayer);
5013 });
5014 {
5015 mCapture = screenshot();
5016 // Top left of background must now be visible
5017 mCapture->expectBGColor(0, 0);
5018 // Foreground Surface bounds must be color layer
5019 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5020 // Color layer should not extend past foreground bounds
5021 mCapture->expectBGColor(129, 129);
5022 }
5023}
5024
5025// Verify for boundless root layers with children, their transforms have an effect.
5026TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005027 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5028 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005029 ASSERT_TRUE(rootBoundlessLayer->isValid());
5030 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005031 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5032 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5033
Vishnu Nair60356342018-11-13 13:00:45 -08005034 ASSERT_TRUE(colorLayer->isValid());
5035 asTransaction([&](Transaction& t) {
5036 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5037 t.setPosition(rootBoundlessLayer, 32, 32);
5038 t.show(rootBoundlessLayer);
5039 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5040 t.setColor(colorLayer, half3{0, 0, 0});
5041 t.show(colorLayer);
5042 t.hide(mFGSurfaceControl);
5043 });
5044 {
5045 mCapture = screenshot();
5046 // Top left of background must now be visible
5047 mCapture->expectBGColor(0, 0);
5048 // Top left of foreground must now be visible
5049 mCapture->expectBGColor(31, 31);
5050 // Foreground Surface bounds must be color layer
5051 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5052 // Color layer should not extend past foreground bounds
5053 mCapture->expectBGColor(97, 97);
5054 }
5055}
Robert Carr503c7042017-09-27 15:06:08 -07005056
chaviwa76b2712017-09-20 12:02:26 -07005057class ScreenCaptureTest : public LayerUpdateTest {
5058protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005059 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005060};
5061
5062TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5063 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005064 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005065 mCapture->expectBGColor(0, 0);
5066 // Doesn't capture FG layer which is at 64, 64
5067 mCapture->expectBGColor(64, 64);
5068}
5069
5070TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5071 auto fgHandle = mFGSurfaceControl->getHandle();
5072
Vishnu Nair88a11f22018-11-28 18:30:57 -08005073 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5074 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005075 fillSurfaceRGBA8(child, 200, 200, 200);
5076
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005077 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005078
5079 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005080 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005081 mCapture->expectFGColor(10, 10);
5082 mCapture->expectChildColor(0, 0);
5083}
5084
Robert Carr578038f2018-03-09 12:25:24 -08005085TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5086 auto fgHandle = mFGSurfaceControl->getHandle();
5087
Vishnu Nair88a11f22018-11-28 18:30:57 -08005088 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5089 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005090 fillSurfaceRGBA8(child, 200, 200, 200);
5091
5092 SurfaceComposerClient::Transaction().show(child).apply(true);
5093
5094 // Captures mFGSurfaceControl's child
5095 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5096 mCapture->checkPixel(10, 10, 0, 0, 0);
5097 mCapture->expectChildColor(0, 0);
5098}
5099
chaviw50da5042018-04-09 13:49:37 -07005100TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005101 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5102 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005103
5104 fillSurfaceRGBA8(child, 200, 200, 200);
5105
5106 SurfaceComposerClient::Transaction().show(child).apply(true);
5107
5108 auto childHandle = child->getHandle();
5109
5110 // Captures child
5111 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5112 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5113 // Area outside of child's bounds is transparent.
5114 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5115}
5116
chaviw4b129c22018-04-09 16:19:43 -07005117TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5118 auto fgHandle = mFGSurfaceControl->getHandle();
5119
Vishnu Nair88a11f22018-11-28 18:30:57 -08005120 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5121 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5122 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005123 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005124 fillSurfaceRGBA8(child, 200, 200, 200);
5125 fillSurfaceRGBA8(relative, 100, 100, 100);
5126
5127 SurfaceComposerClient::Transaction()
5128 .show(child)
5129 // Set relative layer above fg layer so should be shown above when computing all layers.
5130 .setRelativeLayer(relative, fgHandle, 1)
5131 .show(relative)
5132 .apply(true);
5133
5134 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5135 ScreenCapture::captureLayers(&mCapture, fgHandle);
5136 mCapture->expectFGColor(10, 10);
5137 mCapture->expectChildColor(0, 0);
5138}
5139
5140TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5141 auto fgHandle = mFGSurfaceControl->getHandle();
5142
Vishnu Nair88a11f22018-11-28 18:30:57 -08005143 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5144 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5145 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5146 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005147 fillSurfaceRGBA8(child, 200, 200, 200);
5148 fillSurfaceRGBA8(relative, 100, 100, 100);
5149
5150 SurfaceComposerClient::Transaction()
5151 .show(child)
5152 // Set relative layer below fg layer but relative to child layer so it should be shown
5153 // above child layer.
5154 .setLayer(relative, -1)
5155 .setRelativeLayer(relative, child->getHandle(), 1)
5156 .show(relative)
5157 .apply(true);
5158
5159 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5160 // relative value should be taken into account, placing it above child layer.
5161 ScreenCapture::captureLayers(&mCapture, fgHandle);
5162 mCapture->expectFGColor(10, 10);
5163 // Relative layer is showing on top of child layer
5164 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5165}
Robert Carr578038f2018-03-09 12:25:24 -08005166
5167// In the following tests we verify successful skipping of a parent layer,
5168// so we use the same verification logic and only change how we mutate
5169// the parent layer to verify that various properties are ignored.
5170class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5171public:
5172 void SetUp() override {
5173 LayerUpdateTest::SetUp();
5174
Vishnu Nair88a11f22018-11-28 18:30:57 -08005175 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5176 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005177 fillSurfaceRGBA8(mChild, 200, 200, 200);
5178
5179 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5180 }
5181
Vishnu Nair333a9572019-02-15 16:05:56 -08005182 void verify(std::function<void()> verifyStartingState) {
5183 // Verify starting state before a screenshot is taken.
5184 verifyStartingState();
5185
5186 // Verify child layer does not inherit any of the properties of its
5187 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005188 auto fgHandle = mFGSurfaceControl->getHandle();
5189 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5190 mCapture->checkPixel(10, 10, 0, 0, 0);
5191 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005192
5193 // Verify all assumptions are still true after the screenshot is taken.
5194 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005195 }
5196
5197 std::unique_ptr<ScreenCapture> mCapture;
5198 sp<SurfaceControl> mChild;
5199};
5200
Vishnu Nair333a9572019-02-15 16:05:56 -08005201// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005202TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5203
5204 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5205
5206 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005207
5208 // Before and after reparenting, verify child is properly hidden
5209 // when rendering full-screen.
5210 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005211}
5212
5213TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005214 SurfaceComposerClient::Transaction()
5215 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5216 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005217
5218 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005219
5220 // Before and after reparenting, verify child is cropped by parent.
5221 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005222}
5223
Vishnu Nair333a9572019-02-15 16:05:56 -08005224// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005225TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005226 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005227
5228 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005229
Vishnu Nair333a9572019-02-15 16:05:56 -08005230 // Before and after reparenting, verify child is properly scaled.
5231 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005232}
5233
5234
chaviwa76b2712017-09-20 12:02:26 -07005235TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5236 auto fgHandle = mFGSurfaceControl->getHandle();
5237
Vishnu Nair88a11f22018-11-28 18:30:57 -08005238 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5239 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005240 fillSurfaceRGBA8(child, 200, 200, 200);
5241
Vishnu Nair88a11f22018-11-28 18:30:57 -08005242 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5243 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005244
5245 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5246 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005247 .show(child)
5248 .setPosition(grandchild, 5, 5)
5249 .show(grandchild)
5250 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005251
5252 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005253 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005254 mCapture->expectFGColor(10, 10);
5255 mCapture->expectChildColor(0, 0);
5256 mCapture->checkPixel(5, 5, 50, 50, 50);
5257}
5258
5259TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005260 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5261 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005262 fillSurfaceRGBA8(child, 200, 200, 200);
5263 auto childHandle = child->getHandle();
5264
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005265 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005266
5267 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005268 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005269 mCapture->expectChildColor(0, 0);
5270 mCapture->expectChildColor(9, 9);
5271}
5272
5273TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005274 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5275 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005276 fillSurfaceRGBA8(child, 200, 200, 200);
5277 auto childHandle = child->getHandle();
5278
Vishnu Nair88a11f22018-11-28 18:30:57 -08005279 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5280 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005281 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5282
5283 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005284 .show(child)
5285 .setPosition(grandchild, 5, 5)
5286 .show(grandchild)
5287 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005288
5289 auto grandchildHandle = grandchild->getHandle();
5290
5291 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005292 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005293 mCapture->checkPixel(0, 0, 50, 50, 50);
5294 mCapture->checkPixel(4, 4, 50, 50, 50);
5295}
5296
chaviw7206d492017-11-10 16:16:12 -08005297TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005298 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005299 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5300 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005301
Marissa Wall61c58622018-07-18 10:12:20 -07005302 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5303 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005304
5305 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005306 .setLayer(redLayer, INT32_MAX - 1)
5307 .show(redLayer)
5308 .show(blueLayer)
5309 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005310
5311 auto redLayerHandle = redLayer->getHandle();
5312
5313 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005314 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5315 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5316 // red area below the blue area
5317 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5318 // red area to the right of the blue area
5319 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005320
Marissa Wall861616d2018-10-22 12:52:23 -07005321 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005322 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005323 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5324 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005325 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005326 mCapture->checkPixel(30, 30, 0, 0, 0);
5327}
5328
5329TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005330 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005331 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5332 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005333
Marissa Wall61c58622018-07-18 10:12:20 -07005334 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5335 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005336
5337 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005338 .setLayer(redLayer, INT32_MAX - 1)
5339 .show(redLayer)
5340 .show(blueLayer)
5341 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005342
5343 auto redLayerHandle = redLayer->getHandle();
5344
5345 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005346 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5347 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5348 // red area below the blue area
5349 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5350 // red area to the right of the blue area
5351 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005352
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005353 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005354 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005355 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5356 // red area below the blue area
5357 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5358 // red area to the right of the blue area
5359 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005360 mCapture->checkPixel(30, 30, 0, 0, 0);
5361}
5362
5363TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005364 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005365
Marissa Wall61c58622018-07-18 10:12:20 -07005366 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005367
5368 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005369 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005370 SurfaceComposerClient::Transaction().apply(true);
5371
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005372 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005373
5374 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005375 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5376 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005377}
5378
chaviw8e3fe5d2018-02-22 10:55:42 -08005379
5380class DereferenceSurfaceControlTest : public LayerTransactionTest {
5381protected:
5382 void SetUp() override {
5383 LayerTransactionTest::SetUp();
5384 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005385 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005386 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005387 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005388 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5389 {
5390 SCOPED_TRACE("before anything");
5391 auto shot = screenshot();
5392 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5393 }
5394 }
5395 void TearDown() override {
5396 LayerTransactionTest::TearDown();
5397 bgLayer = 0;
5398 fgLayer = 0;
5399 }
5400
5401 sp<SurfaceControl> bgLayer;
5402 sp<SurfaceControl> fgLayer;
5403};
5404
5405TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5406 fgLayer = nullptr;
5407 {
5408 SCOPED_TRACE("after setting null");
5409 auto shot = screenshot();
5410 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5411 }
5412}
5413
5414TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5415 auto transaction = Transaction().show(fgLayer);
5416 fgLayer = nullptr;
5417 {
5418 SCOPED_TRACE("after setting null");
5419 auto shot = screenshot();
5420 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5421 }
5422}
5423
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005424} // namespace android