blob: b1fde22e0ee024b1e9cb913ed958b6f2cde954b5 [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>
Steven Thomas44685cb2019-07-23 16:19:31 -070031#include <gui/IProducerListener.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080032#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070033#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080034#include <gui/Surface.h>
35#include <gui/SurfaceComposerClient.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070036#include <hardware/hwcomposer_defs.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080037#include <private/android_filesystem_config.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070038#include <private/gui/ComposerService.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080039
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070040#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070041#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070042#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070043#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070044
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070045#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070046#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080047#include <sys/types.h>
48#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070049
Marissa Wall713b63f2018-10-17 15:42:43 -070050#include "BufferGenerator.h"
51
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070052namespace android {
53
Chia-I Wu718daf82017-10-20 11:57:17 -070054namespace {
55
56struct Color {
57 uint8_t r;
58 uint8_t g;
59 uint8_t b;
60 uint8_t a;
61
62 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070063 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070064 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070065 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070066 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070067 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070068};
69
70const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070071const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070072const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070073const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070074const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070075const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070076
Marissa Wall61c58622018-07-18 10:12:20 -070077using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070078using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070079
Chia-I Wu718daf82017-10-20 11:57:17 -070080std::ostream& operator<<(std::ostream& os, const Color& color) {
81 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
82 return os;
83}
84
85// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070086void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
87 const Color& color) {
88 Rect r(0, 0, buffer.width, buffer.height);
89 if (!r.intersect(rect, &r)) {
90 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070091 }
92
Marissa Wall61c58622018-07-18 10:12:20 -070093 int32_t width = r.right - r.left;
94 int32_t height = r.bottom - r.top;
95
96 for (int32_t row = 0; row < height; row++) {
97 uint8_t* dst =
98 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
99 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700100 dst[0] = color.r;
101 dst[1] = color.g;
102 dst[2] = color.b;
103 dst[3] = color.a;
104 dst += 4;
105 }
106 }
107}
108
Marissa Wall61c58622018-07-18 10:12:20 -0700109// Fill a region with the specified color.
110void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
111 Rect r(0, 0, buffer->width, buffer->height);
112 if (!r.intersect(rect, &r)) {
113 return;
114 }
115
116 int32_t width = r.right - r.left;
117 int32_t height = r.bottom - r.top;
118
119 uint8_t* pixels;
120 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
121 reinterpret_cast<void**>(&pixels));
122
123 for (int32_t row = 0; row < height; row++) {
124 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
125 for (int32_t column = 0; column < width; column++) {
126 dst[0] = color.r;
127 dst[1] = color.g;
128 dst[2] = color.b;
129 dst[3] = color.a;
130 dst += 4;
131 }
132 }
133 buffer->unlock();
134}
135
Chia-I Wu718daf82017-10-20 11:57:17 -0700136// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000137void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700138 const Color& color, uint8_t tolerance) {
139 int32_t x = rect.left;
140 int32_t y = rect.top;
141 int32_t width = rect.right - rect.left;
142 int32_t height = rect.bottom - rect.top;
143
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000144 int32_t bufferWidth = int32_t(outBuffer->getWidth());
145 int32_t bufferHeight = int32_t(outBuffer->getHeight());
146 if (x + width > bufferWidth) {
147 x = std::min(x, bufferWidth);
148 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700149 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000150 if (y + height > bufferHeight) {
151 y = std::min(y, bufferHeight);
152 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700153 }
154
155 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
156 uint8_t tmp = a >= b ? a - b : b - a;
157 return tmp <= tolerance;
158 };
159 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000160 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700161 for (int32_t i = 0; i < width; i++) {
162 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
163 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
164 << "pixel @ (" << x + i << ", " << y + j << "): "
165 << "expected (" << color << "), "
166 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
167 src += 4;
168 }
169 }
170}
171
172} // anonymous namespace
173
Robert Carr4cdc58f2017-08-23 14:22:20 -0700174using Transaction = SurfaceComposerClient::Transaction;
175
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700176// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700177static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
178 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800179 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700180 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800181 ASSERT_TRUE(s != nullptr);
182 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800183 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700184 for (int y = 0; y < outBuffer.height; y++) {
185 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700186 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700187 pixel[0] = r;
188 pixel[1] = g;
189 pixel[2] = b;
190 pixel[3] = 255;
191 }
192 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700193 if (unlock) {
194 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
195 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700196}
197
198// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
199// individual pixel values for testing purposes.
200class ScreenCapture : public RefBase {
201public:
chaviw0e3479f2018-09-10 16:49:30 -0700202 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800203 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
204 }
205
206 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800207 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700208 SurfaceComposerClient::Transaction().apply(true);
209
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000210 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800211 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700212 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000213 }
214
215 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
216 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
217 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
218 SurfaceComposerClient::Transaction().apply(true);
219
220 sp<GraphicBuffer> outBuffer;
221 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
222 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700223 }
224
Robert Carr578038f2018-03-09 12:25:24 -0800225 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
226 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
227 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
228 SurfaceComposerClient::Transaction().apply(true);
229
230 sp<GraphicBuffer> outBuffer;
231 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
232 *sc = std::make_unique<ScreenCapture>(outBuffer);
233 }
234
Robert Carr866455f2019-04-02 16:28:26 -0700235 static void captureChildLayersExcluding(
236 std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
237 std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>> excludeLayers) {
238 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
239 SurfaceComposerClient::Transaction().apply(true);
240
241 sp<GraphicBuffer> outBuffer;
242 ASSERT_EQ(NO_ERROR,
243 sf->captureLayers(parentHandle, &outBuffer, ui::Dataspace::V0_SRGB,
244 ui::PixelFormat::RGBA_8888, Rect::EMPTY_RECT, excludeLayers,
245 1.0f, true));
246 *sc = std::make_unique<ScreenCapture>(outBuffer);
247 }
248
Chia-I Wu718daf82017-10-20 11:57:17 -0700249 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000250 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
251 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700252 }
253
254 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000255 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700256 const bool leftBorder = rect.left > 0;
257 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000258 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
259 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700260
261 if (topBorder) {
262 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
263 if (leftBorder) {
264 top.left -= 1;
265 }
266 if (rightBorder) {
267 top.right += 1;
268 }
269 expectColor(top, color, tolerance);
270 }
271 if (leftBorder) {
272 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
273 expectColor(left, color, tolerance);
274 }
275 if (rightBorder) {
276 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
277 expectColor(right, color, tolerance);
278 }
279 if (bottomBorder) {
280 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
281 if (leftBorder) {
282 bottom.left -= 1;
283 }
284 if (rightBorder) {
285 bottom.right += 1;
286 }
287 expectColor(bottom, color, tolerance);
288 }
289 }
290
Chia-I Wu93853fe2017-11-02 08:30:27 -0700291 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
292 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
293 uint8_t tolerance = 0) {
294 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
295
296 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
297 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
298 // avoid checking borders due to unspecified filtering behavior
299 const int32_t offsetX = filtered ? 2 : 0;
300 const int32_t offsetY = filtered ? 2 : 0;
301 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
302 tolerance);
303 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
304 tolerance);
305 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
306 tolerance);
307 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
308 bottomRight, tolerance);
309 }
310
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700311 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000312 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
313 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700314 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
315 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700316 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
317 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700318 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700319 }
320 }
321
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700322 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700323
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700324 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700325
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700326 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700327
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800328 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000329 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700330 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700331
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000332 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700333
334private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000335 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800336 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700337};
338
Chia-I Wu718daf82017-10-20 11:57:17 -0700339class LayerTransactionTest : public ::testing::Test {
340protected:
341 void SetUp() override {
342 mClient = new SurfaceComposerClient;
343 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
344
345 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700346
347 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700348 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700349 }
350
chaviw0e3479f2018-09-10 16:49:30 -0700351 virtual void TearDown() {
352 mBlackBgSurface = 0;
353 mClient->dispose();
354 mClient = 0;
355 }
356
Marissa Wallfda30bb2018-10-12 11:34:28 -0700357 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
358 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800359 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
360 auto layer =
361 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700362
Vishnu Nair60356342018-11-13 13:00:45 -0800363 Transaction t;
364 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800365
366 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700367 if (error != NO_ERROR) {
368 ADD_FAILURE() << "failed to initialize SurfaceControl";
369 layer.clear();
370 }
371
372 return layer;
373 }
374
Vishnu Nair88a11f22018-11-28 18:30:57 -0800375 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
376 const char* name, uint32_t width, uint32_t height,
377 PixelFormat format, uint32_t flags,
378 SurfaceControl* parent = nullptr) {
379 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
380 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
381 return layer;
382 }
383
Marissa Wallfda30bb2018-10-12 11:34:28 -0700384 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800385 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
386 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700387 }
388
Vishnu Nairda9c85a2019-06-03 17:26:48 -0700389 sp<SurfaceControl> createColorLayer(const char* name, const Color& color,
390 SurfaceControl* parent = nullptr) {
391 auto colorLayer = createSurface(mClient, name, 0 /* buffer width */, 0 /* buffer height */,
392 PIXEL_FORMAT_RGBA_8888,
393 ISurfaceComposerClient::eFXSurfaceColor, parent);
394 asTransaction([&](Transaction& t) {
395 t.setColor(colorLayer, half3{color.r / 255.0f, color.g / 255.0f, color.b / 255.0f});
396 t.setAlpha(colorLayer, color.a / 255.0f);
397 });
398 return colorLayer;
399 }
400
Marissa Wall61c58622018-07-18 10:12:20 -0700401 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700402 // wait for previous transactions (such as setSize) to complete
403 Transaction().apply(true);
404
405 ANativeWindow_Buffer buffer = {};
406 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
407
408 return buffer;
409 }
410
Marissa Wall61c58622018-07-18 10:12:20 -0700411 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700412 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
413
414 // wait for the newly posted buffer to be latched
415 waitForLayerBuffers();
416 }
417
Marissa Wall61c58622018-07-18 10:12:20 -0700418 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
419 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700420 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700421 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
422 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
423 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700424 }
425
Marissa Wall61c58622018-07-18 10:12:20 -0700426 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
427 int32_t bufferWidth, int32_t bufferHeight) {
428 sp<GraphicBuffer> buffer =
429 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
430 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
431 BufferUsage::COMPOSER_OVERLAY,
432 "test");
433 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700434 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700435 }
436
437 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
438 int32_t bufferWidth, int32_t bufferHeight) {
439 switch (mLayerType) {
440 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
441 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
442 break;
443 case ISurfaceComposerClient::eFXSurfaceBufferState:
444 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
445 break;
446 default:
447 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
448 }
449 }
450
451 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
452 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700453 const Color& topRight, const Color& bottomLeft,
454 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700455 switch (mLayerType) {
456 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
457 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
458 bottomLeft, bottomRight);
459 break;
460 case ISurfaceComposerClient::eFXSurfaceBufferState:
461 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
462 bottomLeft, bottomRight);
463 break;
464 default:
465 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
466 }
467 }
468
469 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
470 int32_t bufferHeight, const Color& topLeft,
471 const Color& topRight, const Color& bottomLeft,
472 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700473 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700474 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
475 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700476
Marissa Wall61c58622018-07-18 10:12:20 -0700477 const int32_t halfW = bufferWidth / 2;
478 const int32_t halfH = bufferHeight / 2;
479 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
480 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
481 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
482 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
483 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700484
Marissa Wall61c58622018-07-18 10:12:20 -0700485 postBufferQueueLayerBuffer(layer);
486 }
487
488 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
489 int32_t bufferHeight, const Color& topLeft,
490 const Color& topRight, const Color& bottomLeft,
491 const Color& bottomRight) {
492 sp<GraphicBuffer> buffer =
493 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
494 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
495 BufferUsage::COMPOSER_OVERLAY,
496 "test");
497
498 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
499
500 const int32_t halfW = bufferWidth / 2;
501 const int32_t halfH = bufferHeight / 2;
502 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
503 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
504 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
505 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
506
507 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700508 }
509
chaviw0e3479f2018-09-10 16:49:30 -0700510 std::unique_ptr<ScreenCapture> screenshot() {
511 std::unique_ptr<ScreenCapture> screenshot;
512 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700513 return screenshot;
514 }
515
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800516 void asTransaction(const std::function<void(Transaction&)>& exec) {
517 Transaction t;
518 exec(t);
519 t.apply(true);
520 }
521
Marissa Wall713b63f2018-10-17 15:42:43 -0700522 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
523 static BufferGenerator bufferGenerator;
524 return bufferGenerator.get(outBuffer, outFence);
525 }
526
Chia-I Wu718daf82017-10-20 11:57:17 -0700527 sp<SurfaceComposerClient> mClient;
528
529 sp<IBinder> mDisplay;
530 uint32_t mDisplayWidth;
531 uint32_t mDisplayHeight;
532 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700533 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700534
535 // leave room for ~256 layers
536 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
537
chaviw0e3479f2018-09-10 16:49:30 -0700538 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700539 bool mColorManagementUsed;
540
Chia-I Wu718daf82017-10-20 11:57:17 -0700541private:
542 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800543 mDisplay = mClient->getInternalDisplayToken();
544 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700545
546 // get display width/height
547 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800548 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700549 mDisplayWidth = info.w;
550 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700551 mDisplayRect =
552 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700553
554 // After a new buffer is queued, SurfaceFlinger is notified and will
555 // latch the new buffer on next vsync. Let's heuristically wait for 3
556 // vsyncs.
557 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
558
559 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700560
Vishnu Nair88a11f22018-11-28 18:30:57 -0800561 mBlackBgSurface =
562 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
563 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700564
Chia-I Wu718daf82017-10-20 11:57:17 -0700565 // set layer stack (b/68888219)
566 Transaction t;
567 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800568 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700569 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
570 t.setColor(mBlackBgSurface, half3{0, 0, 0});
571 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700572 t.apply();
573 }
574
chaviw0e3479f2018-09-10 16:49:30 -0700575 void waitForLayerBuffers() {
576 // Request an empty transaction to get applied synchronously to ensure the buffer is
577 // latched.
578 Transaction().apply(true);
579 usleep(mBufferPostDelay);
580 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700581
582 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800583
584 friend class LayerRenderPathTestHarness;
585};
586enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
587
588class LayerRenderPathTestHarness {
589public:
590 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
591 : mDelegate(delegate), mRenderPath(renderPath) {}
592
593 std::unique_ptr<ScreenCapture> getScreenCapture() {
594 switch (mRenderPath) {
595 case RenderPath::SCREENSHOT:
596 return mDelegate->screenshot();
597 case RenderPath::VIRTUAL_DISPLAY:
598
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800599 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800600 DisplayInfo mainDisplayInfo;
601 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
602
603 sp<IBinder> vDisplay;
604 sp<IGraphicBufferProducer> producer;
605 sp<IGraphicBufferConsumer> consumer;
606 sp<BufferItemConsumer> itemConsumer;
607 BufferQueue::createBufferQueue(&producer, &consumer);
608
609 consumer->setConsumerName(String8("Virtual disp consumer"));
610 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
611
612 itemConsumer = new BufferItemConsumer(consumer,
613 // Sample usage bits from screenrecord
614 GRALLOC_USAGE_HW_VIDEO_ENCODER |
615 GRALLOC_USAGE_SW_READ_OFTEN);
616
617 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
618 false /*secure*/);
619
620 SurfaceComposerClient::Transaction t;
621 t.setDisplaySurface(vDisplay, producer);
622 t.setDisplayLayerStack(vDisplay, 0);
623 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
624 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
625 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
626 t.apply();
627 SurfaceComposerClient::Transaction().apply(true);
628 BufferItem item;
629 itemConsumer->acquireBuffer(&item, 0, true);
630 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
631 itemConsumer->releaseBuffer(item);
632 SurfaceComposerClient::destroyDisplay(vDisplay);
633 return sc;
634 }
635 }
636
637protected:
638 LayerTransactionTest* mDelegate;
639 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700640};
641
Alec Mouri80863a62019-01-17 15:19:35 -0800642class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700643public:
Alec Mouri80863a62019-01-17 15:19:35 -0800644 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700645
646 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800647 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700648 // if the flags already have a layer type specified, return an error
649 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
650 return nullptr;
651 }
chaviwf66724d2018-11-28 16:35:21 -0800652 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700653 }
654
655 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
656 int32_t bufferHeight) {
657 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
658 bufferWidth, bufferHeight));
659 }
660
661 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
662 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
663 const Color& bottomLeft, const Color& bottomRight) {
664 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
665 bufferWidth, bufferHeight,
666 topLeft, topRight,
667 bottomLeft, bottomRight));
668 }
669
670protected:
671 uint32_t mLayerType;
672};
673
Alec Mouri80863a62019-01-17 15:19:35 -0800674class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
675 public ::testing::WithParamInterface<uint32_t> {
676public:
677 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
678};
679
680class LayerTypeAndRenderTypeTransactionTest
681 : public LayerTypeTransactionHarness,
682 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
683public:
684 LayerTypeAndRenderTypeTransactionTest()
685 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
686 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
687
688 std::unique_ptr<ScreenCapture> getScreenCapture() {
689 return mRenderPathHarness.getScreenCapture();
690 }
691
692protected:
693 LayerRenderPathTestHarness mRenderPathHarness;
694};
695
696// Environment for starting up binder threads. This is required for testing
697// virtual displays, as BufferQueue parameters may be queried over binder.
698class BinderEnvironment : public ::testing::Environment {
699public:
700 void SetUp() override { ProcessState::self()->startThreadPool(); }
701};
702
703::testing::Environment* const binderEnv =
704 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
705
706class LayerRenderTypeTransactionTest : public LayerTransactionTest,
707 public ::testing::WithParamInterface<RenderPath> {
708public:
709 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
710
711 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
712 void setRelativeZBasicHelper(uint32_t layerType);
713 void setRelativeZGroupHelper(uint32_t layerType);
714 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800715 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
716 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800717
718protected:
719 LayerRenderPathTestHarness mHarness;
720};
721
722INSTANTIATE_TEST_CASE_P(
723 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
724 ::testing::Combine(
725 ::testing::Values(
726 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
727 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
728 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
729
730INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
731 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
732
Marissa Wall61c58622018-07-18 10:12:20 -0700733INSTANTIATE_TEST_CASE_P(
734 LayerTypeTransactionTests, LayerTypeTransactionTest,
735 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
736 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
737
Alec Mouri80863a62019-01-17 15:19:35 -0800738TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700739 sp<SurfaceControl> layer;
740 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700741 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700742
743 {
744 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700745 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800746 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700747 shot->expectColor(rect, Color::RED);
748 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700749 }
750
751 Transaction().setPosition(layer, 5, 10).apply();
752 {
753 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700754 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800755 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700756 shot->expectColor(rect, Color::RED);
757 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700758 }
759}
760
Alec Mouri80863a62019-01-17 15:19:35 -0800761TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700762 sp<SurfaceControl> layer;
763 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700764 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700765
766 // GLES requires only 4 bits of subpixel precision during rasterization
767 // XXX GLES composition does not match HWC composition due to precision
768 // loss (b/69315223)
769 const float epsilon = 1.0f / 16.0f;
770 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
771 {
772 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800773 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700774 }
775
776 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
777 {
778 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800779 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700780 }
781}
782
Alec Mouri80863a62019-01-17 15:19:35 -0800783TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700784 sp<SurfaceControl> layer;
785 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700786 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700787
788 Transaction().setPosition(layer, -32, -32).apply();
789 {
790 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800791 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700792 }
793
794 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
795 {
796 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800797 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700798 }
799}
800
Alec Mouri80863a62019-01-17 15:19:35 -0800801TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700802 sp<SurfaceControl> layer;
803 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700804 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700805
806 // partially out of bounds
807 Transaction().setPosition(layer, -30, -30).apply();
808 {
809 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800810 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700811 }
812
813 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
814 {
815 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800816 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
817 mDisplayHeight),
818 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700819 }
820}
821
Alec Mouri80863a62019-01-17 15:19:35 -0800822TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700823 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700824 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
825 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700826
827 // setPosition is applied immediately by default, with or without resize
828 // pending
829 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
830 {
831 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800832 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700833 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700834 shot->expectColor(rect, Color::RED);
835 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700836 }
837
Marissa Wall861616d2018-10-22 12:52:23 -0700838 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700839 {
840 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800841 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700842 }
843}
844
Alec Mouri80863a62019-01-17 15:19:35 -0800845TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700846 sp<SurfaceControl> layer;
847 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700848 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700849
850 // request setPosition to be applied with the next resize
851 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
852 {
853 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800854 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700855 }
856
857 Transaction().setPosition(layer, 15, 20).apply();
858 {
859 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862
863 Transaction().setSize(layer, 64, 64).apply();
864 {
865 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800866 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700867 }
868
869 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700870 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700871 {
872 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800873 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700874 }
875}
876
Alec Mouri80863a62019-01-17 15:19:35 -0800877TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700878 sp<SurfaceControl> layer;
879 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700880 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700881
882 // setPosition is not immediate even with SCALE_TO_WINDOW override
883 Transaction()
884 .setPosition(layer, 5, 10)
885 .setSize(layer, 64, 64)
886 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
887 .setGeometryAppliesWithResize(layer)
888 .apply();
889 {
890 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800891 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700892 }
893
Marissa Wall61c58622018-07-18 10:12:20 -0700894 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700895 {
896 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800897 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700898 }
899}
900
Alec Mouri80863a62019-01-17 15:19:35 -0800901TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700902 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700903 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
904 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700905
906 Transaction().setSize(layer, 64, 64).apply();
907 {
908 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800909 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700910 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700911 shot->expectColor(rect, Color::RED);
912 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700913 }
914
Marissa Wall861616d2018-10-22 12:52:23 -0700915 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700916 {
917 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800918 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700919 const Rect rect(0, 0, 64, 64);
920 shot->expectColor(rect, Color::RED);
921 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700922 }
923}
924
Alec Mouri80863a62019-01-17 15:19:35 -0800925TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700926 // cannot test robustness against invalid sizes (zero or really huge)
927}
928
Alec Mouri80863a62019-01-17 15:19:35 -0800929TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700930 sp<SurfaceControl> layer;
931 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700932 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700933
934 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
935 Transaction()
936 .setSize(layer, 64, 64)
937 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
938 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800939 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700940}
941
Alec Mouri80863a62019-01-17 15:19:35 -0800942TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700943 sp<SurfaceControl> layerR;
944 sp<SurfaceControl> layerG;
945 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700946 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700948 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700949
950 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
951 {
952 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800953 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700954 }
955
956 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
957 {
958 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800959 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700960 }
961}
962
Alec Mouri80863a62019-01-17 15:19:35 -0800963TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700964 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800965 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700966 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800967 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700968 sp<SurfaceControl> layerR;
969 sp<SurfaceControl> layerG;
970 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700971 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700972 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700973 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700974
chaviw0e3479f2018-09-10 16:49:30 -0700975 Transaction()
976 .reparent(layerR, parent->getHandle())
977 .reparent(layerG, parent->getHandle())
978 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700979 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
980 {
981 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800982 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700983 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700984 }
985
986 Transaction().setLayer(layerR, -3).apply();
987 {
988 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800989 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700990 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700991 }
992}
993
Alec Mouri80863a62019-01-17 15:19:35 -0800994void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700995 sp<SurfaceControl> layerR;
996 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700997 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
998 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
999 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
1000 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001001
Marissa Wall861616d2018-10-22 12:52:23 -07001002 switch (layerType) {
1003 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1004 Transaction()
1005 .setPosition(layerG, 16, 16)
1006 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1007 .apply();
1008 break;
1009 case ISurfaceComposerClient::eFXSurfaceBufferState:
1010 Transaction()
1011 .setFrame(layerR, Rect(0, 0, 32, 32))
1012 .setFrame(layerG, Rect(16, 16, 48, 48))
1013 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1014 .apply();
1015 break;
1016 default:
1017 ASSERT_FALSE(true) << "Unsupported layer type";
1018 }
Chia-I Wu49313302017-10-31 10:14:40 -07001019 {
1020 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -08001021 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001022 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1023 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
1024 }
1025
1026 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1027 {
1028 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001029 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001030 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1031 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1032 }
1033}
1034
Alec Mouri80863a62019-01-17 15:19:35 -08001035TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001036 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1037}
1038
Alec Mouri80863a62019-01-17 15:19:35 -08001039TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001040 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1041}
1042
Marissa Wall61c58622018-07-18 10:12:20 -07001043TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001044 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001045 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001046 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001047 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001048 sp<SurfaceControl> layerR;
1049 sp<SurfaceControl> layerG;
1050 sp<SurfaceControl> layerB;
1051 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001052 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001053 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001054 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001055 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001056 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001057
chaviw0e3479f2018-09-10 16:49:30 -07001058 Transaction()
1059 .reparent(layerB, parent->getHandle())
1060 .apply();
1061
Chia-I Wuec2d9852017-11-21 09:21:01 -08001062 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1063 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1064
chaviw0e3479f2018-09-10 16:49:30 -07001065 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001066 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001067 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001068 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001069 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1070}
1071
chaviw32377582019-05-13 11:15:19 -07001072TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) {
1073 sp<SurfaceControl> parent =
1074 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1075 ISurfaceComposerClient::eFXSurfaceColor);
1076
1077 sp<SurfaceControl> childLayer;
1078 ASSERT_NO_FATAL_FAILURE(
1079 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1080 0 /* buffer height */,
1081 ISurfaceComposerClient::eFXSurfaceColor,
1082 parent.get()));
1083 Transaction()
1084 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1085 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1086 .show(childLayer)
1087 .show(parent)
1088 .setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight))
1089 .setCrop_legacy(childLayer, Rect(0, 0, 20, 30))
1090 .apply();
1091
1092 Transaction()
1093 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1094 .setLayer(childLayer, 1)
1095 .apply();
1096
1097 {
1098 SCOPED_TRACE("setLayer above");
1099 // Set layer should get applied and place the child above.
1100 std::unique_ptr<ScreenCapture> screenshot;
1101 ScreenCapture::captureScreen(&screenshot);
1102 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1103 }
1104
1105 Transaction()
1106 .setLayer(childLayer, 1)
1107 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1108 .apply();
1109
1110 {
1111 SCOPED_TRACE("setRelative below");
1112 // Set relative layer should get applied and place the child below.
1113 std::unique_ptr<ScreenCapture> screenshot;
1114 ScreenCapture::captureScreen(&screenshot);
1115 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1116 }
1117}
1118
Robert Carr1c5481e2019-07-01 14:42:27 -07001119TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) {
1120 sp<SurfaceControl> parent =
1121 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1122 ISurfaceComposerClient::eFXSurfaceColor);
1123 sp<SurfaceControl> relativeParent =
1124 LayerTransactionTest::createLayer("RelativeParent", 0 /* buffer width */,
1125 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceColor);
1126
1127 sp<SurfaceControl> childLayer;
1128 ASSERT_NO_FATAL_FAILURE(
1129 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1130 0 /* buffer height */,
1131 ISurfaceComposerClient::eFXSurfaceColor,
1132 parent.get()));
1133 Transaction()
1134 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1135 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1136 .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f})
1137 .show(childLayer)
1138 .show(parent)
1139 .show(relativeParent)
1140 .setLayer(parent, mLayerZBase - 1)
1141 .setLayer(relativeParent, mLayerZBase)
1142 .apply();
1143
1144 Transaction()
1145 .setRelativeLayer(childLayer, relativeParent->getHandle(), 1)
1146 .apply();
1147
1148 {
1149 SCOPED_TRACE("setLayer above");
1150 // Set layer should get applied and place the child above.
1151 std::unique_ptr<ScreenCapture> screenshot;
1152 ScreenCapture::captureScreen(&screenshot);
1153 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1154 }
1155
1156 Transaction()
1157 .hide(relativeParent)
1158 .apply();
1159
1160 {
1161 SCOPED_TRACE("hide relative parent");
1162 // The relative should no longer be visible.
1163 std::unique_ptr<ScreenCapture> screenshot;
1164 ScreenCapture::captureScreen(&screenshot);
1165 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1166 }
1167}
1168
Alec Mouri80863a62019-01-17 15:19:35 -08001169void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001170 sp<SurfaceControl> layerR;
1171 sp<SurfaceControl> layerG;
1172 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001173 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1174 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1175 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1176 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1177 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1178 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001179
1180 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001181 switch (layerType) {
1182 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1183 Transaction()
1184 .setPosition(layerG, 8, 8)
1185 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1186 .setPosition(layerB, 16, 16)
1187 .setLayer(layerB, mLayerZBase + 2)
1188 .apply();
1189 break;
1190 case ISurfaceComposerClient::eFXSurfaceBufferState:
1191 Transaction()
1192 .setFrame(layerR, Rect(0, 0, 32, 32))
1193 .setFrame(layerG, Rect(8, 8, 40, 40))
1194 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1195 .setFrame(layerB, Rect(16, 16, 48, 48))
1196 .setLayer(layerB, mLayerZBase + 2)
1197 .apply();
1198 break;
1199 default:
1200 ASSERT_FALSE(true) << "Unsupported layer type";
1201 }
1202
Chia-I Wu49313302017-10-31 10:14:40 -07001203 {
1204 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001205 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001206 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1207 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1208 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1209 }
1210
1211 // layerR = 4, layerG = layerR + 3, layerB = 2
1212 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1213 {
1214 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001215 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001216 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1217 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1218 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1219 }
1220
1221 // layerR = 4, layerG = layerR - 3, layerB = 2
1222 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1223 {
1224 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001225 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001226 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1227 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1228 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1229 }
1230
1231 // restore to absolute z
1232 // layerR = 4, layerG = 0, layerB = 2
1233 Transaction().setLayer(layerG, mLayerZBase).apply();
1234 {
1235 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001236 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001237 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1238 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1239 }
1240
1241 // layerR should not affect layerG anymore
1242 // layerR = 1, layerG = 0, layerB = 2
1243 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1244 {
1245 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001246 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001247 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1248 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1249 }
1250}
1251
Alec Mouri80863a62019-01-17 15:19:35 -08001252TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001253 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1254}
1255
Alec Mouri80863a62019-01-17 15:19:35 -08001256TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001257 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1258}
1259
Alec Mouri80863a62019-01-17 15:19:35 -08001260TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001261 sp<SurfaceControl> layerR;
1262 sp<SurfaceControl> layerG;
1263
1264 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001265 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001266 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001267 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001268
1269 Transaction()
1270 .setPosition(layerG, 16, 16)
1271 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1272 .apply();
1273
Robert Carr87246532019-02-04 15:20:26 -08001274 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001275 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001276 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001277}
1278
Alec Mouri80863a62019-01-17 15:19:35 -08001279TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001280 sp<SurfaceControl> layer;
1281 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001282 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001283
1284 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1285 {
1286 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001287 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001288 }
1289
1290 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1291 {
1292 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001293 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001294 }
1295}
1296
Alec Mouri80863a62019-01-17 15:19:35 -08001297TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001298 const Color translucentRed = {100, 0, 0, 100};
1299 sp<SurfaceControl> layerR;
1300 sp<SurfaceControl> layerG;
1301 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001302 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001303 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001304 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001305
1306 Transaction()
1307 .setLayer(layerR, mLayerZBase + 1)
1308 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1309 .apply();
1310 {
1311 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001312 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001313 }
1314
1315 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1316 {
1317 SCOPED_TRACE("layerR translucent");
1318 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001319 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001320 }
1321}
1322
Marissa Wall61c58622018-07-18 10:12:20 -07001323TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001324 sp<SurfaceControl> layer;
1325 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001326 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001327
1328 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001329 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001330 Transaction()
1331 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1332 .apply(true);
1333 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001334 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001335
1336 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1337 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001338 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001339}
1340
Robert Carrfa8855f2019-02-19 10:05:00 -08001341/** RAII Wrapper around get/seteuid */
1342class UIDFaker {
1343 uid_t oldId;
1344public:
1345 UIDFaker(uid_t uid) {
1346 oldId = geteuid();
1347 seteuid(uid);
1348 }
1349 ~UIDFaker() {
1350 seteuid(oldId);
1351 }
1352};
1353
1354TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1355 sp<SurfaceControl> layer;
1356 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1357 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1358
1359 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1360 sp<GraphicBuffer> outBuffer;
1361 Transaction()
1362 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1363 .apply(true);
1364 ASSERT_EQ(PERMISSION_DENIED,
1365 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1366
1367 UIDFaker f(AID_SYSTEM);
1368
1369 // By default the system can capture screenshots with secure layers but they
1370 // will be blacked out
1371 ASSERT_EQ(NO_ERROR,
1372 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1373
1374 {
1375 SCOPED_TRACE("as system");
1376 auto shot = screenshot();
1377 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1378 }
1379
1380 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1381 // to receive them...we are expected to take care with the results.
Robert Carr108b2c72019-04-02 16:32:58 -07001382 bool outCapturedSecureLayers;
Robert Carrfa8855f2019-02-19 10:05:00 -08001383 ASSERT_EQ(NO_ERROR,
Robert Carr108b2c72019-04-02 16:32:58 -07001384 composer->captureScreen(mDisplay, &outBuffer, outCapturedSecureLayers,
1385 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, Rect(), 0,
1386 0, false, ISurfaceComposer::eRotateNone, true));
1387 ASSERT_EQ(true, outCapturedSecureLayers);
Robert Carrfa8855f2019-02-19 10:05:00 -08001388 ScreenCapture sc(outBuffer);
1389 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1390}
1391
Alec Mouri80863a62019-01-17 15:19:35 -08001392TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001393 const Rect top(0, 0, 32, 16);
1394 const Rect bottom(0, 16, 32, 32);
1395 sp<SurfaceControl> layer;
1396 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1397
1398 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001399 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1400 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1401 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001402 // setTransparentRegionHint always applies to the following buffer
1403 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001404 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001405 {
1406 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001407 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001408 shot->expectColor(top, Color::BLACK);
1409 shot->expectColor(bottom, Color::RED);
1410 }
1411
1412 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1413 {
1414 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001415 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001416 shot->expectColor(top, Color::BLACK);
1417 shot->expectColor(bottom, Color::RED);
1418 }
1419
Marissa Wall61c58622018-07-18 10:12:20 -07001420 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1421 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1422 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1423 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001424 {
1425 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001426 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001427 shot->expectColor(top, Color::RED);
1428 shot->expectColor(bottom, Color::BLACK);
1429 }
1430}
1431
Alec Mouri80863a62019-01-17 15:19:35 -08001432TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001433 const Rect top(0, 0, 32, 16);
1434 const Rect bottom(0, 16, 32, 32);
1435 sp<SurfaceControl> layer;
1436 ASSERT_NO_FATAL_FAILURE(
1437 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1438
1439 sp<GraphicBuffer> buffer =
1440 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1441 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1442 BufferUsage::COMPOSER_OVERLAY,
1443 "test");
1444
1445 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1446 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1447 Transaction()
1448 .setTransparentRegionHint(layer, Region(top))
1449 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001450 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001451 .apply();
1452 {
1453 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001454 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001455 shot->expectColor(top, Color::BLACK);
1456 shot->expectColor(bottom, Color::RED);
1457 }
1458
1459 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1460 {
1461 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001462 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001463 shot->expectColor(top, Color::BLACK);
1464 shot->expectColor(bottom, Color::BLACK);
1465 }
1466
1467 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1468 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1469 BufferUsage::COMPOSER_OVERLAY,
1470 "test");
1471
1472 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1473 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001474 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001475 {
1476 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001477 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001478 shot->expectColor(top, Color::RED);
1479 shot->expectColor(bottom, Color::BLACK);
1480 }
1481}
1482
Alec Mouri80863a62019-01-17 15:19:35 -08001483TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001484 sp<SurfaceControl> layerTransparent;
1485 sp<SurfaceControl> layerR;
1486 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1487 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1488
1489 // check that transparent region hint is bound by the layer size
1490 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001491 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001492 .setPosition(layerR, 16, 16)
1493 .setLayer(layerR, mLayerZBase + 1)
1494 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001495 ASSERT_NO_FATAL_FAILURE(
1496 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1497 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001498 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001499}
1500
Alec Mouri80863a62019-01-17 15:19:35 -08001501TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001502 sp<SurfaceControl> layerTransparent;
1503 sp<SurfaceControl> layerR;
1504 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1505 ASSERT_NO_FATAL_FAILURE(
1506 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1507
1508 // check that transparent region hint is bound by the layer size
1509 Transaction()
1510 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1511 .setFrame(layerR, Rect(16, 16, 48, 48))
1512 .setLayer(layerR, mLayerZBase + 1)
1513 .apply();
1514 ASSERT_NO_FATAL_FAILURE(
1515 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1516 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001517 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001518}
1519
Alec Mouri80863a62019-01-17 15:19:35 -08001520void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001521 sp<SurfaceControl> layer1;
1522 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001523 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1524 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1525 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1526 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001527
Marissa Wall861616d2018-10-22 12:52:23 -07001528 switch (layerType) {
1529 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1530 Transaction()
1531 .setAlpha(layer1, 0.25f)
1532 .setAlpha(layer2, 0.75f)
1533 .setPosition(layer2, 16, 0)
1534 .setLayer(layer2, mLayerZBase + 1)
1535 .apply();
1536 break;
1537 case ISurfaceComposerClient::eFXSurfaceBufferState:
1538 Transaction()
1539 .setAlpha(layer1, 0.25f)
1540 .setAlpha(layer2, 0.75f)
1541 .setFrame(layer1, Rect(0, 0, 32, 32))
1542 .setFrame(layer2, Rect(16, 0, 48, 32))
1543 .setLayer(layer2, mLayerZBase + 1)
1544 .apply();
1545 break;
1546 default:
1547 ASSERT_FALSE(true) << "Unsupported layer type";
1548 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001549 {
Alec Mouri80863a62019-01-17 15:19:35 -08001550 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001551 uint8_t r = 16; // 64 * 0.25f
1552 uint8_t g = 48; // 64 * 0.75f
1553 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1554 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1555
1556 r /= 4; // r * (1.0f - 0.75f)
1557 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1558 }
1559}
1560
Alec Mouri80863a62019-01-17 15:19:35 -08001561TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001562 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1563}
1564
Alec Mouri80863a62019-01-17 15:19:35 -08001565TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001566 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1567}
1568
Alec Mouri80863a62019-01-17 15:19:35 -08001569TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001570 const Color color = {64, 0, 0, 255};
1571 sp<SurfaceControl> layer;
1572 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001573 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001574
1575 Transaction().setAlpha(layer, 2.0f).apply();
1576 {
1577 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001578 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001579 }
1580
1581 Transaction().setAlpha(layer, -1.0f).apply();
1582 {
1583 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001584 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001585 }
1586}
1587
Alec Mouri80863a62019-01-17 15:19:35 -08001588TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001589 sp<SurfaceControl> layer;
1590 const uint8_t size = 64;
1591 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001592 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001593 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1594 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1595
1596 Transaction()
1597 .setCornerRadius(layer, cornerRadius)
1598 .apply();
1599 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001600 const uint8_t bottom = size - 1;
1601 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001602 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001603 // Transparent corners
1604 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001605 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1606 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1607 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1608 }
1609}
1610
Alec Mouri80863a62019-01-17 15:19:35 -08001611TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001612 sp<SurfaceControl> parent;
1613 sp<SurfaceControl> child;
1614 const uint8_t size = 64;
1615 const uint8_t testArea = 4;
1616 const float cornerRadius = 20.0f;
1617 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1618 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1619 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1620 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1621
1622 Transaction()
1623 .setCornerRadius(parent, cornerRadius)
1624 .reparent(child, parent->getHandle())
1625 .setPosition(child, 0, size / 2)
1626 .apply();
1627 {
1628 const uint8_t bottom = size - 1;
1629 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001630 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001631 // Top edge of child should not have rounded corners because it's translated in the parent
1632 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1633 Color::GREEN);
1634 // But bottom edges should have been clipped according to parent bounds
1635 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1636 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001637 }
1638}
1639
Alec Mouri80863a62019-01-17 15:19:35 -08001640TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001641 sp<SurfaceControl> bufferLayer;
1642 sp<SurfaceControl> colorLayer;
1643 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001644 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001645 ASSERT_NO_FATAL_FAILURE(colorLayer =
1646 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1647 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001648
Vishnu Nair88a11f22018-11-28 18:30:57 -08001649 Transaction()
1650 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1651 .setLayer(colorLayer, mLayerZBase + 1)
1652 .apply();
1653
Chia-I Wue4ef6102017-11-01 15:16:35 -07001654 {
1655 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001656 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001657 }
1658
1659 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1660 const Color expected = {15, 51, 85, 255};
1661 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1662 // channel) should be less than one
1663 const uint8_t tolerance = 1;
1664 Transaction().setColor(colorLayer, color).apply();
1665 {
1666 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001667 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001668 }
1669}
1670
Valerie Haudd0b7572019-01-29 14:59:27 -08001671// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1672// BLUE: prior background color
1673// GREEN: final background color
1674// BLACK: no color or fill
1675void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1676 bool bufferFill, float alpha,
1677 Color finalColor) {
1678 sp<SurfaceControl> layer;
1679 int32_t width = 500;
1680 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001681
Valerie Haudd0b7572019-01-29 14:59:27 -08001682 Color fillColor = Color::RED;
1683 Color priorBgColor = Color::BLUE;
1684 Color expectedColor = Color::BLACK;
1685 switch (layerType) {
1686 case ISurfaceComposerClient::eFXSurfaceColor:
1687 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1688 Transaction()
1689 .setCrop_legacy(layer, Rect(0, 0, width, height))
1690 .setColor(layer, half3(1.0f, 0, 0))
1691 .apply();
1692 expectedColor = fillColor;
1693 break;
1694 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1695 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1696 if (bufferFill) {
1697 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1698 expectedColor = fillColor;
1699 }
1700 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1701 break;
1702 case ISurfaceComposerClient::eFXSurfaceBufferState:
1703 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1704 if (bufferFill) {
1705 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1706 expectedColor = fillColor;
1707 }
1708 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1709 break;
1710 default:
1711 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1712 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001713 }
1714
Valerie Haudd0b7572019-01-29 14:59:27 -08001715 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1716 Transaction()
1717 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1718 .apply();
1719 if (!bufferFill) {
1720 expectedColor = priorBgColor;
1721 }
1722 }
1723
1724 {
1725 SCOPED_TRACE("default before setting background color layer");
1726 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1727 }
Valerie Haua72e2812019-01-23 13:40:39 -08001728 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001729 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001730 .apply();
1731
1732 {
Valerie Haua72e2812019-01-23 13:40:39 -08001733 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001734 shot->expectColor(Rect(0, 0, width, height), finalColor);
1735 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001736 }
1737}
1738
Valerie Haudd0b7572019-01-29 14:59:27 -08001739TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1740 bool priorColor = false;
1741 bool bufferFill = false;
1742 float alpha = 1.0f;
1743 Color finalColor = Color::RED;
1744 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1745 priorColor, bufferFill, alpha, finalColor));
1746}
Valerie Haua72e2812019-01-23 13:40:39 -08001747
Valerie Haudd0b7572019-01-29 14:59:27 -08001748TEST_P(LayerRenderTypeTransactionTest,
1749 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1750 bool priorColor = false;
1751 bool bufferFill = true;
1752 float alpha = 1.0f;
1753 Color finalColor = Color::RED;
1754 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1755 priorColor, bufferFill, alpha, finalColor));
1756}
Valerie Haua72e2812019-01-23 13:40:39 -08001757
Valerie Haudd0b7572019-01-29 14:59:27 -08001758TEST_P(LayerRenderTypeTransactionTest,
1759 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1760 bool priorColor = false;
1761 bool bufferFill = false;
1762 float alpha = 1.0f;
1763 Color finalColor = Color::GREEN;
1764 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1765 priorColor, bufferFill, alpha, finalColor));
1766}
Valerie Haua72e2812019-01-23 13:40:39 -08001767
Valerie Haudd0b7572019-01-29 14:59:27 -08001768TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1769 bool priorColor = true;
1770 bool bufferFill = true;
1771 float alpha = 1.0f;
1772 Color finalColor = Color::RED;
1773 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1774 priorColor, bufferFill, alpha, finalColor));
1775}
1776
1777TEST_P(LayerRenderTypeTransactionTest,
1778 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1779 bool priorColor = true;
1780 bool bufferFill = false;
1781 float alpha = 1.0f;
1782 Color finalColor = Color::GREEN;
1783 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1784 priorColor, bufferFill, alpha, finalColor));
1785}
1786TEST_P(LayerRenderTypeTransactionTest,
1787 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1788 bool priorColor = false;
1789 bool bufferFill = false;
1790 float alpha = 0;
1791 Color finalColor = Color::BLACK;
1792 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1793 priorColor, bufferFill, alpha, finalColor));
1794}
1795
1796TEST_P(LayerRenderTypeTransactionTest,
1797 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1798 bool priorColor = true;
1799 bool bufferFill = false;
1800 float alpha = 0;
1801 Color finalColor = Color::BLACK;
1802 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1803 priorColor, bufferFill, alpha, finalColor));
1804}
1805
1806TEST_P(LayerRenderTypeTransactionTest,
1807 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1808 bool priorColor = false;
1809 bool bufferFill = true;
1810 float alpha = 1.0f;
1811 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001812 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001813 priorColor, bufferFill, alpha, finalColor));
1814}
1815
1816TEST_P(LayerRenderTypeTransactionTest,
1817 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1818 bool priorColor = false;
1819 bool bufferFill = false;
1820 float alpha = 1.0f;
1821 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001822 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001823 priorColor, bufferFill, alpha, finalColor));
1824}
1825
1826TEST_P(LayerRenderTypeTransactionTest,
1827 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1828 bool priorColor = true;
1829 bool bufferFill = false;
1830 float alpha = 1.0f;
1831 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001832 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001833 priorColor, bufferFill, alpha, finalColor));
1834}
1835
1836TEST_P(LayerRenderTypeTransactionTest,
1837 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1838 bool priorColor = false;
1839 bool bufferFill = false;
1840 float alpha = 0;
1841 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001842 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001843 priorColor, bufferFill, alpha, finalColor));
1844}
1845
1846TEST_P(LayerRenderTypeTransactionTest,
1847 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1848 bool priorColor = true;
1849 bool bufferFill = false;
1850 float alpha = 0;
1851 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001852 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001853 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001854}
1855
Alec Mouri80863a62019-01-17 15:19:35 -08001856TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001857 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001858 ASSERT_NO_FATAL_FAILURE(colorLayer =
1859 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1860 ISurfaceComposerClient::eFXSurfaceColor));
1861 Transaction()
1862 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1863 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1864 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001865
Alec Mouri80863a62019-01-17 15:19:35 -08001866 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001867}
1868
Alec Mouri80863a62019-01-17 15:19:35 -08001869TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001870 sp<SurfaceControl> bufferLayer;
1871 sp<SurfaceControl> colorLayer;
1872 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001873 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001874 ASSERT_NO_FATAL_FAILURE(colorLayer =
1875 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1876 ISurfaceComposerClient::eFXSurfaceColor));
1877 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001878
1879 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1880 const float alpha = 0.25f;
1881 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1882 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1883 // channel) should be less than one
1884 const uint8_t tolerance = 1;
1885 Transaction()
1886 .setColor(colorLayer, color)
1887 .setAlpha(colorLayer, alpha)
1888 .setLayer(colorLayer, mLayerZBase + 1)
1889 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001890 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1891 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001892}
1893
Alec Mouri80863a62019-01-17 15:19:35 -08001894TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001895 sp<SurfaceControl> bufferLayer;
1896 sp<SurfaceControl> parentLayer;
1897 sp<SurfaceControl> colorLayer;
1898 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1899 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001900 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001901 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1902 0 /* buffer height */,
1903 ISurfaceComposerClient::eFXSurfaceColor));
1904 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001905 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1906 const float alpha = 0.25f;
1907 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1908 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1909 // channel) should be less than one
1910 const uint8_t tolerance = 1;
1911 Transaction()
1912 .reparent(colorLayer, parentLayer->getHandle())
1913 .setColor(colorLayer, color)
1914 .setAlpha(parentLayer, alpha)
1915 .setLayer(parentLayer, mLayerZBase + 1)
1916 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001917 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1918 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001919}
1920
Alec Mouri80863a62019-01-17 15:19:35 -08001921TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001922 sp<SurfaceControl> bufferLayer;
1923 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001924 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001925
1926 // color is ignored
1927 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001928 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001929}
1930
Alec Mouri80863a62019-01-17 15:19:35 -08001931TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001932 sp<SurfaceControl> layer;
1933 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001934 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001935
1936 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1937 {
1938 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001939 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001940 }
1941
1942 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1943 {
1944 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001945 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001946 }
1947}
1948
Alec Mouri80863a62019-01-17 15:19:35 -08001949TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001950 sp<SurfaceControl> layer;
1951 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001952 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1953 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001954
1955 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1956 {
1957 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001958 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1959 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001960 }
1961
1962 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1963 {
1964 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001965 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1966 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001967 }
1968
1969 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1970 {
1971 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001972 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1973 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001974 }
1975
1976 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1977 {
1978 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001979 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1980 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001981 }
1982
1983 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1984 {
1985 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001986 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1987 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001988 }
1989}
1990
Alec Mouri80863a62019-01-17 15:19:35 -08001991TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001992 sp<SurfaceControl> layer;
1993 ASSERT_NO_FATAL_FAILURE(
1994 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1995 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1996 Color::BLUE, Color::WHITE));
1997
1998 Transaction()
1999 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
2000 .setFrame(layer, Rect(0, 0, 32, 32))
2001 .apply();
2002 {
2003 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08002004 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2005 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002006 }
2007
2008 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
2009 {
2010 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08002011 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2012 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002013 }
2014
2015 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
2016 {
2017 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08002018 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2019 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002020 }
2021
2022 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
2023 {
2024 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08002025 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2026 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002027 }
2028
2029 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
2030 {
2031 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08002032 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2033 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002034 }
2035}
2036
Alec Mouri80863a62019-01-17 15:19:35 -08002037TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002038 sp<SurfaceControl> layer;
2039 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002040 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2041 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002042
2043 const float rot = M_SQRT1_2; // 45 degrees
2044 const float trans = M_SQRT2 * 16.0f;
2045 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
2046
Alec Mouri80863a62019-01-17 15:19:35 -08002047 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07002048 // check a 8x8 region inside each color
2049 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
2050 const int32_t halfL = 4;
2051 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
2052 };
2053 const int32_t unit = int32_t(trans / 2);
2054 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
2055 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
2056 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
2057 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
2058}
2059
Alec Mouri80863a62019-01-17 15:19:35 -08002060TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002061 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07002062 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2063 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002064
2065 // setMatrix is applied after any pending resize, unlike setPosition
2066 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
2067 {
2068 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002069 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002070 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07002071 shot->expectColor(rect, Color::RED);
2072 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002073 }
2074
Marissa Wall861616d2018-10-22 12:52:23 -07002075 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002076 {
2077 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07002078 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08002079 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002080 }
2081}
2082
Alec Mouri80863a62019-01-17 15:19:35 -08002083TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002084 sp<SurfaceControl> layer;
2085 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002086 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002087
2088 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
2089 Transaction()
2090 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
2091 .setSize(layer, 64, 64)
2092 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2093 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002094 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002095}
2096
Alec Mouri80863a62019-01-17 15:19:35 -08002097TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07002098 sp<SurfaceControl> layer;
2099 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002100 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2101 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07002102
2103 // XXX SCALE_CROP is not respected; calling setSize and
2104 // setOverrideScalingMode in separate transactions does not work
2105 // (b/69315456)
2106 Transaction()
2107 .setSize(layer, 64, 16)
2108 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2109 .apply();
2110 {
2111 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002112 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2113 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002114 }
2115}
2116
Dan Stoza000dd012018-08-01 13:31:52 -07002117TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2118 sp<SurfaceControl> layer;
2119 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2120
2121 sp<IBinder> handle = layer->getHandle();
2122 ASSERT_TRUE(handle != nullptr);
2123
2124 FrameStats frameStats;
2125 mClient->getLayerFrameStats(handle, &frameStats);
2126
2127 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2128}
2129
Alec Mouri80863a62019-01-17 15:19:35 -08002130TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002131 sp<SurfaceControl> layer;
2132 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002133 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002134 const Rect crop(8, 8, 24, 24);
2135
Marissa Wallf58c14b2018-07-24 10:50:43 -07002136 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002137 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002138 shot->expectColor(crop, Color::RED);
2139 shot->expectBorder(crop, Color::BLACK);
2140}
2141
Alec Mouri80863a62019-01-17 15:19:35 -08002142TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002143 sp<SurfaceControl> layer;
2144 ASSERT_NO_FATAL_FAILURE(
2145 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2146 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2147 const Rect crop(8, 8, 24, 24);
2148
2149 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002150 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002151 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2152 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002153}
2154
Alec Mouri80863a62019-01-17 15:19:35 -08002155TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002156 sp<SurfaceControl> layer;
2157 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002158 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002159
2160 {
2161 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002162 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002163 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002164 }
2165
2166 {
2167 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002168 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002169 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002170 }
2171}
2172
Alec Mouri80863a62019-01-17 15:19:35 -08002173TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002174 sp<SurfaceControl> layer;
2175 ASSERT_NO_FATAL_FAILURE(
2176 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2177 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2178
2179 {
2180 SCOPED_TRACE("empty rect");
2181 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002182 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002183 }
2184
2185 {
2186 SCOPED_TRACE("negative rect");
2187 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002188 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002189 }
2190}
2191
Alec Mouri80863a62019-01-17 15:19:35 -08002192TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002193 sp<SurfaceControl> layer;
2194 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002195 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002196
Marissa Wallf58c14b2018-07-24 10:50:43 -07002197 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002198 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002199 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2200 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2201}
2202
Alec Mouri80863a62019-01-17 15:19:35 -08002203TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002204 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002205 ASSERT_NO_FATAL_FAILURE(
2206 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002207 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002208 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002209 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2210 BufferUsage::COMPOSER_OVERLAY,
2211 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002212 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2213 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2214
2215 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002216
2217 Transaction().setBuffer(layer, buffer).apply();
2218
2219 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002220 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002221 {
2222 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002223 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002224 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2225 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002226 }
2227
2228 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002229 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002230 {
2231 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002232 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002233 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2234 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002235 }
2236
2237 // Fully out of buffer space bounds
2238 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2239 {
2240 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002241 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002242 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2243 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2244 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002245 }
2246}
2247
Alec Mouri80863a62019-01-17 15:19:35 -08002248TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002249 sp<SurfaceControl> layer;
2250 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002251 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002252
2253 const Point position(32, 32);
2254 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002255 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002256 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002257 shot->expectColor(crop + position, Color::RED);
2258 shot->expectBorder(crop + position, Color::BLACK);
2259}
2260
Alec Mouri80863a62019-01-17 15:19:35 -08002261TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002262 sp<SurfaceControl> layer;
2263 ASSERT_NO_FATAL_FAILURE(
2264 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2265 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2266
Marissa Wall861616d2018-10-22 12:52:23 -07002267 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002268 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002269 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002270 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002271 shot->expectColor(frame, Color::RED);
2272 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002273}
2274
Alec Mouri80863a62019-01-17 15:19:35 -08002275TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002276 sp<SurfaceControl> layer;
2277 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002278 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002279
Marissa Wall861616d2018-10-22 12:52:23 -07002280 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002281 Transaction()
2282 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002283 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002284 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002285 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002286 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2287 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2288}
2289
Alec Mouri80863a62019-01-17 15:19:35 -08002290TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002291 sp<SurfaceControl> layer;
2292 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002293 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002294
Marissa Wallf58c14b2018-07-24 10:50:43 -07002295 // setCrop_legacy is applied immediately by default, with or without resize pending
2296 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002297 {
2298 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002299 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002300 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2301 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2302 }
2303
Marissa Wall61c58622018-07-18 10:12:20 -07002304 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002305 {
2306 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002307 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002308 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2309 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2310 }
2311}
2312
Alec Mouri80863a62019-01-17 15:19:35 -08002313TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002314 sp<SurfaceControl> layer;
2315 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002316 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002317
Marissa Wallf58c14b2018-07-24 10:50:43 -07002318 // request setCrop_legacy to be applied with the next resize
2319 Transaction()
2320 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2321 .setGeometryAppliesWithResize(layer)
2322 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002323 {
2324 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002325 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002326 }
2327
Marissa Wallf58c14b2018-07-24 10:50:43 -07002328 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002329 {
2330 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002331 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002332 }
2333
2334 Transaction().setSize(layer, 16, 16).apply();
2335 {
2336 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002337 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002338 }
2339
2340 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002341 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002342 {
2343 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002344 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002345 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2346 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2347 }
2348}
2349
Alec Mouri80863a62019-01-17 15:19:35 -08002350TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002351 sp<SurfaceControl> layer;
2352 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002353 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002354
Marissa Wallf58c14b2018-07-24 10:50:43 -07002355 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002356 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002357 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002358 .setSize(layer, 16, 16)
2359 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2360 .setGeometryAppliesWithResize(layer)
2361 .apply();
2362 {
2363 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002364 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002365 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2366 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2367 }
2368
2369 // XXX crop is never latched without other geometry change (b/69315677)
2370 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002371 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002372 Transaction().setPosition(layer, 0, 0).apply();
2373 {
2374 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002375 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002376 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2377 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2378 }
2379}
2380
Alec Mouri80863a62019-01-17 15:19:35 -08002381TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002382 sp<SurfaceControl> layer;
2383 ASSERT_NO_FATAL_FAILURE(
2384 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2385 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2386 const Rect frame(8, 8, 24, 24);
2387
2388 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002389 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002390 shot->expectColor(frame, Color::RED);
2391 shot->expectBorder(frame, Color::BLACK);
2392}
2393
Alec Mouri80863a62019-01-17 15:19:35 -08002394TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002395 sp<SurfaceControl> layer;
2396 ASSERT_NO_FATAL_FAILURE(
2397 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2398 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2399
Marissa Wall61c58622018-07-18 10:12:20 -07002400 {
Marissa Wall861616d2018-10-22 12:52:23 -07002401 SCOPED_TRACE("empty rect");
2402 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002403 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002404 }
2405
Marissa Wall61c58622018-07-18 10:12:20 -07002406 {
Marissa Wall861616d2018-10-22 12:52:23 -07002407 SCOPED_TRACE("negative rect");
2408 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002409 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002410 }
2411}
2412
Alec Mouri80863a62019-01-17 15:19:35 -08002413TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002414 sp<SurfaceControl> layer;
2415 ASSERT_NO_FATAL_FAILURE(
2416 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2417 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2418
2419 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002420 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002421 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2422 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002423}
2424
Alec Mouri80863a62019-01-17 15:19:35 -08002425TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002426 sp<SurfaceControl> parent, child;
2427 ASSERT_NO_FATAL_FAILURE(
2428 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2429 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2430 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2431
2432 ASSERT_NO_FATAL_FAILURE(
2433 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2434 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2435
2436 Transaction().reparent(child, parent->getHandle()).apply();
2437
2438 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002439 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002440 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2441 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2442}
2443
Alec Mouri80863a62019-01-17 15:19:35 -08002444TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002445 sp<SurfaceControl> parent, child;
2446 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2447 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2448
2449 ASSERT_NO_FATAL_FAILURE(
2450 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2451 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2452
2453 Transaction().reparent(child, parent->getHandle()).apply();
2454
2455 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002456 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002457 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2458 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2459}
2460
Alec Mouri80863a62019-01-17 15:19:35 -08002461TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002462 sp<SurfaceControl> layer;
2463 ASSERT_NO_FATAL_FAILURE(
2464 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2465 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2466 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2467
2468 std::this_thread::sleep_for(500ms);
2469
2470 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2471
Alec Mouri80863a62019-01-17 15:19:35 -08002472 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002473 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2474 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2475}
2476
Alec Mouri80863a62019-01-17 15:19:35 -08002477TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002478 sp<SurfaceControl> parent, child;
2479 ASSERT_NO_FATAL_FAILURE(
2480 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2481 ASSERT_NO_FATAL_FAILURE(
2482 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2483 Transaction().reparent(child, parent->getHandle()).apply();
2484
2485 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2486 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2487
2488 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2489 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2490
Alec Mouri80863a62019-01-17 15:19:35 -08002491 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002492 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2493 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2494 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2495}
2496
Alec Mouri80863a62019-01-17 15:19:35 -08002497TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002498 sp<SurfaceControl> layer;
2499 ASSERT_NO_FATAL_FAILURE(
2500 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2501
2502 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2503
Alec Mouri80863a62019-01-17 15:19:35 -08002504 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002505 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2506 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002507}
2508
Alec Mouri80863a62019-01-17 15:19:35 -08002509TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002510 sp<SurfaceControl> layer;
2511 ASSERT_NO_FATAL_FAILURE(
2512 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2513
2514 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2515
2516 {
2517 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002518 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002519 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2520 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002521 }
2522
2523 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2524
2525 {
2526 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002527 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002528 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2529 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002530 }
2531
2532 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2533
2534 {
2535 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002536 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002537 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2538 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002539 }
2540}
2541
Alec Mouri80863a62019-01-17 15:19:35 -08002542TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002543 sp<SurfaceControl> layer1;
2544 ASSERT_NO_FATAL_FAILURE(
2545 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2546
2547 sp<SurfaceControl> layer2;
2548 ASSERT_NO_FATAL_FAILURE(
2549 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2550
2551 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2552
Marissa Wall861616d2018-10-22 12:52:23 -07002553 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002554 {
2555 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002556 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002557 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2558 }
2559
2560 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2561
Marissa Wall861616d2018-10-22 12:52:23 -07002562 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002563 {
2564 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002565 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002566 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2567 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2568 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2569 }
2570
2571 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2572 {
2573 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002574 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002575 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2576 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2577 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2578 }
2579
2580 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2581
2582 {
2583 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002584 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002585 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2586 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2587 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2588 }
2589}
2590
Valerie Haua6b15a12019-02-05 14:16:30 -08002591TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002592 sp<SurfaceControl> layer;
2593 ASSERT_NO_FATAL_FAILURE(
2594 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2595
2596 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2597
2598 std::array<sp<GraphicBuffer>, 10> buffers;
2599
2600 size_t idx = 0;
2601 for (auto& buffer : buffers) {
2602 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2603 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2604 BufferUsage::COMPOSER_OVERLAY,
2605 "test");
2606 Color color = colors[idx % colors.size()];
2607 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2608 idx++;
2609 }
2610
2611 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2612 // cache is working.
2613 idx = 0;
2614 for (auto& buffer : buffers) {
2615 for (int i = 0; i < 2; i++) {
2616 Transaction().setBuffer(layer, buffer).apply();
2617
2618 Color color = colors[idx % colors.size()];
2619 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002620 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2621 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002622 }
2623 idx++;
2624 }
2625}
2626
Valerie Haua6b15a12019-02-05 14:16:30 -08002627TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002628 sp<SurfaceControl> layer;
2629 ASSERT_NO_FATAL_FAILURE(
2630 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2631
2632 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2633
2634 std::array<sp<GraphicBuffer>, 70> buffers;
2635
2636 size_t idx = 0;
2637 for (auto& buffer : buffers) {
2638 buffer = 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 Color color = colors[idx % colors.size()];
2643 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2644 idx++;
2645 }
2646
2647 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2648 // cache is working.
2649 idx = 0;
2650 for (auto& buffer : buffers) {
2651 for (int i = 0; i < 2; i++) {
2652 Transaction().setBuffer(layer, buffer).apply();
2653
2654 Color color = colors[idx % colors.size()];
2655 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002656 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2657 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002658 }
2659 idx++;
2660 }
2661}
2662
Valerie Haua6b15a12019-02-05 14:16:30 -08002663TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002664 sp<SurfaceControl> layer;
2665 ASSERT_NO_FATAL_FAILURE(
2666 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2667
2668 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2669
2670 std::array<sp<GraphicBuffer>, 65> buffers;
2671
2672 size_t idx = 0;
2673 for (auto& buffer : buffers) {
2674 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2675 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2676 BufferUsage::COMPOSER_OVERLAY,
2677 "test");
2678 Color color = colors[idx % colors.size()];
2679 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2680 idx++;
2681 }
2682
2683 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2684 // cache is working.
2685 idx = 0;
2686 for (auto& buffer : buffers) {
2687 for (int i = 0; i < 2; i++) {
2688 Transaction().setBuffer(layer, buffer).apply();
2689
2690 Color color = colors[idx % colors.size()];
2691 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002692 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2693 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002694 }
2695 if (idx == 0) {
2696 buffers[0].clear();
2697 }
2698 idx++;
2699 }
2700}
2701
Alec Mouri80863a62019-01-17 15:19:35 -08002702TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002703 sp<SurfaceControl> layer;
2704 ASSERT_NO_FATAL_FAILURE(
2705 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2706
2707 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2708 Color::BLUE, Color::WHITE));
2709
Marissa Wall861616d2018-10-22 12:52:23 -07002710 Transaction()
2711 .setFrame(layer, Rect(0, 0, 32, 32))
2712 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2713 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002714
Alec Mouri80863a62019-01-17 15:19:35 -08002715 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2716 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002717}
2718
Alec Mouri80863a62019-01-17 15:19:35 -08002719TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002720 sp<SurfaceControl> layer;
2721 ASSERT_NO_FATAL_FAILURE(
2722 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2723
2724 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2725 Color::BLUE, Color::WHITE));
2726
Marissa Wall861616d2018-10-22 12:52:23 -07002727 Transaction()
2728 .setFrame(layer, Rect(0, 0, 32, 32))
2729 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2730 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002731
Alec Mouri80863a62019-01-17 15:19:35 -08002732 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2733 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002734}
2735
Alec Mouri80863a62019-01-17 15:19:35 -08002736TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002737 sp<SurfaceControl> layer;
2738 ASSERT_NO_FATAL_FAILURE(
2739 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2740
2741 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2742 Color::BLUE, Color::WHITE));
2743
Marissa Wall861616d2018-10-22 12:52:23 -07002744 Transaction()
2745 .setFrame(layer, Rect(0, 0, 32, 32))
2746 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2747 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002748
Alec Mouri80863a62019-01-17 15:19:35 -08002749 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2750 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002751}
2752
2753TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2754 sp<SurfaceControl> layer;
2755 ASSERT_NO_FATAL_FAILURE(
2756 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2757
2758 Transaction().setTransformToDisplayInverse(layer, false).apply();
2759
2760 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2761
2762 Transaction().setTransformToDisplayInverse(layer, true).apply();
2763}
2764
Alec Mouri80863a62019-01-17 15:19:35 -08002765TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002766 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002767 Transaction transaction;
2768 ASSERT_NO_FATAL_FAILURE(
2769 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2770
2771 sp<GraphicBuffer> buffer =
2772 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2773 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2774 BufferUsage::COMPOSER_OVERLAY,
2775 "test");
2776 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2777
2778 sp<Fence> fence;
2779 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2780 GTEST_SUCCEED() << "test not supported";
2781 return;
2782 }
2783
2784 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2785
2786 status_t status = fence->wait(1000);
2787 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2788 std::this_thread::sleep_for(200ms);
2789
Alec Mouri80863a62019-01-17 15:19:35 -08002790 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002791 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2792 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002793}
2794
Alec Mouri80863a62019-01-17 15:19:35 -08002795TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002796 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002797 ASSERT_NO_FATAL_FAILURE(
2798 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2799
2800 sp<GraphicBuffer> buffer =
2801 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2802 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2803 BufferUsage::COMPOSER_OVERLAY,
2804 "test");
2805 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2806
Marissa Wallfda30bb2018-10-12 11:34:28 -07002807 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002808
2809 Transaction()
2810 .setBuffer(layer, buffer)
2811 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002812 .apply();
2813
Alec Mouri80863a62019-01-17 15:19:35 -08002814 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002815 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2816 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002817}
2818
Alec Mouri80863a62019-01-17 15:19:35 -08002819TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002820 sp<SurfaceControl> layer;
2821 ASSERT_NO_FATAL_FAILURE(
2822 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2823
2824 sp<GraphicBuffer> buffer =
2825 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2826 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2827 BufferUsage::COMPOSER_OVERLAY,
2828 "test");
2829 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2830
2831 Transaction()
2832 .setBuffer(layer, buffer)
2833 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002834 .apply();
2835
Alec Mouri80863a62019-01-17 15:19:35 -08002836 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002837 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2838 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002839}
2840
Alec Mouri80863a62019-01-17 15:19:35 -08002841TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002842 sp<SurfaceControl> layer;
2843 ASSERT_NO_FATAL_FAILURE(
2844 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2845
2846 sp<GraphicBuffer> buffer =
2847 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2848 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2849 BufferUsage::COMPOSER_OVERLAY,
2850 "test");
2851 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2852
2853 HdrMetadata hdrMetadata;
2854 hdrMetadata.validTypes = 0;
2855 Transaction()
2856 .setBuffer(layer, buffer)
2857 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002858 .apply();
2859
Alec Mouri80863a62019-01-17 15:19:35 -08002860 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002861 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2862 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002863}
2864
Alec Mouri80863a62019-01-17 15:19:35 -08002865TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002866 sp<SurfaceControl> layer;
2867 ASSERT_NO_FATAL_FAILURE(
2868 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2869
2870 sp<GraphicBuffer> buffer =
2871 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2872 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2873 BufferUsage::COMPOSER_OVERLAY,
2874 "test");
2875 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2876
2877 Region region;
2878 region.set(32, 32);
2879 Transaction()
2880 .setBuffer(layer, buffer)
2881 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002882 .apply();
2883
Alec Mouri80863a62019-01-17 15:19:35 -08002884 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002885 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2886 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002887}
2888
Alec Mouri80863a62019-01-17 15:19:35 -08002889TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002890 sp<SurfaceControl> layer;
2891 ASSERT_NO_FATAL_FAILURE(
2892 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2893
2894 sp<GraphicBuffer> buffer =
2895 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2896 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2897 BufferUsage::COMPOSER_OVERLAY,
2898 "test");
2899 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2900
2901 Transaction()
2902 .setBuffer(layer, buffer)
2903 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002904 .apply();
2905
Alec Mouri80863a62019-01-17 15:19:35 -08002906 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002907 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2908 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002909}
2910
2911TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2912 sp<SurfaceControl> layer;
2913 ASSERT_NO_FATAL_FAILURE(
2914 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2915
2916 // verify this doesn't cause a crash
2917 Transaction().setSidebandStream(layer, nullptr).apply();
2918}
2919
Robert Carr54cf5b12019-01-25 14:02:28 -08002920TEST_F(LayerTransactionTest, ReparentToSelf) {
2921 sp<SurfaceControl> layer;
2922 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2923 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2924 Transaction().reparent(layer, layer->getHandle()).apply();
2925
2926 {
2927 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2928 // to still be functioning.
2929 SCOPED_TRACE("after reparent to self");
2930 const Rect rect(0, 0, 32, 32);
2931 auto shot = screenshot();
2932 shot->expectColor(rect, Color::RED);
2933 shot->expectBorder(rect, Color::BLACK);
2934 }
2935}
2936
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002937class ColorTransformHelper {
2938public:
2939 static void DegammaColorSingle(half& s) {
2940 if (s <= 0.03928f)
2941 s = s / 12.92f;
2942 else
2943 s = pow((s + 0.055f) / 1.055f, 2.4f);
2944 }
2945
2946 static void DegammaColor(half3& color) {
2947 DegammaColorSingle(color.r);
2948 DegammaColorSingle(color.g);
2949 DegammaColorSingle(color.b);
2950 }
2951
2952 static void GammaColorSingle(half& s) {
2953 if (s <= 0.0031308f) {
2954 s = s * 12.92f;
2955 } else {
2956 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2957 }
2958 }
2959
2960 static void GammaColor(half3& color) {
2961 GammaColorSingle(color.r);
2962 GammaColorSingle(color.g);
2963 GammaColorSingle(color.b);
2964 }
2965
2966 static void applyMatrix(half3& color, const mat3& mat) {
2967 half3 ret = half3(0);
2968
2969 for (int i = 0; i < 3; i++) {
2970 for (int j = 0; j < 3; j++) {
2971 ret[i] = ret[i] + color[j] * mat[j][i];
2972 }
2973 }
2974 color = ret;
2975 }
2976};
2977
Alec Mouri80863a62019-01-17 15:19:35 -08002978TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002979 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002980 ASSERT_NO_FATAL_FAILURE(colorLayer =
2981 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2982 ISurfaceComposerClient::eFXSurfaceColor));
2983 Transaction()
2984 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2985 .setLayer(colorLayer, mLayerZBase + 1)
2986 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002987 {
2988 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002989 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002990 }
2991
2992 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002993 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002994 mat3 matrix;
2995 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2996 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2997 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002998
2999 // degamma before applying the matrix
3000 if (mColorManagementUsed) {
3001 ColorTransformHelper::DegammaColor(expected);
3002 }
3003
3004 ColorTransformHelper::applyMatrix(expected, matrix);
3005
3006 if (mColorManagementUsed) {
3007 ColorTransformHelper::GammaColor(expected);
3008 }
3009
3010 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3011 uint8_t(expected.b * 255), 255};
3012
3013 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3014 // channel) should be less than one
3015 const uint8_t tolerance = 1;
3016
Peiyong Lind3788632018-09-18 16:01:31 -07003017 Transaction().setColor(colorLayer, color)
3018 .setColorTransform(colorLayer, matrix, vec3()).apply();
3019 {
3020 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003021 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07003022 }
3023}
3024
Alec Mouri80863a62019-01-17 15:19:35 -08003025TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08003026 sp<SurfaceControl> parentLayer;
3027 sp<SurfaceControl> colorLayer;
3028 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3029 0 /* buffer height */,
3030 ISurfaceComposerClient::eFXSurfaceContainer));
3031 ASSERT_NO_FATAL_FAILURE(
3032 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3033 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3034
3035 Transaction()
3036 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3037 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3038 .setLayer(parentLayer, mLayerZBase + 1)
3039 .apply();
3040 {
3041 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003042 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003043 }
3044
3045 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3046 half3 expected = color;
3047 mat3 matrix;
3048 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
3049 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
3050 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
3051
3052 // degamma before applying the matrix
3053 if (mColorManagementUsed) {
3054 ColorTransformHelper::DegammaColor(expected);
3055 }
3056
3057 ColorTransformHelper::applyMatrix(expected, matrix);
3058
3059 if (mColorManagementUsed) {
3060 ColorTransformHelper::GammaColor(expected);
3061 }
3062
3063 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3064 uint8_t(expected.b * 255), 255};
3065
3066 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3067 // channel) should be less than one
3068 const uint8_t tolerance = 1;
3069
3070 Transaction()
3071 .setColor(colorLayer, color)
3072 .setColorTransform(parentLayer, matrix, vec3())
3073 .apply();
3074 {
3075 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003076 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003077 }
3078}
3079
Alec Mouri80863a62019-01-17 15:19:35 -08003080TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08003081 sp<SurfaceControl> parentLayer;
3082 sp<SurfaceControl> colorLayer;
3083 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3084 0 /* buffer height */,
3085 ISurfaceComposerClient::eFXSurfaceContainer));
3086 ASSERT_NO_FATAL_FAILURE(
3087 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3088 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3089
3090 Transaction()
3091 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3092 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3093 .setLayer(parentLayer, mLayerZBase + 1)
3094 .apply();
3095 {
3096 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003097 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003098 }
3099
3100 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3101 half3 expected = color;
3102 mat3 matrixChild;
3103 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
3104 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
3105 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
3106 mat3 matrixParent;
3107 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
3108 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
3109 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3110
3111 // degamma before applying the matrix
3112 if (mColorManagementUsed) {
3113 ColorTransformHelper::DegammaColor(expected);
3114 }
3115
3116 ColorTransformHelper::applyMatrix(expected, matrixChild);
3117 ColorTransformHelper::applyMatrix(expected, matrixParent);
3118
3119 if (mColorManagementUsed) {
3120 ColorTransformHelper::GammaColor(expected);
3121 }
3122
3123 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3124 uint8_t(expected.b * 255), 255};
3125
3126 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3127 // channel) should be less than one
3128 const uint8_t tolerance = 1;
3129
3130 Transaction()
3131 .setColor(colorLayer, color)
3132 .setColorTransform(parentLayer, matrixParent, vec3())
3133 .setColorTransform(colorLayer, matrixChild, vec3())
3134 .apply();
3135 {
3136 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003137 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003138 }
3139}
3140
Marissa Wall80d94ad2019-01-18 16:04:36 -08003141struct CallbackData {
3142 CallbackData() = default;
3143 CallbackData(nsecs_t time, const sp<Fence>& fence,
3144 const std::vector<SurfaceControlStats>& stats)
3145 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3146
3147 nsecs_t latchTime;
3148 sp<Fence> presentFence;
3149 std::vector<SurfaceControlStats> surfaceControlStats;
3150};
3151
Marissa Wallfda30bb2018-10-12 11:34:28 -07003152class ExpectedResult {
3153public:
3154 enum Transaction {
3155 NOT_PRESENTED = 0,
3156 PRESENTED,
3157 };
3158
3159 enum Buffer {
3160 NOT_ACQUIRED = 0,
3161 ACQUIRED,
3162 };
3163
3164 enum PreviousBuffer {
3165 NOT_RELEASED = 0,
3166 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003167 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003168 };
3169
3170 void reset() {
3171 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3172 mExpectedSurfaceResults.clear();
3173 }
3174
3175 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003176 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003177 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3178 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003179 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180 std::forward_as_tuple(bufferResult, previousBufferResult));
3181 }
3182
3183 void addSurfaces(ExpectedResult::Transaction transactionResult,
3184 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003185 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003186 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3187 for (const auto& layer : layers) {
3188 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3189 }
3190 }
3191
Marissa Wall17b4e452018-12-26 16:32:34 -08003192 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3193 mExpectedPresentTime = expectedPresentTime;
3194 }
3195
Marissa Wall80d94ad2019-01-18 16:04:36 -08003196 void verifyCallbackData(const CallbackData& callbackData) const {
3197 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003198 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3199 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003200 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003201 if (mExpectedPresentTime >= 0) {
3202 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3203 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3204 // if the panel is running at 30 hz, at the worst case, our expected time just
3205 // misses vsync and we have to wait another 33.3ms
3206 ASSERT_LE(presentFence->getSignalTime(),
3207 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3208 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003209 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003210 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003211 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3212 }
3213
Marissa Wall80d94ad2019-01-18 16:04:36 -08003214 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003215 << "wrong number of surfaces";
3216
Marissa Wall80d94ad2019-01-18 16:04:36 -08003217 for (const auto& stats : surfaceControlStats) {
3218 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3219
Marissa Wallfda30bb2018-10-12 11:34:28 -07003220 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3221 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3222 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003223 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003224 }
3225 }
3226
3227private:
3228 class ExpectedSurfaceResult {
3229 public:
3230 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3231 ExpectedResult::PreviousBuffer previousBufferResult)
3232 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3233
Marissa Wall80d94ad2019-01-18 16:04:36 -08003234 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3235 nsecs_t latchTime) const {
3236 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003237
3238 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3239 << "bad acquire time";
3240 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003241
3242 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3243 ASSERT_NE(previousReleaseFence, nullptr)
3244 << "failed to set release prev buffer fence";
3245 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3246 ASSERT_EQ(previousReleaseFence, nullptr)
3247 << "should not have set released prev buffer fence";
3248 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003249 }
3250
3251 private:
3252 ExpectedResult::Buffer mBufferResult;
3253 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3254 };
3255
Marissa Wall80d94ad2019-01-18 16:04:36 -08003256 struct SCHash {
3257 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3258 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003259 }
3260 };
3261 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003262 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003263 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003264};
3265
3266class CallbackHelper {
3267public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003268 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3269 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003270 if (!callbackContext) {
3271 ALOGE("failed to get callback context");
3272 }
3273 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3274 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003275 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003276 helper->mConditionVariable.notify_all();
3277 }
3278
Marissa Wall80d94ad2019-01-18 16:04:36 -08003279 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003280 std::unique_lock lock(mMutex);
3281
Marissa Wall80d94ad2019-01-18 16:04:36 -08003282 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003283 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3284 std::cv_status::timeout)
3285 << "did not receive callback";
3286 }
3287
Marissa Wall80d94ad2019-01-18 16:04:36 -08003288 *outData = std::move(mCallbackDataQueue.front());
3289 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003290 }
3291
3292 void verifyFinalState() {
3293 // Wait to see if there are extra callbacks
3294 std::this_thread::sleep_for(500ms);
3295
3296 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003297 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3298 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003299 }
3300
3301 void* getContext() { return static_cast<void*>(this); }
3302
3303 std::mutex mMutex;
3304 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003305 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003306};
3307
3308class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003309public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003310 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003311 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003312 }
3313
Marissa Wall713b63f2018-10-17 15:42:43 -07003314 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003315 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3316 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003317 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003318 sp<GraphicBuffer> buffer;
3319 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003320 if (setBuffer) {
3321 int err = getBuffer(&buffer, &fence);
3322 if (err != NO_ERROR) {
3323 return err;
3324 }
3325
3326 transaction.setBuffer(layer, buffer);
3327 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003328 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003329
Valerie Hauaa194562019-02-05 16:21:38 -08003330 if (setBackgroundColor) {
3331 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3332 ui::Dataspace::UNKNOWN);
3333 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003334 }
3335
3336 transaction.addTransactionCompletedCallback(callbackHelper->function,
3337 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003338 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003339 }
3340
Marissa Wall861616d2018-10-22 12:52:23 -07003341 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3342 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003343 CallbackData callbackData;
3344 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3345 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003346
3347 if (finalState) {
3348 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3349 }
3350 }
3351
Marissa Wall861616d2018-10-22 12:52:23 -07003352 static void waitForCallbacks(CallbackHelper& helper,
3353 const std::vector<ExpectedResult>& expectedResults,
3354 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003355 for (const auto& expectedResult : expectedResults) {
3356 waitForCallback(helper, expectedResult);
3357 }
3358 if (finalState) {
3359 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3360 }
3361 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003362};
3363
Valerie Hauaa194562019-02-05 16:21:38 -08003364TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003365 sp<SurfaceControl> layer;
3366 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3367
3368 Transaction transaction;
3369 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003370 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003371 if (err) {
3372 GTEST_SUCCEED() << "test not supported";
3373 return;
3374 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003375
3376 transaction.apply();
3377
3378 ExpectedResult expected;
3379 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3380 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3381}
3382
Valerie Hauaa194562019-02-05 16:21:38 -08003383TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003384 sp<SurfaceControl> layer;
3385 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3386
3387 Transaction transaction;
3388 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003389 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003390 if (err) {
3391 GTEST_SUCCEED() << "test not supported";
3392 return;
3393 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003394
Marissa Wall861616d2018-10-22 12:52:23 -07003395 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003396
3397 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003398 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3399 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003400 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3401}
3402
Valerie Hauaa194562019-02-05 16:21:38 -08003403TEST_F(LayerCallbackTest, BufferNoColor) {
3404 sp<SurfaceControl> layer;
3405 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3406
3407 Transaction transaction;
3408 CallbackHelper callback;
3409 int err = fillTransaction(transaction, &callback, layer, true, false);
3410 if (err) {
3411 GTEST_SUCCEED() << "test not supported";
3412 return;
3413 }
3414
3415 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3416
3417 ExpectedResult expected;
3418 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3419 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3420}
3421
3422TEST_F(LayerCallbackTest, NoBufferColor) {
3423 sp<SurfaceControl> layer;
3424 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3425
3426 Transaction transaction;
3427 CallbackHelper callback;
3428 int err = fillTransaction(transaction, &callback, layer, false, true);
3429 if (err) {
3430 GTEST_SUCCEED() << "test not supported";
3431 return;
3432 }
3433
3434 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3435
3436 ExpectedResult expected;
3437 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3438 ExpectedResult::Buffer::NOT_ACQUIRED);
3439 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3440}
3441
Marissa Wallfda30bb2018-10-12 11:34:28 -07003442TEST_F(LayerCallbackTest, NoStateChange) {
3443 Transaction transaction;
3444 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003445 int err = fillTransaction(transaction, &callback);
3446 if (err) {
3447 GTEST_SUCCEED() << "test not supported";
3448 return;
3449 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003450
3451 transaction.apply();
3452
3453 ExpectedResult expected;
3454 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3455}
3456
3457TEST_F(LayerCallbackTest, OffScreen) {
3458 sp<SurfaceControl> layer;
3459 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3460
3461 Transaction transaction;
3462 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003463 int err = fillTransaction(transaction, &callback, layer);
3464 if (err) {
3465 GTEST_SUCCEED() << "test not supported";
3466 return;
3467 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003468
Marissa Wall861616d2018-10-22 12:52:23 -07003469 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003470
3471 ExpectedResult expected;
3472 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3473 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3474}
3475
Valerie Hauaa194562019-02-05 16:21:38 -08003476TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003477 sp<SurfaceControl> layer1, layer2;
3478 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3479 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3480
3481 Transaction transaction1, transaction2;
3482 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003483 int err = fillTransaction(transaction1, &callback1, layer1);
3484 if (err) {
3485 GTEST_SUCCEED() << "test not supported";
3486 return;
3487 }
3488 err = fillTransaction(transaction2, &callback2, layer2);
3489 if (err) {
3490 GTEST_SUCCEED() << "test not supported";
3491 return;
3492 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003493
Marissa Wall861616d2018-10-22 12:52:23 -07003494 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3495 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003496
3497 ExpectedResult expected;
3498 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3499 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3500 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3501}
3502
Valerie Hauaa194562019-02-05 16:21:38 -08003503TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3504 sp<SurfaceControl> layer1, layer2;
3505 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3506 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3507
3508 Transaction transaction1, transaction2;
3509 CallbackHelper callback1, callback2;
3510 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3511 if (err) {
3512 GTEST_SUCCEED() << "test not supported";
3513 return;
3514 }
3515 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3516 if (err) {
3517 GTEST_SUCCEED() << "test not supported";
3518 return;
3519 }
3520
3521 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3522 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3523
3524 ExpectedResult expected;
3525 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3526 ExpectedResult::Buffer::NOT_ACQUIRED);
3527 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3528 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3529}
3530
3531TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3532 sp<SurfaceControl> layer1, layer2;
3533 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3534 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3535
3536 Transaction transaction1, transaction2;
3537 CallbackHelper callback1, callback2;
3538 int err = fillTransaction(transaction1, &callback1, layer1);
3539 if (err) {
3540 GTEST_SUCCEED() << "test not supported";
3541 return;
3542 }
3543 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3544 if (err) {
3545 GTEST_SUCCEED() << "test not supported";
3546 return;
3547 }
3548
3549 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3550 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3551
3552 ExpectedResult expected;
3553 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3554 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3555 ExpectedResult::Buffer::NOT_ACQUIRED);
3556 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3557 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3558}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003559TEST_F(LayerCallbackTest, Merge_SameCallback) {
3560 sp<SurfaceControl> layer1, layer2;
3561 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3562 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3563
3564 Transaction transaction1, transaction2;
3565 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003566 int err = fillTransaction(transaction1, &callback, layer1);
3567 if (err) {
3568 GTEST_SUCCEED() << "test not supported";
3569 return;
3570 }
3571 err = fillTransaction(transaction2, &callback, layer2);
3572 if (err) {
3573 GTEST_SUCCEED() << "test not supported";
3574 return;
3575 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003576
3577 transaction2.merge(std::move(transaction1)).apply();
3578
3579 ExpectedResult expected;
3580 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3581 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3582 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3583}
3584
3585TEST_F(LayerCallbackTest, Merge_SameLayer) {
3586 sp<SurfaceControl> layer;
3587 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3588
3589 Transaction transaction1, transaction2;
3590 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003591 int err = fillTransaction(transaction1, &callback1, layer);
3592 if (err) {
3593 GTEST_SUCCEED() << "test not supported";
3594 return;
3595 }
3596 err = fillTransaction(transaction2, &callback2, layer);
3597 if (err) {
3598 GTEST_SUCCEED() << "test not supported";
3599 return;
3600 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003601
3602 transaction2.merge(std::move(transaction1)).apply();
3603
3604 ExpectedResult expected;
3605 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3606 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3607 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3608}
3609
Marissa Wallfda30bb2018-10-12 11:34:28 -07003610TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3611 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3612 client2(new SurfaceComposerClient);
3613
3614 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3615 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3616
3617 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003618 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003619 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003620 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003621 ISurfaceComposerClient::eFXSurfaceBufferState));
3622
3623 Transaction transaction1, transaction2;
3624 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003625 int err = fillTransaction(transaction1, &callback1, layer1);
3626 if (err) {
3627 GTEST_SUCCEED() << "test not supported";
3628 return;
3629 }
3630 err = fillTransaction(transaction2, &callback2, layer2);
3631 if (err) {
3632 GTEST_SUCCEED() << "test not supported";
3633 return;
3634 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003635
Marissa Wall861616d2018-10-22 12:52:23 -07003636 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3637 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003638
3639 ExpectedResult expected;
3640 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3641 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3642 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3643}
3644
3645TEST_F(LayerCallbackTest, MultipleTransactions) {
3646 sp<SurfaceControl> layer;
3647 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3648
3649 Transaction transaction;
3650 CallbackHelper callback;
3651 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003652 int err = fillTransaction(transaction, &callback, layer);
3653 if (err) {
3654 GTEST_SUCCEED() << "test not supported";
3655 return;
3656 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003657
3658 transaction.apply();
3659
3660 ExpectedResult expected;
3661 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003662 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003663 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3664 : ExpectedResult::PreviousBuffer::RELEASED);
3665 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3666 }
3667 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3668}
3669
3670TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3671 sp<SurfaceControl> layer;
3672 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3673
3674 Transaction transaction;
3675 CallbackHelper callback;
3676 for (size_t i = 0; i < 10; i++) {
3677 ExpectedResult expected;
3678
3679 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003680 int err = fillTransaction(transaction, &callback, layer);
3681 if (err) {
3682 GTEST_SUCCEED() << "test not supported";
3683 return;
3684 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003685 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3686 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003687 int err = fillTransaction(transaction, &callback);
3688 if (err) {
3689 GTEST_SUCCEED() << "test not supported";
3690 return;
3691 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003692 }
3693
3694 transaction.apply();
3695
3696 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3697 }
3698 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3699}
3700
3701TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3702 sp<SurfaceControl> layer;
3703 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3704
3705 Transaction transaction;
3706 CallbackHelper callback;
3707 for (size_t i = 0; i < 10; i++) {
3708 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003709 int err = fillTransaction(transaction, &callback, layer);
3710 if (err) {
3711 GTEST_SUCCEED() << "test not supported";
3712 return;
3713 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003714 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003715 int err = fillTransaction(transaction, &callback);
3716 if (err) {
3717 GTEST_SUCCEED() << "test not supported";
3718 return;
3719 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003720 }
3721
Marissa Wall861616d2018-10-22 12:52:23 -07003722 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003723
3724 ExpectedResult expected;
3725 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3726 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003727 layer,
3728 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3729 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003730 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3731 }
3732 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3733}
3734
3735TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3736 sp<SurfaceControl> layer1, layer2;
3737 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3738 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3739
3740 Transaction transaction1, transaction2;
3741 CallbackHelper callback1, callback2;
3742 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003743 int err = fillTransaction(transaction1, &callback1, layer1);
3744 if (err) {
3745 GTEST_SUCCEED() << "test not supported";
3746 return;
3747 }
3748 err = fillTransaction(transaction2, &callback2, layer2);
3749 if (err) {
3750 GTEST_SUCCEED() << "test not supported";
3751 return;
3752 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003753
Marissa Wall861616d2018-10-22 12:52:23 -07003754 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3755 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003756
3757 ExpectedResult expected;
3758 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003759 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003760 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3761 : ExpectedResult::PreviousBuffer::RELEASED);
3762 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3763 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3764 }
3765 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3766 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3767}
3768
3769TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3770 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3771 client2(new SurfaceComposerClient);
3772 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3773 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3774
3775 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003776 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003777 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003778 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003779 ISurfaceComposerClient::eFXSurfaceBufferState));
3780
3781 Transaction transaction1, transaction2;
3782 CallbackHelper callback1, callback2;
3783 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003784 int err = fillTransaction(transaction1, &callback1, layer1);
3785 if (err) {
3786 GTEST_SUCCEED() << "test not supported";
3787 return;
3788 }
3789 err = fillTransaction(transaction2, &callback2, layer2);
3790 if (err) {
3791 GTEST_SUCCEED() << "test not supported";
3792 return;
3793 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003794
Marissa Wall861616d2018-10-22 12:52:23 -07003795 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3796 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003797
3798 ExpectedResult expected;
3799 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003800 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003801 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3802 : ExpectedResult::PreviousBuffer::RELEASED);
3803 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3804 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3805 }
3806 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3807 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3808}
3809
3810TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3811 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3812 client2(new SurfaceComposerClient);
3813 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3814 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3815
3816 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003817 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003818 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003819 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003820 ISurfaceComposerClient::eFXSurfaceBufferState));
3821
3822 Transaction transaction1, transaction2;
3823 CallbackHelper callback1, callback2;
3824
3825 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003826 int err = fillTransaction(transaction1, &callback1, layer1);
3827 if (err) {
3828 GTEST_SUCCEED() << "test not supported";
3829 return;
3830 }
3831 err = fillTransaction(transaction2, &callback2, layer2);
3832 if (err) {
3833 GTEST_SUCCEED() << "test not supported";
3834 return;
3835 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003836
Marissa Wall861616d2018-10-22 12:52:23 -07003837 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3838 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003839
3840 ExpectedResult expected;
3841 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3842 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3843 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3844 expected.reset();
3845
3846 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003847 err = fillTransaction(transaction1, &callback1);
3848 if (err) {
3849 GTEST_SUCCEED() << "test not supported";
3850 return;
3851 }
3852 err = fillTransaction(transaction2, &callback2);
3853 if (err) {
3854 GTEST_SUCCEED() << "test not supported";
3855 return;
3856 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003857
3858 transaction2.merge(std::move(transaction1)).apply();
3859
3860 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3861 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3862}
3863
3864TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3865 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3866 client2(new SurfaceComposerClient);
3867
3868 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3869 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3870
3871 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003872 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003873 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003874 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003875 ISurfaceComposerClient::eFXSurfaceBufferState));
3876
3877 Transaction transaction1, transaction2;
3878 CallbackHelper callback1, callback2;
3879
3880 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003881 int err = fillTransaction(transaction1, &callback1, layer1);
3882 if (err) {
3883 GTEST_SUCCEED() << "test not supported";
3884 return;
3885 }
3886 err = fillTransaction(transaction2, &callback2, layer2);
3887 if (err) {
3888 GTEST_SUCCEED() << "test not supported";
3889 return;
3890 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003891
Marissa Wall861616d2018-10-22 12:52:23 -07003892 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3893 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003894
3895 ExpectedResult expected;
3896 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3897 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3898 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3899 expected.reset();
3900
3901 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003902 err = fillTransaction(transaction1, &callback1);
3903 if (err) {
3904 GTEST_SUCCEED() << "test not supported";
3905 return;
3906 }
3907 err = fillTransaction(transaction2, &callback2);
3908 if (err) {
3909 GTEST_SUCCEED() << "test not supported";
3910 return;
3911 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003912
Marissa Wall861616d2018-10-22 12:52:23 -07003913 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003914
Marissa Wall713b63f2018-10-17 15:42:43 -07003915 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3916 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003917 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3918 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3919}
3920
3921TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3922 sp<SurfaceControl> layer;
3923 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3924
3925 Transaction transaction;
3926 CallbackHelper callback;
3927 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003928 for (auto& expected : expectedResults) {
3929 expected.reset();
3930 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003931 ExpectedResult::Buffer::ACQUIRED,
3932 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003933
Marissa Wall713b63f2018-10-17 15:42:43 -07003934 int err = fillTransaction(transaction, &callback, layer);
3935 if (err) {
3936 GTEST_SUCCEED() << "test not supported";
3937 return;
3938 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003939
3940 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003941 }
3942 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3943}
3944
3945TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3946 sp<SurfaceControl> layer;
3947 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3948
Marissa Wall713b63f2018-10-17 15:42:43 -07003949 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003950 Transaction transaction;
3951 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003952 int err = fillTransaction(transaction, &callback, layer);
3953 if (err) {
3954 GTEST_SUCCEED() << "test not supported";
3955 return;
3956 }
3957
3958 transaction.apply();
3959
3960 ExpectedResult expected;
3961 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3962 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3963
3964 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003965 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003966 for (auto& expected : expectedResults) {
3967 expected.reset();
3968
Marissa Wall713b63f2018-10-17 15:42:43 -07003969 err = fillTransaction(transaction, &callback);
3970 if (err) {
3971 GTEST_SUCCEED() << "test not supported";
3972 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003973 }
3974
3975 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003976 }
3977 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3978}
3979
3980TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3981 sp<SurfaceControl> layer;
3982 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3983
3984 // Normal call to set up test
3985 Transaction transaction;
3986 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003987 int err = fillTransaction(transaction, &callback, layer);
3988 if (err) {
3989 GTEST_SUCCEED() << "test not supported";
3990 return;
3991 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003992
Marissa Wall861616d2018-10-22 12:52:23 -07003993 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003994
3995 ExpectedResult expectedResult;
3996 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3997 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3998
3999 // Test
4000 std::vector<ExpectedResult> expectedResults(50);
4001 for (auto& expected : expectedResults) {
4002 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07004003 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
4004 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07004005
Marissa Wall713b63f2018-10-17 15:42:43 -07004006 err = fillTransaction(transaction, &callback);
4007 if (err) {
4008 GTEST_SUCCEED() << "test not supported";
4009 return;
4010 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07004011
Marissa Wall861616d2018-10-22 12:52:23 -07004012 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004013 }
4014 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
4015}
4016
Marissa Wall17b4e452018-12-26 16:32:34 -08004017TEST_F(LayerCallbackTest, DesiredPresentTime) {
4018 sp<SurfaceControl> layer;
4019 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4020
4021 Transaction transaction;
4022 CallbackHelper callback;
4023 int err = fillTransaction(transaction, &callback, layer);
4024 if (err) {
4025 GTEST_SUCCEED() << "test not supported";
4026 return;
4027 }
4028
4029 // Try to present 100ms in the future
4030 nsecs_t time = systemTime() + (100 * 1e6);
4031
4032 transaction.setDesiredPresentTime(time);
4033 transaction.apply();
4034
4035 ExpectedResult expected;
4036 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4037 expected.addExpectedPresentTime(time);
4038 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4039}
4040
4041TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
4042 sp<SurfaceControl> layer;
4043 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4044
4045 Transaction transaction;
4046 CallbackHelper callback1;
4047 int err = fillTransaction(transaction, &callback1, layer);
4048 if (err) {
4049 GTEST_SUCCEED() << "test not supported";
4050 return;
4051 }
4052
4053 // Try to present 100ms in the future
4054 nsecs_t time = systemTime() + (100 * 1e6);
4055
4056 transaction.setDesiredPresentTime(time);
4057 transaction.apply();
4058
4059 ExpectedResult expected1;
4060 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4061 expected1.addExpectedPresentTime(time);
4062
4063 CallbackHelper callback2;
4064 err = fillTransaction(transaction, &callback2, layer);
4065 if (err) {
4066 GTEST_SUCCEED() << "test not supported";
4067 return;
4068 }
4069
4070 // Try to present 33ms after the first frame
4071 time += (33.3 * 1e6);
4072
4073 transaction.setDesiredPresentTime(time);
4074 transaction.apply();
4075
4076 ExpectedResult expected2;
4077 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4078 ExpectedResult::Buffer::ACQUIRED,
4079 ExpectedResult::PreviousBuffer::RELEASED);
4080 expected2.addExpectedPresentTime(time);
4081
4082 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4083 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4084}
4085
4086TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
4087 sp<SurfaceControl> layer;
4088 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4089
4090 Transaction transaction;
4091 CallbackHelper callback1;
4092 int err = fillTransaction(transaction, &callback1, layer);
4093 if (err) {
4094 GTEST_SUCCEED() << "test not supported";
4095 return;
4096 }
4097
4098 // Try to present 100ms in the future
4099 nsecs_t time = systemTime() + (100 * 1e6);
4100
4101 transaction.setDesiredPresentTime(time);
4102 transaction.apply();
4103
4104 ExpectedResult expected1;
4105 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4106 expected1.addExpectedPresentTime(time);
4107
4108 CallbackHelper callback2;
4109 err = fillTransaction(transaction, &callback2, layer);
4110 if (err) {
4111 GTEST_SUCCEED() << "test not supported";
4112 return;
4113 }
4114
4115 // Try to present 33ms before the previous frame
4116 time -= (33.3 * 1e6);
4117
4118 transaction.setDesiredPresentTime(time);
4119 transaction.apply();
4120
4121 ExpectedResult expected2;
4122 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4123 ExpectedResult::Buffer::ACQUIRED,
4124 ExpectedResult::PreviousBuffer::RELEASED);
4125
4126 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4127 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4128}
4129
4130TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4131 sp<SurfaceControl> layer;
4132 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4133
4134 Transaction transaction;
4135 CallbackHelper callback;
4136 int err = fillTransaction(transaction, &callback, layer);
4137 if (err) {
4138 GTEST_SUCCEED() << "test not supported";
4139 return;
4140 }
4141
4142 // Try to present 100ms in the past
4143 nsecs_t time = systemTime() - (100 * 1e6);
4144
4145 transaction.setDesiredPresentTime(time);
4146 transaction.apply();
4147
4148 ExpectedResult expected;
4149 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4150 expected.addExpectedPresentTime(systemTime());
4151 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4152}
4153
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004154class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004155protected:
4156 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004157 LayerTransactionTest::SetUp();
4158 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004159
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004160 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4161 ASSERT_FALSE(display == nullptr);
4162
Mathias Agopianc666cae2012-07-25 18:56:13 -07004163 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004164 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004165
4166 ssize_t displayWidth = info.w;
4167 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004168
4169 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004170 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4171 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004172 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004173 ASSERT_TRUE(mBGSurfaceControl->isValid());
4174 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4175
4176 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004177 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4178
Peiyong Lin566a3b42018-01-09 18:22:43 -08004179 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004180 ASSERT_TRUE(mFGSurfaceControl->isValid());
4181
4182 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4183
4184 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004185 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004186 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004187 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4188
4189 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4190
Robert Carr4cdc58f2017-08-23 14:22:20 -07004191 asTransaction([&](Transaction& t) {
4192 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004193
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004194 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004195
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004196 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4197 .setPosition(mFGSurfaceControl, 64, 64)
4198 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004199
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004200 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4201 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4202 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004203 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004204 }
4205
4206 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004207 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004208 mBGSurfaceControl = 0;
4209 mFGSurfaceControl = 0;
4210 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004211 }
4212
4213 void waitForPostedBuffers() {
4214 // Since the sync surface is in synchronous mode (i.e. double buffered)
4215 // posting three buffers to it should ensure that at least two
4216 // SurfaceFlinger::handlePageFlip calls have been made, which should
4217 // guaranteed that a buffer posted to another Surface has been retired.
4218 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4219 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4220 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4221 }
4222
Robert Carr4cdc58f2017-08-23 14:22:20 -07004223
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004224 sp<SurfaceControl> mBGSurfaceControl;
4225 sp<SurfaceControl> mFGSurfaceControl;
4226
4227 // This surface is used to ensure that the buffers posted to
4228 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4229 sp<SurfaceControl> mSyncSurfaceControl;
4230};
4231
Robert Carr7f619b22017-11-06 12:56:35 -08004232TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004233
chaviw0e3479f2018-09-10 16:49:30 -07004234 std::unique_ptr<ScreenCapture> sc;
4235
4236 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004237 fillSurfaceRGBA8(relative, 10, 10, 10);
4238 waitForPostedBuffers();
4239
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004240 Transaction{}
4241 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004242 .setPosition(relative, 64, 64)
4243 .apply();
4244
4245 {
4246 // The relative should be on top of the FG control.
4247 ScreenCapture::captureScreen(&sc);
4248 sc->checkPixel(64, 64, 10, 10, 10);
4249 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004250 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004251
4252 {
4253 // Nothing should change at this point.
4254 ScreenCapture::captureScreen(&sc);
4255 sc->checkPixel(64, 64, 10, 10, 10);
4256 }
4257
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004258 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004259
4260 {
4261 // Ensure that the relative was actually hidden, rather than
4262 // being left in the detached but visible state.
4263 ScreenCapture::captureScreen(&sc);
4264 sc->expectFGColor(64, 64);
4265 }
4266}
4267
Robert Carr8d5227b2017-03-16 15:41:03 -07004268class GeometryLatchingTest : public LayerUpdateTest {
4269protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004270 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004271 SCOPED_TRACE(trace);
4272 ScreenCapture::captureScreen(&sc);
4273 // We find the leading edge of the FG surface.
4274 sc->expectFGColor(127, 127);
4275 sc->expectBGColor(128, 128);
4276 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004277
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004278 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004279
4280 void unlockFGBuffer() {
4281 sp<Surface> s = mFGSurfaceControl->getSurface();
4282 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4283 waitForPostedBuffers();
4284 }
4285
Robert Carr8d5227b2017-03-16 15:41:03 -07004286 void completeFGResize() {
4287 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4288 waitForPostedBuffers();
4289 }
4290 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004291 asTransaction([&](Transaction& t) {
4292 t.setSize(mFGSurfaceControl, 64, 64);
4293 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004294 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004295 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004296
4297 EXPECT_INITIAL_STATE("After restoring initial state");
4298 }
chaviw0e3479f2018-09-10 16:49:30 -07004299 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004300};
4301
Robert Carr8d5227b2017-03-16 15:41:03 -07004302class CropLatchingTest : public GeometryLatchingTest {
4303protected:
4304 void EXPECT_CROPPED_STATE(const char* trace) {
4305 SCOPED_TRACE(trace);
4306 ScreenCapture::captureScreen(&sc);
4307 // The edge should be moved back one pixel by our crop.
4308 sc->expectFGColor(126, 126);
4309 sc->expectBGColor(127, 127);
4310 sc->expectBGColor(128, 128);
4311 }
chaviw59f5c562017-06-28 16:39:06 -07004312
4313 void EXPECT_RESIZE_STATE(const char* trace) {
4314 SCOPED_TRACE(trace);
4315 ScreenCapture::captureScreen(&sc);
4316 // The FG is now resized too 128,128 at 64,64
4317 sc->expectFGColor(64, 64);
4318 sc->expectFGColor(191, 191);
4319 sc->expectBGColor(192, 192);
4320 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004321};
4322
Pablo Ceballos05289c22016-04-14 15:49:55 -07004323TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004324 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004325 {
4326 SCOPED_TRACE("before anything");
4327 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004328 sc->expectBGColor(32, 32);
4329 sc->expectFGColor(96, 96);
4330 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004331 }
4332
4333 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004334 asTransaction([&](Transaction& t) {
4335 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004336 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4337 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004338 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004339
Robert Carr4cdc58f2017-08-23 14:22:20 -07004340 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004341 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004342 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4343 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004344 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004345
4346 {
4347 SCOPED_TRACE("before any trigger");
4348 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004349 sc->expectBGColor(32, 32);
4350 sc->expectFGColor(96, 96);
4351 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004352 }
4353
4354 // should trigger the first deferred transaction, but not the second one
4355 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4356 {
4357 SCOPED_TRACE("after first trigger");
4358 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004359 sc->expectBGColor(32, 32);
4360 sc->checkPixel(96, 96, 162, 63, 96);
4361 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004362 }
4363
4364 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004365 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004366
4367 // trigger the second deferred transaction
4368 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4369 {
4370 SCOPED_TRACE("after second trigger");
4371 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004372 sc->expectBGColor(32, 32);
4373 sc->expectBGColor(96, 96);
4374 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004375 }
4376}
4377
Robert Carre392b552017-09-19 12:16:05 -07004378TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004379 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004380
4381 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004382 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4383 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4384 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4385 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004386 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004387 SurfaceComposerClient::Transaction{}
4388 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4389 .show(childNoBuffer)
4390 .show(childBuffer)
4391 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004392 {
4393 ScreenCapture::captureScreen(&sc);
4394 sc->expectChildColor(73, 73);
4395 sc->expectFGColor(74, 74);
4396 }
Vishnu Nair60356342018-11-13 13:00:45 -08004397 SurfaceComposerClient::Transaction{}
4398 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4399 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004400 {
4401 ScreenCapture::captureScreen(&sc);
4402 sc->expectChildColor(73, 73);
4403 sc->expectChildColor(74, 74);
4404 }
4405}
4406
Robert Carr2c5f6d22017-09-26 12:30:35 -07004407TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004408 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004409 {
4410 SCOPED_TRACE("before move");
4411 ScreenCapture::captureScreen(&sc);
4412 sc->expectBGColor(0, 12);
4413 sc->expectFGColor(75, 75);
4414 sc->expectBGColor(145, 145);
4415 }
4416
4417 Transaction t1, t2;
4418 t1.setPosition(mFGSurfaceControl, 128, 128);
4419 t2.setPosition(mFGSurfaceControl, 0, 0);
4420 // We expect that the position update from t2 now
4421 // overwrites the position update from t1.
4422 t1.merge(std::move(t2));
4423 t1.apply();
4424
4425 {
4426 ScreenCapture::captureScreen(&sc);
4427 sc->expectFGColor(1, 1);
4428 }
4429}
4430
Vishnu Nair996bc422019-07-16 14:15:33 -07004431TEST_F(LayerUpdateTest, MergingTransactionFlags) {
4432 Transaction().hide(mFGSurfaceControl).apply();
4433 std::unique_ptr<ScreenCapture> sc;
4434 {
4435 SCOPED_TRACE("before merge");
4436 ScreenCapture::captureScreen(&sc);
4437 sc->expectBGColor(0, 12);
4438 sc->expectBGColor(75, 75);
4439 sc->expectBGColor(145, 145);
4440 }
4441
4442 Transaction t1, t2;
4443 t1.show(mFGSurfaceControl);
4444 t2.setFlags(mFGSurfaceControl, 0 /* flags */, layer_state_t::eLayerSecure /* mask */);
4445 t1.merge(std::move(t2));
4446 t1.apply();
4447
4448 {
4449 SCOPED_TRACE("after merge");
4450 ScreenCapture::captureScreen(&sc);
4451 sc->expectFGColor(75, 75);
4452 }
4453}
4454
Robert Carr1f0a16a2016-10-24 16:27:39 -07004455class ChildLayerTest : public LayerUpdateTest {
4456protected:
4457 void SetUp() override {
4458 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004459 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004460 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004461 fillSurfaceRGBA8(mChild, 200, 200, 200);
4462
4463 {
4464 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004465 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004466 mCapture->expectChildColor(64, 64);
4467 }
4468 }
4469 void TearDown() override {
4470 LayerUpdateTest::TearDown();
4471 mChild = 0;
4472 }
4473
4474 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004475 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004476};
4477
4478TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004479 asTransaction([&](Transaction& t) {
4480 t.show(mChild);
4481 t.setPosition(mChild, 10, 10);
4482 t.setPosition(mFGSurfaceControl, 64, 64);
4483 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004484
4485 {
chaviw0e3479f2018-09-10 16:49:30 -07004486 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004487 // Top left of foreground must now be visible
4488 mCapture->expectFGColor(64, 64);
4489 // But 10 pixels in we should see the child surface
4490 mCapture->expectChildColor(74, 74);
4491 // And 10 more pixels we should be back to the foreground surface
4492 mCapture->expectFGColor(84, 84);
4493 }
4494
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004495 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004496
4497 {
chaviw0e3479f2018-09-10 16:49:30 -07004498 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004499 // Top left of foreground should now be at 0, 0
4500 mCapture->expectFGColor(0, 0);
4501 // But 10 pixels in we should see the child surface
4502 mCapture->expectChildColor(10, 10);
4503 // And 10 more pixels we should be back to the foreground surface
4504 mCapture->expectFGColor(20, 20);
4505 }
4506}
4507
Robert Carr41b08b52017-06-01 16:11:34 -07004508TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004509 asTransaction([&](Transaction& t) {
4510 t.show(mChild);
4511 t.setPosition(mChild, 0, 0);
4512 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004513 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004514 });
Robert Carr41b08b52017-06-01 16:11:34 -07004515
4516 {
chaviw0e3479f2018-09-10 16:49:30 -07004517 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004518 mCapture->expectChildColor(0, 0);
4519 mCapture->expectChildColor(4, 4);
4520 mCapture->expectBGColor(5, 5);
4521 }
4522}
4523
Robert Carr1f0a16a2016-10-24 16:27:39 -07004524TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004525 asTransaction([&](Transaction& t) {
4526 t.show(mChild);
4527 t.setPosition(mFGSurfaceControl, 0, 0);
4528 t.setPosition(mChild, 63, 63);
4529 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004530
4531 {
chaviw0e3479f2018-09-10 16:49:30 -07004532 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004533 mCapture->expectFGColor(0, 0);
4534 // Last pixel in foreground should now be the child.
4535 mCapture->expectChildColor(63, 63);
4536 // But the child should be constrained and the next pixel
4537 // must be the background
4538 mCapture->expectBGColor(64, 64);
4539 }
4540}
4541
4542TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004543 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004544
4545 // Find the boundary between the parent and child
4546 {
chaviw0e3479f2018-09-10 16:49:30 -07004547 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004548 mCapture->expectChildColor(9, 9);
4549 mCapture->expectFGColor(10, 10);
4550 }
4551
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004552 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004553
4554 // The boundary should be twice as far from the origin now.
4555 // The pixels from the last test should all be child now
4556 {
chaviw0e3479f2018-09-10 16:49:30 -07004557 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004558 mCapture->expectChildColor(9, 9);
4559 mCapture->expectChildColor(10, 10);
4560 mCapture->expectChildColor(19, 19);
4561 mCapture->expectFGColor(20, 20);
4562 }
4563}
Robert Carr9524cb32017-02-13 11:32:32 -08004564
Vishnu Nairc652ff82019-03-15 12:48:54 -07004565// A child with a scale transform should be cropped by its parent bounds.
4566TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4567 asTransaction([&](Transaction& t) {
4568 t.setPosition(mFGSurfaceControl, 0, 0);
4569 t.setPosition(mChild, 0, 0);
4570 });
4571
4572 // Find the boundary between the parent and child.
4573 {
4574 mCapture = screenshot();
4575 mCapture->expectChildColor(0, 0);
4576 mCapture->expectChildColor(9, 9);
4577 mCapture->expectFGColor(10, 10);
4578 }
4579
4580 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4581
4582 // The child should fill its parent bounds and be cropped by it.
4583 {
4584 mCapture = screenshot();
4585 mCapture->expectChildColor(0, 0);
4586 mCapture->expectChildColor(63, 63);
4587 mCapture->expectBGColor(64, 64);
4588 }
4589}
4590
Robert Carr6452f122017-03-21 10:41:29 -07004591TEST_F(ChildLayerTest, ChildLayerAlpha) {
4592 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4593 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4594 fillSurfaceRGBA8(mChild, 0, 254, 0);
4595 waitForPostedBuffers();
4596
Robert Carr4cdc58f2017-08-23 14:22:20 -07004597 asTransaction([&](Transaction& t) {
4598 t.show(mChild);
4599 t.setPosition(mChild, 0, 0);
4600 t.setPosition(mFGSurfaceControl, 0, 0);
4601 });
Robert Carr6452f122017-03-21 10:41:29 -07004602
4603 {
chaviw0e3479f2018-09-10 16:49:30 -07004604 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004605 // Unblended child color
4606 mCapture->checkPixel(0, 0, 0, 254, 0);
4607 }
4608
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004609 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004610
4611 {
chaviw0e3479f2018-09-10 16:49:30 -07004612 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004613 // Child and BG blended.
4614 mCapture->checkPixel(0, 0, 127, 127, 0);
4615 }
4616
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004617 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004618
4619 {
chaviw0e3479f2018-09-10 16:49:30 -07004620 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004621 // Child and BG blended.
4622 mCapture->checkPixel(0, 0, 95, 64, 95);
4623 }
4624}
4625
Robert Carr9524cb32017-02-13 11:32:32 -08004626TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004627 asTransaction([&](Transaction& t) {
4628 t.show(mChild);
4629 t.setPosition(mChild, 10, 10);
4630 t.setPosition(mFGSurfaceControl, 64, 64);
4631 });
Robert Carr9524cb32017-02-13 11:32:32 -08004632
4633 {
chaviw0e3479f2018-09-10 16:49:30 -07004634 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004635 // Top left of foreground must now be visible
4636 mCapture->expectFGColor(64, 64);
4637 // But 10 pixels in we should see the child surface
4638 mCapture->expectChildColor(74, 74);
4639 // And 10 more pixels we should be back to the foreground surface
4640 mCapture->expectFGColor(84, 84);
4641 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004642
4643 asTransaction([&](Transaction& t) {
4644 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4645 });
4646
Robert Carr9524cb32017-02-13 11:32:32 -08004647 {
chaviw0e3479f2018-09-10 16:49:30 -07004648 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004649 mCapture->expectFGColor(64, 64);
4650 // In reparenting we should have exposed the entire foreground surface.
4651 mCapture->expectFGColor(74, 74);
4652 // And the child layer should now begin at 10, 10 (since the BG
4653 // layer is at (0, 0)).
4654 mCapture->expectBGColor(9, 9);
4655 mCapture->expectChildColor(10, 10);
4656 }
4657}
4658
Robert Carr2e102c92018-10-23 12:11:15 -07004659TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4660 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004661 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004662 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4663
4664 {
4665 SCOPED_TRACE("Grandchild visible");
4666 ScreenCapture::captureScreen(&mCapture);
4667 mCapture->checkPixel(64, 64, 111, 111, 111);
4668 }
4669
Robert Carr87246532019-02-04 15:20:26 -08004670 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004671
4672 {
4673 SCOPED_TRACE("After destroying child");
4674 ScreenCapture::captureScreen(&mCapture);
4675 mCapture->expectFGColor(64, 64);
4676 }
4677
4678 asTransaction([&](Transaction& t) {
4679 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4680 });
4681
4682 {
4683 SCOPED_TRACE("After reparenting grandchild");
4684 ScreenCapture::captureScreen(&mCapture);
4685 mCapture->checkPixel(64, 64, 111, 111, 111);
4686 }
4687}
4688
Vishnu Nair14d76922019-08-05 08:41:20 -07004689TEST_F(ChildLayerTest, ChildrenRelativeZSurvivesParentDestruction) {
4690 sp<SurfaceControl> mGrandChild =
4691 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
4692 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4693
4694 // draw grand child behind the foreground surface
4695 asTransaction([&](Transaction& t) {
4696 t.setRelativeLayer(mGrandChild, mFGSurfaceControl->getHandle(), -1);
4697 });
4698
4699 {
4700 SCOPED_TRACE("Child visible");
4701 ScreenCapture::captureScreen(&mCapture);
4702 mCapture->checkPixel(64, 64, 200, 200, 200);
4703 }
4704
4705 asTransaction([&](Transaction& t) {
4706 t.reparent(mChild, nullptr);
4707 t.reparentChildren(mChild, mFGSurfaceControl->getHandle());
4708 });
4709
4710 {
4711 SCOPED_TRACE("foreground visible reparenting grandchild");
4712 ScreenCapture::captureScreen(&mCapture);
4713 mCapture->checkPixel(64, 64, 195, 63, 63);
4714 }
4715}
4716
chaviw161410b02017-07-27 10:46:08 -07004717TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004718 asTransaction([&](Transaction& t) {
4719 t.show(mChild);
4720 t.setPosition(mChild, 10, 10);
4721 t.setPosition(mFGSurfaceControl, 64, 64);
4722 });
Robert Carr9524cb32017-02-13 11:32:32 -08004723
4724 {
chaviw0e3479f2018-09-10 16:49:30 -07004725 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004726 // Top left of foreground must now be visible
4727 mCapture->expectFGColor(64, 64);
4728 // But 10 pixels in we should see the child surface
4729 mCapture->expectChildColor(74, 74);
4730 // And 10 more pixels we should be back to the foreground surface
4731 mCapture->expectFGColor(84, 84);
4732 }
4733
chaviw0e3479f2018-09-10 16:49:30 -07004734
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004735 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004736
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004737 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004738
chaviw161410b02017-07-27 10:46:08 -07004739 // Since the child has the same client as the parent, it will not get
4740 // detached and will be hidden.
4741 {
chaviw0e3479f2018-09-10 16:49:30 -07004742 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004743 mCapture->expectFGColor(64, 64);
4744 mCapture->expectFGColor(74, 74);
4745 mCapture->expectFGColor(84, 84);
4746 }
4747}
4748
4749TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4750 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004751 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004752 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4753 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004754
chaviw161410b02017-07-27 10:46:08 -07004755 ASSERT_TRUE(mChildNewClient->isValid());
4756
4757 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4758
Robert Carr4cdc58f2017-08-23 14:22:20 -07004759 asTransaction([&](Transaction& t) {
4760 t.hide(mChild);
4761 t.show(mChildNewClient);
4762 t.setPosition(mChildNewClient, 10, 10);
4763 t.setPosition(mFGSurfaceControl, 64, 64);
4764 });
chaviw161410b02017-07-27 10:46:08 -07004765
4766 {
chaviw0e3479f2018-09-10 16:49:30 -07004767 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004768 // Top left of foreground must now be visible
4769 mCapture->expectFGColor(64, 64);
4770 // But 10 pixels in we should see the child surface
4771 mCapture->expectChildColor(74, 74);
4772 // And 10 more pixels we should be back to the foreground surface
4773 mCapture->expectFGColor(84, 84);
4774 }
4775
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004776 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004777
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004778 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004779
Robert Carr9524cb32017-02-13 11:32:32 -08004780 // Nothing should have changed.
4781 {
chaviw0e3479f2018-09-10 16:49:30 -07004782 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004783 mCapture->expectFGColor(64, 64);
4784 mCapture->expectChildColor(74, 74);
4785 mCapture->expectFGColor(84, 84);
4786 }
4787}
4788
chaviw5aedec92018-10-22 10:40:38 -07004789TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4790 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4791 sp<SurfaceControl> childNewClient =
4792 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4793 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4794
4795 ASSERT_TRUE(childNewClient != nullptr);
4796 ASSERT_TRUE(childNewClient->isValid());
4797
4798 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4799
4800 Transaction()
4801 .hide(mChild)
4802 .show(childNewClient)
4803 .setPosition(childNewClient, 10, 10)
4804 .setPosition(mFGSurfaceControl, 64, 64)
4805 .apply();
4806
4807 {
4808 mCapture = screenshot();
4809 // Top left of foreground must now be visible
4810 mCapture->expectFGColor(64, 64);
4811 // But 10 pixels in we should see the child surface
4812 mCapture->expectChildColor(74, 74);
4813 // And 10 more pixels we should be back to the foreground surface
4814 mCapture->expectFGColor(84, 84);
4815 }
4816
4817 Transaction().detachChildren(mFGSurfaceControl).apply();
4818 Transaction().hide(childNewClient).apply();
4819
4820 // Nothing should have changed.
4821 {
4822 mCapture = screenshot();
4823 mCapture->expectFGColor(64, 64);
4824 mCapture->expectChildColor(74, 74);
4825 mCapture->expectFGColor(84, 84);
4826 }
4827
4828 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4829 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4830 32);
4831 Transaction()
4832 .setLayer(newParentSurface, INT32_MAX - 1)
4833 .show(newParentSurface)
4834 .setPosition(newParentSurface, 20, 20)
4835 .reparent(childNewClient, newParentSurface->getHandle())
4836 .apply();
4837 {
4838 mCapture = screenshot();
4839 // Child is now hidden.
4840 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4841 }
4842}
chaviw43cb3cb2019-05-31 15:23:41 -07004843TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
4844 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4845 sp<SurfaceControl> childNewClient =
4846 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4847 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4848
4849 ASSERT_TRUE(childNewClient != nullptr);
4850 ASSERT_TRUE(childNewClient->isValid());
4851
4852 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4853
4854 Transaction()
4855 .hide(mChild)
4856 .show(childNewClient)
4857 .setPosition(childNewClient, 10, 10)
4858 .setPosition(mFGSurfaceControl, 64, 64)
4859 .apply();
4860
4861 {
4862 mCapture = screenshot();
4863 Rect rect = Rect(74, 74, 84, 84);
4864 mCapture->expectBorder(rect, Color{195, 63, 63, 255});
4865 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4866 }
4867
4868 Transaction()
4869 .deferTransactionUntil_legacy(childNewClient, mFGSurfaceControl->getHandle(),
4870 mFGSurfaceControl->getSurface()->getNextFrameNumber())
4871 .apply();
4872 Transaction().detachChildren(mFGSurfaceControl).apply();
4873 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(mFGSurfaceControl, Color::RED, 32, 32));
4874
4875 // BufferLayer can still dequeue buffers even though there's a detached layer with a
4876 // deferred transaction.
4877 {
4878 SCOPED_TRACE("new buffer");
4879 mCapture = screenshot();
4880 Rect rect = Rect(74, 74, 84, 84);
4881 mCapture->expectBorder(rect, Color::RED);
4882 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4883 }
4884}
chaviw5aedec92018-10-22 10:40:38 -07004885
Robert Carr9b429f42017-04-17 14:56:57 -07004886TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004887 asTransaction([&](Transaction& t) {
4888 t.show(mChild);
4889 t.setPosition(mChild, 0, 0);
4890 t.setPosition(mFGSurfaceControl, 0, 0);
4891 });
Robert Carr9b429f42017-04-17 14:56:57 -07004892
4893 {
chaviw0e3479f2018-09-10 16:49:30 -07004894 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004895 // We've positioned the child in the top left.
4896 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004897 // But it's only 10x15.
4898 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004899 }
4900
Robert Carr4cdc58f2017-08-23 14:22:20 -07004901 asTransaction([&](Transaction& t) {
4902 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4903 // We cause scaling by 2.
4904 t.setSize(mFGSurfaceControl, 128, 128);
4905 });
Robert Carr9b429f42017-04-17 14:56:57 -07004906
4907 {
chaviw0e3479f2018-09-10 16:49:30 -07004908 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004909 // We've positioned the child in the top left.
4910 mCapture->expectChildColor(0, 0);
4911 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004912 mCapture->expectChildColor(19, 29);
4913 // And now it should be scaled all the way to 20x30
4914 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004915 }
4916}
4917
Robert Carr1725eee2017-04-26 18:32:15 -07004918// Regression test for b/37673612
4919TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004920 asTransaction([&](Transaction& t) {
4921 t.show(mChild);
4922 t.setPosition(mChild, 0, 0);
4923 t.setPosition(mFGSurfaceControl, 0, 0);
4924 });
Robert Carr1725eee2017-04-26 18:32:15 -07004925
4926 {
chaviw0e3479f2018-09-10 16:49:30 -07004927 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004928 // We've positioned the child in the top left.
4929 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004930 mCapture->expectChildColor(9, 14);
4931 // But it's only 10x15.
4932 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004933 }
Robert Carr1725eee2017-04-26 18:32:15 -07004934 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4935 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004936 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004937 sp<Surface> s = mFGSurfaceControl->getSurface();
4938 auto anw = static_cast<ANativeWindow*>(s.get());
4939 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4940 native_window_set_buffers_dimensions(anw, 64, 128);
4941 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4942 waitForPostedBuffers();
4943
4944 {
4945 // The child should still be in the same place and not have any strange scaling as in
4946 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004947 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004948 mCapture->expectChildColor(0, 0);
4949 mCapture->expectFGColor(10, 10);
4950 }
4951}
4952
Vishnu Nairc652ff82019-03-15 12:48:54 -07004953// A child with a buffer transform from its parents should be cropped by its parent bounds.
4954TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4955 asTransaction([&](Transaction& t) {
4956 t.show(mChild);
4957 t.setPosition(mChild, 0, 0);
4958 t.setPosition(mFGSurfaceControl, 0, 0);
4959 t.setSize(mChild, 100, 100);
4960 });
4961 fillSurfaceRGBA8(mChild, 200, 200, 200);
4962
4963 {
4964 mCapture = screenshot();
4965
4966 mCapture->expectChildColor(0, 0);
4967 mCapture->expectChildColor(63, 63);
4968 mCapture->expectBGColor(64, 64);
4969 }
4970
4971 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4972 sp<Surface> s = mFGSurfaceControl->getSurface();
4973 auto anw = static_cast<ANativeWindow*>(s.get());
4974 // Apply a 90 transform on the buffer.
4975 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4976 native_window_set_buffers_dimensions(anw, 64, 128);
4977 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4978 waitForPostedBuffers();
4979
4980 // The child should be cropped by the new parent bounds.
4981 {
4982 mCapture = screenshot();
4983 mCapture->expectChildColor(0, 0);
4984 mCapture->expectChildColor(99, 63);
4985 mCapture->expectFGColor(100, 63);
4986 mCapture->expectBGColor(128, 64);
4987 }
4988}
4989
4990// A child with a scale transform from its parents should be cropped by its parent bounds.
4991TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4992 asTransaction([&](Transaction& t) {
4993 t.show(mChild);
4994 t.setPosition(mChild, 0, 0);
4995 t.setPosition(mFGSurfaceControl, 0, 0);
4996 t.setSize(mChild, 200, 200);
4997 });
4998 fillSurfaceRGBA8(mChild, 200, 200, 200);
4999
5000 {
5001 mCapture = screenshot();
5002
5003 mCapture->expectChildColor(0, 0);
5004 mCapture->expectChildColor(63, 63);
5005 mCapture->expectBGColor(64, 64);
5006 }
5007
5008 asTransaction([&](Transaction& t) {
5009 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5010 // Set a scaling by 2.
5011 t.setSize(mFGSurfaceControl, 128, 128);
5012 });
5013
5014 // Child should inherit its parents scale but should be cropped by its parent bounds.
5015 {
5016 mCapture = screenshot();
5017 mCapture->expectChildColor(0, 0);
5018 mCapture->expectChildColor(127, 127);
5019 mCapture->expectBGColor(128, 128);
5020 }
5021}
5022
5023// Regression test for b/127368943
5024// Child should ignore the buffer transform but apply parent scale transform.
5025TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
5026 asTransaction([&](Transaction& t) {
5027 t.show(mChild);
5028 t.setPosition(mChild, 0, 0);
5029 t.setPosition(mFGSurfaceControl, 0, 0);
5030 });
5031
5032 {
5033 mCapture = screenshot();
5034 mCapture->expectChildColor(0, 0);
5035 mCapture->expectChildColor(9, 14);
5036 mCapture->expectFGColor(10, 15);
5037 }
5038
5039 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
5040 asTransaction([&](Transaction& t) {
5041 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5042 t.setSize(mFGSurfaceControl, 128, 64);
5043 });
5044 sp<Surface> s = mFGSurfaceControl->getSurface();
5045 auto anw = static_cast<ANativeWindow*>(s.get());
5046 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
5047 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
5048 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
5049 native_window_set_buffers_dimensions(anw, 32, 64);
5050 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
5051 waitForPostedBuffers();
5052
5053 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
5054 {
5055 mCapture = screenshot();
5056 mCapture->expectChildColor(0, 0);
5057 mCapture->expectChildColor(19, 29);
5058 mCapture->expectFGColor(20, 30);
5059 }
5060}
5061
Dan Stoza412903f2017-04-27 13:42:17 -07005062TEST_F(ChildLayerTest, Bug36858924) {
5063 // Destroy the child layer
5064 mChild.clear();
5065
5066 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08005067 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
5068 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07005069
5070 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07005071 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005072 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
5073 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07005074 t.show(mChild);
5075 });
Dan Stoza412903f2017-04-27 13:42:17 -07005076
5077 // Render the foreground surface a few times
5078 //
5079 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
5080 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
5081 // never acquire/release the first buffer
5082 ALOGI("Filling 1");
5083 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5084 ALOGI("Filling 2");
5085 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
5086 ALOGI("Filling 3");
5087 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
5088 ALOGI("Filling 4");
5089 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5090}
5091
chaviwf1961f72017-09-18 16:41:07 -07005092TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005093 asTransaction([&](Transaction& t) {
5094 t.show(mChild);
5095 t.setPosition(mChild, 10, 10);
5096 t.setPosition(mFGSurfaceControl, 64, 64);
5097 });
chaviw06178942017-07-27 10:25:59 -07005098
5099 {
chaviw0e3479f2018-09-10 16:49:30 -07005100 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005101 // Top left of foreground must now be visible
5102 mCapture->expectFGColor(64, 64);
5103 // But 10 pixels in we should see the child surface
5104 mCapture->expectChildColor(74, 74);
5105 // And 10 more pixels we should be back to the foreground surface
5106 mCapture->expectFGColor(84, 84);
5107 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07005108
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005109 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07005110
chaviw06178942017-07-27 10:25:59 -07005111 {
chaviw0e3479f2018-09-10 16:49:30 -07005112 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005113 mCapture->expectFGColor(64, 64);
5114 // In reparenting we should have exposed the entire foreground surface.
5115 mCapture->expectFGColor(74, 74);
5116 // And the child layer should now begin at 10, 10 (since the BG
5117 // layer is at (0, 0)).
5118 mCapture->expectBGColor(9, 9);
5119 mCapture->expectChildColor(10, 10);
5120 }
5121}
5122
chaviwf1961f72017-09-18 16:41:07 -07005123TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005124 asTransaction([&](Transaction& t) {
5125 t.show(mChild);
5126 t.setPosition(mChild, 10, 10);
5127 t.setPosition(mFGSurfaceControl, 64, 64);
5128 });
chaviwf1961f72017-09-18 16:41:07 -07005129
5130 {
chaviw0e3479f2018-09-10 16:49:30 -07005131 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005132 // Top left of foreground must now be visible
5133 mCapture->expectFGColor(64, 64);
5134 // But 10 pixels in we should see the child surface
5135 mCapture->expectChildColor(74, 74);
5136 // And 10 more pixels we should be back to the foreground surface
5137 mCapture->expectFGColor(84, 84);
5138 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005139 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07005140 {
chaviw0e3479f2018-09-10 16:49:30 -07005141 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005142 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07005143 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005144 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07005145 mCapture->expectFGColor(84, 84);
5146 }
5147}
5148
5149TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07005150 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08005151 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07005152 ASSERT_TRUE(newSurface->isValid());
5153
5154 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005155 asTransaction([&](Transaction& t) {
5156 t.hide(mChild);
5157 t.show(newSurface);
5158 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005159 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005160 t.setPosition(mFGSurfaceControl, 64, 64);
5161 });
chaviwf1961f72017-09-18 16:41:07 -07005162
5163 {
chaviw0e3479f2018-09-10 16:49:30 -07005164 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005165 // Top left of foreground must now be visible
5166 mCapture->expectFGColor(64, 64);
5167 // At 10, 10 we should see the new surface
5168 mCapture->checkPixel(10, 10, 63, 195, 63);
5169 }
5170
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005171 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07005172
5173 {
chaviw0e3479f2018-09-10 16:49:30 -07005174 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005175 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
5176 // mFGSurface, putting it at 74, 74.
5177 mCapture->expectFGColor(64, 64);
5178 mCapture->checkPixel(74, 74, 63, 195, 63);
5179 mCapture->expectFGColor(84, 84);
5180 }
5181}
5182
chaviwc9674332017-08-28 12:32:18 -07005183TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005184 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
5185 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07005186 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5187
5188 {
chaviw0e3479f2018-09-10 16:49:30 -07005189 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07005190 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
5191 // which begins at 64, 64
5192 mCapture->checkPixel(64, 64, 50, 50, 50);
5193 }
5194}
5195
Robert Carr503c7042017-09-27 15:06:08 -07005196TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005197 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07005198 fillSurfaceRGBA8(relative, 255, 255, 255);
5199
5200 Transaction t;
5201 t.setLayer(relative, INT32_MAX)
5202 .setRelativeLayer(mChild, relative->getHandle(), 1)
5203 .setPosition(mFGSurfaceControl, 0, 0)
5204 .apply(true);
5205
5206 // We expect that the child should have been elevated above our
5207 // INT_MAX layer even though it's not a child of it.
5208 {
chaviw0e3479f2018-09-10 16:49:30 -07005209 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005210 mCapture->expectChildColor(0, 0);
5211 mCapture->expectChildColor(9, 9);
5212 mCapture->checkPixel(10, 10, 255, 255, 255);
5213 }
5214}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005215
Vishnu Nair60356342018-11-13 13:00:45 -08005216class BoundlessLayerTest : public LayerUpdateTest {
5217protected:
5218 std::unique_ptr<ScreenCapture> mCapture;
5219};
5220
5221// Verify setting a size on a buffer layer has no effect.
5222TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5223 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005224 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5225 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005226 ASSERT_TRUE(bufferLayer->isValid());
5227 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5228 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5229 {
5230 mCapture = screenshot();
5231 // Top left of background must now be visible
5232 mCapture->expectBGColor(0, 0);
5233 // Foreground Surface bounds must be color layer
5234 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5235 // Buffer layer should not extend past buffer bounds
5236 mCapture->expectFGColor(95, 95);
5237 }
5238}
5239
5240// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5241// which will crop the color layer.
5242TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5243 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005244 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5245 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005246 ASSERT_TRUE(colorLayer->isValid());
5247 asTransaction([&](Transaction& t) {
5248 t.setColor(colorLayer, half3{0, 0, 0});
5249 t.show(colorLayer);
5250 });
5251 {
5252 mCapture = screenshot();
5253 // Top left of background must now be visible
5254 mCapture->expectBGColor(0, 0);
5255 // Foreground Surface bounds must be color layer
5256 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5257 // Color layer should not extend past foreground bounds
5258 mCapture->expectBGColor(129, 129);
5259 }
5260}
5261
5262// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5263// a crop which will be used to crop the color layer.
5264TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005265 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5266 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005267 ASSERT_TRUE(cropLayer->isValid());
5268 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005269 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5270 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005271 ASSERT_TRUE(colorLayer->isValid());
5272 asTransaction([&](Transaction& t) {
5273 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5274 t.setColor(colorLayer, half3{0, 0, 0});
5275 t.show(cropLayer);
5276 t.show(colorLayer);
5277 });
5278 {
5279 mCapture = screenshot();
5280 // Top left of background must now be visible
5281 mCapture->expectBGColor(0, 0);
5282 // Top left of foreground must now be visible
5283 mCapture->expectFGColor(64, 64);
5284 // 5 pixels from the foreground we should see the child surface
5285 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5286 // 10 pixels from the foreground we should be back to the foreground surface
5287 mCapture->expectFGColor(74, 74);
5288 }
5289}
5290
5291// Verify for boundless layer with no children, their transforms have no effect.
5292TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5293 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005294 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5295 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005296 ASSERT_TRUE(colorLayer->isValid());
5297 asTransaction([&](Transaction& t) {
5298 t.setPosition(colorLayer, 320, 320);
5299 t.setMatrix(colorLayer, 2, 0, 0, 2);
5300 t.setColor(colorLayer, half3{0, 0, 0});
5301 t.show(colorLayer);
5302 });
5303 {
5304 mCapture = screenshot();
5305 // Top left of background must now be visible
5306 mCapture->expectBGColor(0, 0);
5307 // Foreground Surface bounds must be color layer
5308 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5309 // Color layer should not extend past foreground bounds
5310 mCapture->expectBGColor(129, 129);
5311 }
5312}
5313
5314// Verify for boundless layer with children, their transforms have an effect.
5315TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5316 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005317 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5318 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005319 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5320 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005321 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5322 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005323 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5324 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005325 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5326 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005327 ASSERT_TRUE(colorLayer->isValid());
5328 asTransaction([&](Transaction& t) {
5329 t.setPosition(boundlessLayerRightShift, 32, 0);
5330 t.show(boundlessLayerRightShift);
5331 t.setPosition(boundlessLayerDownShift, 0, 32);
5332 t.show(boundlessLayerDownShift);
5333 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5334 t.setColor(colorLayer, half3{0, 0, 0});
5335 t.show(colorLayer);
5336 });
5337 {
5338 mCapture = screenshot();
5339 // Top left of background must now be visible
5340 mCapture->expectBGColor(0, 0);
5341 // Top left of foreground must now be visible
5342 mCapture->expectFGColor(64, 64);
5343 // Foreground Surface bounds must be color layer
5344 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5345 // Color layer should not extend past foreground bounds
5346 mCapture->expectBGColor(129, 129);
5347 }
5348}
5349
5350// Verify child layers do not get clipped if they temporarily move into the negative
5351// coordinate space as the result of an intermediate transformation.
5352TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5353 sp<SurfaceControl> boundlessLayer =
5354 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5355 0 /* flags */, mFGSurfaceControl.get());
5356 ASSERT_TRUE(boundlessLayer != nullptr);
5357 ASSERT_TRUE(boundlessLayer->isValid());
5358 sp<SurfaceControl> colorLayer =
5359 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5360 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5361 ASSERT_TRUE(colorLayer != nullptr);
5362 ASSERT_TRUE(colorLayer->isValid());
5363 asTransaction([&](Transaction& t) {
5364 // shift child layer off bounds. If this layer was not boundless, we will
5365 // expect the child layer to be cropped.
5366 t.setPosition(boundlessLayer, 32, 32);
5367 t.show(boundlessLayer);
5368 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5369 // undo shift by parent
5370 t.setPosition(colorLayer, -32, -32);
5371 t.setColor(colorLayer, half3{0, 0, 0});
5372 t.show(colorLayer);
5373 });
5374 {
5375 mCapture = screenshot();
5376 // Top left of background must now be visible
5377 mCapture->expectBGColor(0, 0);
5378 // Foreground Surface bounds must be color layer
5379 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5380 // Color layer should not extend past foreground bounds
5381 mCapture->expectBGColor(129, 129);
5382 }
5383}
5384
5385// Verify for boundless root layers with children, their transforms have an effect.
5386TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005387 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5388 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005389 ASSERT_TRUE(rootBoundlessLayer->isValid());
5390 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005391 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5392 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5393
Vishnu Nair60356342018-11-13 13:00:45 -08005394 ASSERT_TRUE(colorLayer->isValid());
5395 asTransaction([&](Transaction& t) {
5396 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5397 t.setPosition(rootBoundlessLayer, 32, 32);
5398 t.show(rootBoundlessLayer);
5399 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5400 t.setColor(colorLayer, half3{0, 0, 0});
5401 t.show(colorLayer);
5402 t.hide(mFGSurfaceControl);
5403 });
5404 {
5405 mCapture = screenshot();
5406 // Top left of background must now be visible
5407 mCapture->expectBGColor(0, 0);
5408 // Top left of foreground must now be visible
5409 mCapture->expectBGColor(31, 31);
5410 // Foreground Surface bounds must be color layer
5411 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5412 // Color layer should not extend past foreground bounds
5413 mCapture->expectBGColor(97, 97);
5414 }
5415}
Robert Carr503c7042017-09-27 15:06:08 -07005416
chaviwa76b2712017-09-20 12:02:26 -07005417class ScreenCaptureTest : public LayerUpdateTest {
5418protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005419 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005420};
5421
5422TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5423 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005424 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005425 mCapture->expectBGColor(0, 0);
5426 // Doesn't capture FG layer which is at 64, 64
5427 mCapture->expectBGColor(64, 64);
5428}
5429
5430TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5431 auto fgHandle = mFGSurfaceControl->getHandle();
5432
Vishnu Nair88a11f22018-11-28 18:30:57 -08005433 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5434 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005435 fillSurfaceRGBA8(child, 200, 200, 200);
5436
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005437 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005438
5439 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005440 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005441 mCapture->expectFGColor(10, 10);
5442 mCapture->expectChildColor(0, 0);
5443}
5444
Robert Carr578038f2018-03-09 12:25:24 -08005445TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5446 auto fgHandle = mFGSurfaceControl->getHandle();
5447
Vishnu Nair88a11f22018-11-28 18:30:57 -08005448 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5449 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005450 fillSurfaceRGBA8(child, 200, 200, 200);
5451
5452 SurfaceComposerClient::Transaction().show(child).apply(true);
5453
5454 // Captures mFGSurfaceControl's child
5455 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5456 mCapture->checkPixel(10, 10, 0, 0, 0);
5457 mCapture->expectChildColor(0, 0);
5458}
5459
Robert Carr866455f2019-04-02 16:28:26 -07005460TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5461 auto fgHandle = mFGSurfaceControl->getHandle();
5462
5463 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5464 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5465 fillSurfaceRGBA8(child, 200, 200, 200);
5466 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5467 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5468 fillSurfaceRGBA8(child2, 200, 0, 200);
5469
5470 SurfaceComposerClient::Transaction()
5471 .show(child)
5472 .show(child2)
5473 .setLayer(child, 1)
5474 .setLayer(child2, 2)
5475 .apply(true);
5476
5477 // Child2 would be visible but its excluded, so we should see child1 color instead.
5478 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5479 mCapture->checkPixel(10, 10, 0, 0, 0);
5480 mCapture->checkPixel(0, 0, 200, 200, 200);
5481}
5482
5483// Like the last test but verifies that children are also exclude.
5484TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5485 auto fgHandle = mFGSurfaceControl->getHandle();
5486
5487 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5488 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5489 fillSurfaceRGBA8(child, 200, 200, 200);
5490 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5491 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5492 fillSurfaceRGBA8(child2, 200, 0, 200);
5493 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5494 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5495 fillSurfaceRGBA8(child2, 200, 0, 200);
5496
5497 SurfaceComposerClient::Transaction()
5498 .show(child)
5499 .show(child2)
5500 .show(child3)
5501 .setLayer(child, 1)
5502 .setLayer(child2, 2)
5503 .apply(true);
5504
5505 // Child2 would be visible but its excluded, so we should see child1 color instead.
5506 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5507 mCapture->checkPixel(10, 10, 0, 0, 0);
5508 mCapture->checkPixel(0, 0, 200, 200, 200);
5509}
5510
chaviw50da5042018-04-09 13:49:37 -07005511TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005512 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5513 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005514
5515 fillSurfaceRGBA8(child, 200, 200, 200);
5516
5517 SurfaceComposerClient::Transaction().show(child).apply(true);
5518
5519 auto childHandle = child->getHandle();
5520
5521 // Captures child
5522 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5523 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5524 // Area outside of child's bounds is transparent.
5525 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5526}
5527
chaviw4b129c22018-04-09 16:19:43 -07005528TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5529 auto fgHandle = mFGSurfaceControl->getHandle();
5530
Vishnu Nair88a11f22018-11-28 18:30:57 -08005531 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5532 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5533 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005534 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005535 fillSurfaceRGBA8(child, 200, 200, 200);
5536 fillSurfaceRGBA8(relative, 100, 100, 100);
5537
5538 SurfaceComposerClient::Transaction()
5539 .show(child)
5540 // Set relative layer above fg layer so should be shown above when computing all layers.
5541 .setRelativeLayer(relative, fgHandle, 1)
5542 .show(relative)
5543 .apply(true);
5544
5545 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5546 ScreenCapture::captureLayers(&mCapture, fgHandle);
5547 mCapture->expectFGColor(10, 10);
5548 mCapture->expectChildColor(0, 0);
5549}
5550
5551TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5552 auto fgHandle = mFGSurfaceControl->getHandle();
5553
Vishnu Nair88a11f22018-11-28 18:30:57 -08005554 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5555 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5556 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5557 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005558 fillSurfaceRGBA8(child, 200, 200, 200);
5559 fillSurfaceRGBA8(relative, 100, 100, 100);
5560
5561 SurfaceComposerClient::Transaction()
5562 .show(child)
5563 // Set relative layer below fg layer but relative to child layer so it should be shown
5564 // above child layer.
5565 .setLayer(relative, -1)
5566 .setRelativeLayer(relative, child->getHandle(), 1)
5567 .show(relative)
5568 .apply(true);
5569
5570 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5571 // relative value should be taken into account, placing it above child layer.
5572 ScreenCapture::captureLayers(&mCapture, fgHandle);
5573 mCapture->expectFGColor(10, 10);
5574 // Relative layer is showing on top of child layer
5575 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5576}
Robert Carr578038f2018-03-09 12:25:24 -08005577
5578// In the following tests we verify successful skipping of a parent layer,
5579// so we use the same verification logic and only change how we mutate
5580// the parent layer to verify that various properties are ignored.
5581class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5582public:
5583 void SetUp() override {
5584 LayerUpdateTest::SetUp();
5585
Vishnu Nair88a11f22018-11-28 18:30:57 -08005586 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5587 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005588 fillSurfaceRGBA8(mChild, 200, 200, 200);
5589
5590 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5591 }
5592
Vishnu Nair333a9572019-02-15 16:05:56 -08005593 void verify(std::function<void()> verifyStartingState) {
5594 // Verify starting state before a screenshot is taken.
5595 verifyStartingState();
5596
5597 // Verify child layer does not inherit any of the properties of its
5598 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005599 auto fgHandle = mFGSurfaceControl->getHandle();
5600 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5601 mCapture->checkPixel(10, 10, 0, 0, 0);
5602 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005603
5604 // Verify all assumptions are still true after the screenshot is taken.
5605 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005606 }
5607
5608 std::unique_ptr<ScreenCapture> mCapture;
5609 sp<SurfaceControl> mChild;
5610};
5611
Vishnu Nair333a9572019-02-15 16:05:56 -08005612// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005613TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5614
5615 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5616
5617 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005618
5619 // Before and after reparenting, verify child is properly hidden
5620 // when rendering full-screen.
5621 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005622}
5623
5624TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005625 SurfaceComposerClient::Transaction()
5626 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5627 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005628
5629 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005630
5631 // Before and after reparenting, verify child is cropped by parent.
5632 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005633}
5634
Vishnu Nair333a9572019-02-15 16:05:56 -08005635// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005636TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005637 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005638
5639 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005640
Vishnu Nair333a9572019-02-15 16:05:56 -08005641 // Before and after reparenting, verify child is properly scaled.
5642 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005643}
5644
5645
chaviwa76b2712017-09-20 12:02:26 -07005646TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5647 auto fgHandle = mFGSurfaceControl->getHandle();
5648
Vishnu Nair88a11f22018-11-28 18:30:57 -08005649 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5650 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005651 fillSurfaceRGBA8(child, 200, 200, 200);
5652
Vishnu Nair88a11f22018-11-28 18:30:57 -08005653 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5654 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005655
5656 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5657 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005658 .show(child)
5659 .setPosition(grandchild, 5, 5)
5660 .show(grandchild)
5661 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005662
5663 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005664 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005665 mCapture->expectFGColor(10, 10);
5666 mCapture->expectChildColor(0, 0);
5667 mCapture->checkPixel(5, 5, 50, 50, 50);
5668}
5669
5670TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005671 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5672 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005673 fillSurfaceRGBA8(child, 200, 200, 200);
5674 auto childHandle = child->getHandle();
5675
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005676 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005677
5678 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005679 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005680 mCapture->expectChildColor(0, 0);
5681 mCapture->expectChildColor(9, 9);
5682}
5683
5684TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005685 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5686 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005687 fillSurfaceRGBA8(child, 200, 200, 200);
5688 auto childHandle = child->getHandle();
5689
Vishnu Nair88a11f22018-11-28 18:30:57 -08005690 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5691 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005692 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5693
5694 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005695 .show(child)
5696 .setPosition(grandchild, 5, 5)
5697 .show(grandchild)
5698 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005699
5700 auto grandchildHandle = grandchild->getHandle();
5701
5702 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005703 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005704 mCapture->checkPixel(0, 0, 50, 50, 50);
5705 mCapture->checkPixel(4, 4, 50, 50, 50);
5706}
5707
chaviw7206d492017-11-10 16:16:12 -08005708TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005709 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005710 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5711 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005712
Marissa Wall61c58622018-07-18 10:12:20 -07005713 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5714 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005715
5716 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005717 .setLayer(redLayer, INT32_MAX - 1)
5718 .show(redLayer)
5719 .show(blueLayer)
5720 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005721
5722 auto redLayerHandle = redLayer->getHandle();
5723
5724 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005725 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5726 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5727 // red area below the blue area
5728 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5729 // red area to the right of the blue area
5730 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005731
Marissa Wall861616d2018-10-22 12:52:23 -07005732 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005733 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005734 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5735 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005736 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005737 mCapture->checkPixel(30, 30, 0, 0, 0);
5738}
5739
5740TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005741 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005742 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5743 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005744
Marissa Wall61c58622018-07-18 10:12:20 -07005745 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5746 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005747
5748 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005749 .setLayer(redLayer, INT32_MAX - 1)
5750 .show(redLayer)
5751 .show(blueLayer)
5752 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005753
5754 auto redLayerHandle = redLayer->getHandle();
5755
5756 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005757 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5758 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5759 // red area below the blue area
5760 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5761 // red area to the right of the blue area
5762 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005763
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005764 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005765 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005766 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5767 // red area below the blue area
5768 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5769 // red area to the right of the blue area
5770 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005771 mCapture->checkPixel(30, 30, 0, 0, 0);
5772}
5773
5774TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005775 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005776
Marissa Wall61c58622018-07-18 10:12:20 -07005777 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005778
5779 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005780 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005781 SurfaceComposerClient::Transaction().apply(true);
5782
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005783 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005784
5785 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005786 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5787 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005788}
5789
chaviw8e3fe5d2018-02-22 10:55:42 -08005790
5791class DereferenceSurfaceControlTest : public LayerTransactionTest {
5792protected:
5793 void SetUp() override {
5794 LayerTransactionTest::SetUp();
5795 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005796 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005797 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005798 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005799 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5800 {
5801 SCOPED_TRACE("before anything");
5802 auto shot = screenshot();
5803 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5804 }
5805 }
5806 void TearDown() override {
5807 LayerTransactionTest::TearDown();
5808 bgLayer = 0;
5809 fgLayer = 0;
5810 }
5811
5812 sp<SurfaceControl> bgLayer;
5813 sp<SurfaceControl> fgLayer;
5814};
5815
5816TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5817 fgLayer = nullptr;
5818 {
5819 SCOPED_TRACE("after setting null");
5820 auto shot = screenshot();
5821 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5822 }
5823}
5824
5825TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5826 auto transaction = Transaction().show(fgLayer);
5827 fgLayer = nullptr;
5828 {
5829 SCOPED_TRACE("after setting null");
5830 auto shot = screenshot();
5831 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5832 }
5833}
5834
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005835class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5836protected:
5837 virtual void SetUp() {
5838 LayerTransactionTest::SetUp();
5839 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5840
5841 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5842 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5843
5844 sp<IGraphicBufferConsumer> consumer;
5845 BufferQueue::createBufferQueue(&mProducer, &consumer);
5846 consumer->setConsumerName(String8("Virtual disp consumer"));
5847 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5848 }
5849
5850 virtual void TearDown() {
5851 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5852 LayerTransactionTest::TearDown();
5853 mColorLayer = 0;
5854 }
5855
5856 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5857 mVirtualDisplay =
5858 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5859 asTransaction([&](Transaction& t) {
5860 t.setDisplaySurface(mVirtualDisplay, mProducer);
5861 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5862 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5863 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5864 });
5865 }
5866
5867 void createColorLayer(uint32_t layerStack) {
5868 mColorLayer =
5869 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5870 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5871 ASSERT_TRUE(mColorLayer != nullptr);
5872 ASSERT_TRUE(mColorLayer->isValid());
5873 asTransaction([&](Transaction& t) {
5874 t.setLayerStack(mColorLayer, layerStack);
5875 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5876 t.setLayer(mColorLayer, INT32_MAX - 2);
5877 t.setColor(mColorLayer,
5878 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5879 mExpectedColor.b / 255.0f});
5880 t.show(mColorLayer);
5881 });
5882 }
5883
5884 DisplayInfo mMainDisplayInfo;
5885 sp<IBinder> mMainDisplay;
5886 sp<IBinder> mVirtualDisplay;
5887 sp<IGraphicBufferProducer> mProducer;
5888 sp<SurfaceControl> mColorLayer;
5889 Color mExpectedColor = {63, 63, 195, 255};
5890};
5891
5892TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5893 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5894 createColorLayer(1 /* layerStack */);
5895
5896 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5897
5898 // Verify color layer does not render on main display.
5899 std::unique_ptr<ScreenCapture> sc;
5900 ScreenCapture::captureScreen(&sc, mMainDisplay);
5901 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5902 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5903
5904 // Verify color layer renders correctly on virtual display.
5905 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5906 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5907 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5908}
5909
5910TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5911 // Create a display and set its layer stack to the main display's layer stack so
5912 // the contents of the main display are mirrored on to the virtual display.
5913
5914 // Assumption here is that the new mirrored display has the same viewport as the
5915 // primary display that it is mirroring.
5916 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5917 createColorLayer(0 /* layerStack */);
5918
5919 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5920
5921 // Verify color layer renders correctly on main display and it is mirrored on the
5922 // virtual display.
5923 std::unique_ptr<ScreenCapture> sc;
5924 ScreenCapture::captureScreen(&sc, mMainDisplay);
5925 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5926 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5927
5928 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5929 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5930 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5931}
5932
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005933class DisplayActiveConfigTest : public ::testing::Test {
5934protected:
5935 void SetUp() override {
5936 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5937 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5938 EXPECT_GT(mDisplayconfigs.size(), 0);
5939
5940 // set display power to on to make sure config can be changed
5941 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5942 }
5943
5944 sp<IBinder> mDisplayToken;
5945 Vector<DisplayInfo> mDisplayconfigs;
5946};
5947
5948TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5949 std::vector<int32_t> allowedConfigs;
5950
5951 // Add all configs to the allowed configs
5952 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5953 allowedConfigs.push_back(i);
5954 }
5955
5956 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5957 EXPECT_EQ(res, NO_ERROR);
5958
5959 std::vector<int32_t> outConfigs;
5960 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5961 EXPECT_EQ(res, NO_ERROR);
5962 EXPECT_EQ(allowedConfigs, outConfigs);
5963}
5964
5965TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5966 // we need at least 2 configs available for this test
5967 if (mDisplayconfigs.size() <= 1) return;
5968
5969 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5970
5971 // We want to set the allowed config to everything but the active config
5972 std::vector<int32_t> allowedConfigs;
5973 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5974 if (i != activeConfig) {
5975 allowedConfigs.push_back(i);
5976 }
5977 }
5978
5979 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5980 EXPECT_EQ(res, NO_ERROR);
5981
5982 // Allow some time for the config change
5983 std::this_thread::sleep_for(200ms);
5984
5985 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5986 EXPECT_NE(activeConfig, newActiveConfig);
5987
5988 // Make sure the new config is part of allowed config
5989 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5990 allowedConfigs.end());
5991}
5992
Vishnu Nairda9c85a2019-06-03 17:26:48 -07005993class RelativeZTest : public LayerTransactionTest {
5994protected:
5995 virtual void SetUp() {
5996 LayerTransactionTest::SetUp();
5997 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5998
5999 const auto display = SurfaceComposerClient::getInternalDisplayToken();
6000 ASSERT_FALSE(display == nullptr);
6001
6002 // Back layer
6003 mBackgroundLayer = createColorLayer("Background layer", Color::RED);
6004
6005 // Front layer
6006 mForegroundLayer = createColorLayer("Foreground layer", Color::GREEN);
6007
6008 asTransaction([&](Transaction& t) {
6009 t.setDisplayLayerStack(display, 0);
6010 t.setLayer(mBackgroundLayer, INT32_MAX - 2).show(mBackgroundLayer);
6011 t.setLayer(mForegroundLayer, INT32_MAX - 1).show(mForegroundLayer);
6012 });
6013 }
6014
6015 virtual void TearDown() {
6016 LayerTransactionTest::TearDown();
6017 mBackgroundLayer = 0;
6018 mForegroundLayer = 0;
6019 }
6020
6021 sp<SurfaceControl> mBackgroundLayer;
6022 sp<SurfaceControl> mForegroundLayer;
6023};
6024
6025// When a layer is reparented offscreen, remove relative z order if the relative parent
6026// is still onscreen so that the layer is not drawn.
6027TEST_F(RelativeZTest, LayerRemoved) {
6028 std::unique_ptr<ScreenCapture> sc;
6029
6030 // Background layer (RED)
6031 // Child layer (WHITE) (relative to foregroud layer)
6032 // Foregroud layer (GREEN)
6033 sp<SurfaceControl> childLayer =
6034 createColorLayer("Child layer", Color::BLUE, mBackgroundLayer.get());
6035
6036 Transaction{}
6037 .setRelativeLayer(childLayer, mForegroundLayer->getHandle(), 1)
6038 .show(childLayer)
6039 .apply();
6040
6041 {
6042 // The childLayer should be in front of the FG control.
6043 ScreenCapture::captureScreen(&sc);
6044 sc->checkPixel(1, 1, Color::BLUE.r, Color::BLUE.g, Color::BLUE.b);
6045 }
6046
6047 // Background layer (RED)
6048 // Foregroud layer (GREEN)
6049 Transaction{}.reparent(childLayer, nullptr).apply();
6050
6051 // Background layer (RED)
6052 // Child layer (WHITE)
6053 // Foregroud layer (GREEN)
6054 Transaction{}.reparent(childLayer, mBackgroundLayer->getHandle()).apply();
6055
6056 {
6057 // The relative z info for child layer should be reset, leaving FG control on top.
6058 ScreenCapture::captureScreen(&sc);
6059 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6060 }
6061}
6062
6063// When a layer is reparented offscreen, preseve relative z order if the relative parent
6064// is also offscreen. Regression test b/132613412
6065TEST_F(RelativeZTest, LayerRemovedOffscreenRelativeParent) {
6066 std::unique_ptr<ScreenCapture> sc;
6067
6068 // Background layer (RED)
6069 // Foregroud layer (GREEN)
6070 // child level 1 (WHITE)
6071 // child level 2a (BLUE)
6072 // child level 3 (GREEN) (relative to child level 2b)
6073 // child level 2b (BLACK)
6074 sp<SurfaceControl> childLevel1 =
6075 createColorLayer("child level 1", Color::WHITE, mForegroundLayer.get());
6076 sp<SurfaceControl> childLevel2a =
6077 createColorLayer("child level 2a", Color::BLUE, childLevel1.get());
6078 sp<SurfaceControl> childLevel2b =
6079 createColorLayer("child level 2b", Color::BLACK, childLevel1.get());
6080 sp<SurfaceControl> childLevel3 =
6081 createColorLayer("child level 3", Color::GREEN, childLevel2a.get());
6082
6083 Transaction{}
6084 .setRelativeLayer(childLevel3, childLevel2b->getHandle(), 1)
6085 .show(childLevel2a)
6086 .show(childLevel2b)
6087 .show(childLevel3)
6088 .apply();
6089
6090 {
6091 // The childLevel3 should be in front of childLevel2b.
6092 ScreenCapture::captureScreen(&sc);
6093 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6094 }
6095
6096 // Background layer (RED)
6097 // Foregroud layer (GREEN)
6098 Transaction{}.reparent(childLevel1, nullptr).apply();
6099
6100 // Background layer (RED)
6101 // Foregroud layer (GREEN)
6102 // child level 1 (WHITE)
6103 // child level 2 back (BLUE)
6104 // child level 3 (GREEN) (relative to child level 2b)
6105 // child level 2 front (BLACK)
6106 Transaction{}.reparent(childLevel1, mForegroundLayer->getHandle()).apply();
6107
6108 {
6109 // Nothing should change at this point since relative z info was preserved.
6110 ScreenCapture::captureScreen(&sc);
6111 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6112 }
6113}
6114
Steven Thomas44685cb2019-07-23 16:19:31 -07006115// This test ensures that when we drop an app buffer in SurfaceFlinger, we merge
6116// the dropped buffer's damage region into the next buffer's damage region. If
6117// we don't do this, we'll report an incorrect damage region to hardware
6118// composer, resulting in broken rendering. This test checks the BufferQueue
6119// case.
6120//
6121// Unfortunately, we don't currently have a way to inspect the damage region
6122// SurfaceFlinger sends to hardware composer from a test, so this test requires
6123// the dev to manually watch the device's screen during the test to spot broken
6124// rendering. Because the results can't be automatically verified, this test is
6125// marked disabled.
6126TEST_F(LayerTransactionTest, DISABLED_BufferQueueLayerMergeDamageRegionWhenDroppingBuffers) {
6127 const int width = mDisplayWidth;
6128 const int height = mDisplayHeight;
6129 sp<SurfaceControl> layer;
6130 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
6131 const auto producer = layer->getIGraphicBufferProducer();
6132 const sp<IProducerListener> dummyListener(new DummyProducerListener);
6133 IGraphicBufferProducer::QueueBufferOutput queueBufferOutput;
6134 ASSERT_EQ(OK,
6135 producer->connect(dummyListener, NATIVE_WINDOW_API_CPU, true, &queueBufferOutput));
6136
6137 std::map<int, sp<GraphicBuffer>> slotMap;
6138 auto slotToBuffer = [&](int slot, sp<GraphicBuffer>* buf) {
6139 ASSERT_NE(nullptr, buf);
6140 const auto iter = slotMap.find(slot);
6141 ASSERT_NE(slotMap.end(), iter);
6142 *buf = iter->second;
6143 };
6144
6145 auto dequeue = [&](int* outSlot) {
6146 ASSERT_NE(nullptr, outSlot);
6147 *outSlot = -1;
6148 int slot;
6149 sp<Fence> fence;
6150 uint64_t age;
6151 FrameEventHistoryDelta timestamps;
6152 const status_t dequeueResult =
6153 producer->dequeueBuffer(&slot, &fence, width, height, PIXEL_FORMAT_RGBA_8888,
6154 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
6155 &age, &timestamps);
6156 if (dequeueResult == IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) {
6157 sp<GraphicBuffer> newBuf;
6158 ASSERT_EQ(OK, producer->requestBuffer(slot, &newBuf));
6159 ASSERT_NE(nullptr, newBuf.get());
6160 slotMap[slot] = newBuf;
6161 } else {
6162 ASSERT_EQ(OK, dequeueResult);
6163 }
6164 *outSlot = slot;
6165 };
6166
6167 auto queue = [&](int slot, const Region& damage, nsecs_t displayTime) {
6168 IGraphicBufferProducer::QueueBufferInput input(
6169 /*timestamp=*/displayTime, /*isAutoTimestamp=*/false, HAL_DATASPACE_UNKNOWN,
6170 /*crop=*/Rect::EMPTY_RECT, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW,
6171 /*transform=*/0, Fence::NO_FENCE);
6172 input.setSurfaceDamage(damage);
6173 IGraphicBufferProducer::QueueBufferOutput output;
6174 ASSERT_EQ(OK, producer->queueBuffer(slot, input, &output));
6175 };
6176
6177 auto fillAndPostBuffers = [&](const Color& color) {
6178 int slot1;
6179 ASSERT_NO_FATAL_FAILURE(dequeue(&slot1));
6180 int slot2;
6181 ASSERT_NO_FATAL_FAILURE(dequeue(&slot2));
6182
6183 sp<GraphicBuffer> buf1;
6184 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot1, &buf1));
6185 sp<GraphicBuffer> buf2;
6186 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot2, &buf2));
6187 fillGraphicBufferColor(buf1, Rect(width, height), color);
6188 fillGraphicBufferColor(buf2, Rect(width, height), color);
6189
6190 const auto displayTime = systemTime() + milliseconds_to_nanoseconds(100);
6191 ASSERT_NO_FATAL_FAILURE(queue(slot1, Region::INVALID_REGION, displayTime));
6192 ASSERT_NO_FATAL_FAILURE(
6193 queue(slot2, Region(Rect(width / 3, height / 3, 2 * width / 3, 2 * height / 3)),
6194 displayTime));
6195 };
6196
6197 const auto startTime = systemTime();
6198 const std::array<Color, 3> colors = {Color::RED, Color::GREEN, Color::BLUE};
6199 int colorIndex = 0;
6200 while (nanoseconds_to_seconds(systemTime() - startTime) < 10) {
6201 ASSERT_NO_FATAL_FAILURE(fillAndPostBuffers(colors[colorIndex++ % colors.size()]));
6202 std::this_thread::sleep_for(1s);
6203 }
6204
6205 ASSERT_EQ(OK, producer->disconnect(NATIVE_WINDOW_API_CPU));
6206}
6207
Chavi Weingarten40482ff2017-11-30 01:51:40 +00006208} // namespace android