blob: 75bfa4d3b98cc6de300e6dc50ba1f8cf2c87a5a1 [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)
Lucas Dupin0b79f8c2019-08-26 17:01:33 -07001598 .setCrop_legacy(layer, Rect(0, 0, size, size))
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001599 .apply();
1600 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001601 const uint8_t bottom = size - 1;
1602 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001603 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001604 // Transparent corners
1605 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001606 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1607 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1608 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1609 }
1610}
1611
Alec Mouri80863a62019-01-17 15:19:35 -08001612TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001613 sp<SurfaceControl> parent;
1614 sp<SurfaceControl> child;
1615 const uint8_t size = 64;
1616 const uint8_t testArea = 4;
1617 const float cornerRadius = 20.0f;
1618 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1619 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1620 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1621 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1622
1623 Transaction()
1624 .setCornerRadius(parent, cornerRadius)
Lucas Dupin0b79f8c2019-08-26 17:01:33 -07001625 .setCrop_legacy(parent, Rect(0, 0, size, size))
Lucas Dupina1d0e312018-12-04 22:30:27 -08001626 .reparent(child, parent->getHandle())
1627 .setPosition(child, 0, size / 2)
1628 .apply();
1629 {
1630 const uint8_t bottom = size - 1;
1631 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001632 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001633 // Top edge of child should not have rounded corners because it's translated in the parent
1634 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1635 Color::GREEN);
1636 // But bottom edges should have been clipped according to parent bounds
1637 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1638 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001639 }
1640}
1641
Alec Mouri80863a62019-01-17 15:19:35 -08001642TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001643 sp<SurfaceControl> bufferLayer;
1644 sp<SurfaceControl> colorLayer;
1645 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001646 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001647 ASSERT_NO_FATAL_FAILURE(colorLayer =
1648 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1649 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001650
Vishnu Nair88a11f22018-11-28 18:30:57 -08001651 Transaction()
1652 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1653 .setLayer(colorLayer, mLayerZBase + 1)
1654 .apply();
1655
Chia-I Wue4ef6102017-11-01 15:16:35 -07001656 {
1657 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001658 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001659 }
1660
1661 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1662 const Color expected = {15, 51, 85, 255};
1663 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1664 // channel) should be less than one
1665 const uint8_t tolerance = 1;
1666 Transaction().setColor(colorLayer, color).apply();
1667 {
1668 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001669 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001670 }
1671}
1672
Valerie Haudd0b7572019-01-29 14:59:27 -08001673// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1674// BLUE: prior background color
1675// GREEN: final background color
1676// BLACK: no color or fill
1677void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1678 bool bufferFill, float alpha,
1679 Color finalColor) {
1680 sp<SurfaceControl> layer;
1681 int32_t width = 500;
1682 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001683
Valerie Haudd0b7572019-01-29 14:59:27 -08001684 Color fillColor = Color::RED;
1685 Color priorBgColor = Color::BLUE;
1686 Color expectedColor = Color::BLACK;
1687 switch (layerType) {
1688 case ISurfaceComposerClient::eFXSurfaceColor:
1689 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1690 Transaction()
1691 .setCrop_legacy(layer, Rect(0, 0, width, height))
1692 .setColor(layer, half3(1.0f, 0, 0))
1693 .apply();
1694 expectedColor = fillColor;
1695 break;
1696 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1697 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1698 if (bufferFill) {
1699 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1700 expectedColor = fillColor;
1701 }
1702 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1703 break;
1704 case ISurfaceComposerClient::eFXSurfaceBufferState:
1705 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1706 if (bufferFill) {
1707 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1708 expectedColor = fillColor;
1709 }
1710 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1711 break;
1712 default:
1713 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1714 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001715 }
1716
Valerie Haudd0b7572019-01-29 14:59:27 -08001717 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1718 Transaction()
1719 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1720 .apply();
1721 if (!bufferFill) {
1722 expectedColor = priorBgColor;
1723 }
1724 }
1725
1726 {
1727 SCOPED_TRACE("default before setting background color layer");
1728 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1729 }
Valerie Haua72e2812019-01-23 13:40:39 -08001730 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001731 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001732 .apply();
1733
1734 {
Valerie Haua72e2812019-01-23 13:40:39 -08001735 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001736 shot->expectColor(Rect(0, 0, width, height), finalColor);
1737 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001738 }
1739}
1740
Valerie Haudd0b7572019-01-29 14:59:27 -08001741TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1742 bool priorColor = false;
1743 bool bufferFill = false;
1744 float alpha = 1.0f;
1745 Color finalColor = Color::RED;
1746 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1747 priorColor, bufferFill, alpha, finalColor));
1748}
Valerie Haua72e2812019-01-23 13:40:39 -08001749
Valerie Haudd0b7572019-01-29 14:59:27 -08001750TEST_P(LayerRenderTypeTransactionTest,
1751 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1752 bool priorColor = false;
1753 bool bufferFill = true;
1754 float alpha = 1.0f;
1755 Color finalColor = Color::RED;
1756 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1757 priorColor, bufferFill, alpha, finalColor));
1758}
Valerie Haua72e2812019-01-23 13:40:39 -08001759
Valerie Haudd0b7572019-01-29 14:59:27 -08001760TEST_P(LayerRenderTypeTransactionTest,
1761 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1762 bool priorColor = false;
1763 bool bufferFill = false;
1764 float alpha = 1.0f;
1765 Color finalColor = Color::GREEN;
1766 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1767 priorColor, bufferFill, alpha, finalColor));
1768}
Valerie Haua72e2812019-01-23 13:40:39 -08001769
Valerie Haudd0b7572019-01-29 14:59:27 -08001770TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1771 bool priorColor = true;
1772 bool bufferFill = true;
1773 float alpha = 1.0f;
1774 Color finalColor = Color::RED;
1775 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1776 priorColor, bufferFill, alpha, finalColor));
1777}
1778
1779TEST_P(LayerRenderTypeTransactionTest,
1780 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1781 bool priorColor = true;
1782 bool bufferFill = false;
1783 float alpha = 1.0f;
1784 Color finalColor = Color::GREEN;
1785 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1786 priorColor, bufferFill, alpha, finalColor));
1787}
1788TEST_P(LayerRenderTypeTransactionTest,
1789 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1790 bool priorColor = false;
1791 bool bufferFill = false;
1792 float alpha = 0;
1793 Color finalColor = Color::BLACK;
1794 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1795 priorColor, bufferFill, alpha, finalColor));
1796}
1797
1798TEST_P(LayerRenderTypeTransactionTest,
1799 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1800 bool priorColor = true;
1801 bool bufferFill = false;
1802 float alpha = 0;
1803 Color finalColor = Color::BLACK;
1804 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1805 priorColor, bufferFill, alpha, finalColor));
1806}
1807
1808TEST_P(LayerRenderTypeTransactionTest,
1809 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1810 bool priorColor = false;
1811 bool bufferFill = true;
1812 float alpha = 1.0f;
1813 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001814 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001815 priorColor, bufferFill, alpha, finalColor));
1816}
1817
1818TEST_P(LayerRenderTypeTransactionTest,
1819 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1820 bool priorColor = false;
1821 bool bufferFill = false;
1822 float alpha = 1.0f;
1823 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001824 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001825 priorColor, bufferFill, alpha, finalColor));
1826}
1827
1828TEST_P(LayerRenderTypeTransactionTest,
1829 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1830 bool priorColor = true;
1831 bool bufferFill = false;
1832 float alpha = 1.0f;
1833 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001834 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001835 priorColor, bufferFill, alpha, finalColor));
1836}
1837
1838TEST_P(LayerRenderTypeTransactionTest,
1839 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1840 bool priorColor = false;
1841 bool bufferFill = false;
1842 float alpha = 0;
1843 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001844 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001845 priorColor, bufferFill, alpha, finalColor));
1846}
1847
1848TEST_P(LayerRenderTypeTransactionTest,
1849 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1850 bool priorColor = true;
1851 bool bufferFill = false;
1852 float alpha = 0;
1853 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001854 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001855 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001856}
1857
Alec Mouri80863a62019-01-17 15:19:35 -08001858TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001859 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001860 ASSERT_NO_FATAL_FAILURE(colorLayer =
1861 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1862 ISurfaceComposerClient::eFXSurfaceColor));
1863 Transaction()
1864 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1865 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1866 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001867
Alec Mouri80863a62019-01-17 15:19:35 -08001868 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001869}
1870
Alec Mouri80863a62019-01-17 15:19:35 -08001871TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001872 sp<SurfaceControl> bufferLayer;
1873 sp<SurfaceControl> colorLayer;
1874 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001875 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001876 ASSERT_NO_FATAL_FAILURE(colorLayer =
1877 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1878 ISurfaceComposerClient::eFXSurfaceColor));
1879 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001880
1881 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1882 const float alpha = 0.25f;
1883 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1884 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1885 // channel) should be less than one
1886 const uint8_t tolerance = 1;
1887 Transaction()
1888 .setColor(colorLayer, color)
1889 .setAlpha(colorLayer, alpha)
1890 .setLayer(colorLayer, mLayerZBase + 1)
1891 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001892 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1893 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001894}
1895
Alec Mouri80863a62019-01-17 15:19:35 -08001896TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001897 sp<SurfaceControl> bufferLayer;
1898 sp<SurfaceControl> parentLayer;
1899 sp<SurfaceControl> colorLayer;
1900 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1901 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001902 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001903 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1904 0 /* buffer height */,
1905 ISurfaceComposerClient::eFXSurfaceColor));
1906 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001907 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1908 const float alpha = 0.25f;
1909 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1910 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1911 // channel) should be less than one
1912 const uint8_t tolerance = 1;
1913 Transaction()
1914 .reparent(colorLayer, parentLayer->getHandle())
1915 .setColor(colorLayer, color)
1916 .setAlpha(parentLayer, alpha)
1917 .setLayer(parentLayer, mLayerZBase + 1)
1918 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001919 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1920 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001921}
1922
Alec Mouri80863a62019-01-17 15:19:35 -08001923TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001924 sp<SurfaceControl> bufferLayer;
1925 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001926 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001927
1928 // color is ignored
1929 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001930 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001931}
1932
Alec Mouri80863a62019-01-17 15:19:35 -08001933TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001934 sp<SurfaceControl> layer;
1935 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001936 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001937
1938 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1939 {
1940 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001941 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001942 }
1943
1944 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1945 {
1946 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001947 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001948 }
1949}
1950
Alec Mouri80863a62019-01-17 15:19:35 -08001951TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001952 sp<SurfaceControl> layer;
1953 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001954 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1955 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001956
1957 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1958 {
1959 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001960 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1961 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001962 }
1963
1964 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1965 {
1966 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001967 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1968 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001969 }
1970
1971 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1972 {
1973 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001974 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1975 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001976 }
1977
1978 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1979 {
1980 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001981 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1982 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001983 }
1984
1985 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1986 {
1987 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001988 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1989 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001990 }
1991}
1992
Alec Mouri80863a62019-01-17 15:19:35 -08001993TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001994 sp<SurfaceControl> layer;
1995 ASSERT_NO_FATAL_FAILURE(
1996 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1997 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1998 Color::BLUE, Color::WHITE));
1999
2000 Transaction()
2001 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
2002 .setFrame(layer, Rect(0, 0, 32, 32))
2003 .apply();
2004 {
2005 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08002006 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2007 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002008 }
2009
2010 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
2011 {
2012 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08002013 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2014 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002015 }
2016
2017 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
2018 {
2019 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08002020 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2021 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002022 }
2023
2024 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
2025 {
2026 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08002027 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2028 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002029 }
2030
2031 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
2032 {
2033 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08002034 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
2035 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07002036 }
2037}
2038
Alec Mouri80863a62019-01-17 15:19:35 -08002039TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002040 sp<SurfaceControl> layer;
2041 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002042 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2043 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002044
2045 const float rot = M_SQRT1_2; // 45 degrees
2046 const float trans = M_SQRT2 * 16.0f;
2047 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
2048
Alec Mouri80863a62019-01-17 15:19:35 -08002049 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07002050 // check a 8x8 region inside each color
2051 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
2052 const int32_t halfL = 4;
2053 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
2054 };
2055 const int32_t unit = int32_t(trans / 2);
2056 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
2057 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
2058 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
2059 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
2060}
2061
Alec Mouri80863a62019-01-17 15:19:35 -08002062TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002063 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07002064 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2065 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002066
2067 // setMatrix is applied after any pending resize, unlike setPosition
2068 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
2069 {
2070 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002071 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002072 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07002073 shot->expectColor(rect, Color::RED);
2074 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002075 }
2076
Marissa Wall861616d2018-10-22 12:52:23 -07002077 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002078 {
2079 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07002080 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08002081 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002082 }
2083}
2084
Alec Mouri80863a62019-01-17 15:19:35 -08002085TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002086 sp<SurfaceControl> layer;
2087 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002088 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002089
2090 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
2091 Transaction()
2092 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
2093 .setSize(layer, 64, 64)
2094 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2095 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002096 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002097}
2098
Alec Mouri80863a62019-01-17 15:19:35 -08002099TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07002100 sp<SurfaceControl> layer;
2101 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002102 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2103 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07002104
2105 // XXX SCALE_CROP is not respected; calling setSize and
2106 // setOverrideScalingMode in separate transactions does not work
2107 // (b/69315456)
2108 Transaction()
2109 .setSize(layer, 64, 16)
2110 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2111 .apply();
2112 {
2113 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002114 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2115 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002116 }
2117}
2118
Dan Stoza000dd012018-08-01 13:31:52 -07002119TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2120 sp<SurfaceControl> layer;
2121 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2122
2123 sp<IBinder> handle = layer->getHandle();
2124 ASSERT_TRUE(handle != nullptr);
2125
2126 FrameStats frameStats;
2127 mClient->getLayerFrameStats(handle, &frameStats);
2128
2129 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2130}
2131
Alec Mouri80863a62019-01-17 15:19:35 -08002132TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002133 sp<SurfaceControl> layer;
2134 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002135 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002136 const Rect crop(8, 8, 24, 24);
2137
Marissa Wallf58c14b2018-07-24 10:50:43 -07002138 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002139 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002140 shot->expectColor(crop, Color::RED);
2141 shot->expectBorder(crop, Color::BLACK);
2142}
2143
Alec Mouri80863a62019-01-17 15:19:35 -08002144TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002145 sp<SurfaceControl> layer;
2146 ASSERT_NO_FATAL_FAILURE(
2147 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2148 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2149 const Rect crop(8, 8, 24, 24);
2150
2151 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002152 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002153 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2154 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002155}
2156
Alec Mouri80863a62019-01-17 15:19:35 -08002157TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002158 sp<SurfaceControl> layer;
2159 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002160 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002161
2162 {
2163 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002164 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002165 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002166 }
2167
2168 {
2169 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002170 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002171 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002172 }
2173}
2174
Alec Mouri80863a62019-01-17 15:19:35 -08002175TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002176 sp<SurfaceControl> layer;
2177 ASSERT_NO_FATAL_FAILURE(
2178 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2179 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2180
2181 {
2182 SCOPED_TRACE("empty rect");
2183 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002184 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002185 }
2186
2187 {
2188 SCOPED_TRACE("negative rect");
2189 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002190 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002191 }
2192}
2193
Alec Mouri80863a62019-01-17 15:19:35 -08002194TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002195 sp<SurfaceControl> layer;
2196 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002197 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198
Marissa Wallf58c14b2018-07-24 10:50:43 -07002199 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002200 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002201 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2202 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2203}
2204
Alec Mouri80863a62019-01-17 15:19:35 -08002205TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002206 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002207 ASSERT_NO_FATAL_FAILURE(
2208 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002209 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002210 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002211 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2212 BufferUsage::COMPOSER_OVERLAY,
2213 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002214 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2215 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2216
2217 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002218
2219 Transaction().setBuffer(layer, buffer).apply();
2220
2221 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002222 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002223 {
2224 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002225 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002226 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2227 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002228 }
2229
2230 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002231 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002232 {
2233 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002234 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002235 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2236 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002237 }
2238
2239 // Fully out of buffer space bounds
2240 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2241 {
2242 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002243 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002244 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2245 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2246 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002247 }
2248}
2249
Alec Mouri80863a62019-01-17 15:19:35 -08002250TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002251 sp<SurfaceControl> layer;
2252 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002253 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002254
2255 const Point position(32, 32);
2256 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002257 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002258 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002259 shot->expectColor(crop + position, Color::RED);
2260 shot->expectBorder(crop + position, Color::BLACK);
2261}
2262
Alec Mouri80863a62019-01-17 15:19:35 -08002263TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002264 sp<SurfaceControl> layer;
2265 ASSERT_NO_FATAL_FAILURE(
2266 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2267 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2268
Marissa Wall861616d2018-10-22 12:52:23 -07002269 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002270 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002271 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002272 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002273 shot->expectColor(frame, Color::RED);
2274 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002275}
2276
Alec Mouri80863a62019-01-17 15:19:35 -08002277TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002278 sp<SurfaceControl> layer;
2279 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002280 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002281
Marissa Wall861616d2018-10-22 12:52:23 -07002282 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002283 Transaction()
2284 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002285 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002286 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002287 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002288 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2289 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2290}
2291
Alec Mouri80863a62019-01-17 15:19:35 -08002292TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002293 sp<SurfaceControl> layer;
2294 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002295 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002296
Marissa Wallf58c14b2018-07-24 10:50:43 -07002297 // setCrop_legacy is applied immediately by default, with or without resize pending
2298 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002299 {
2300 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002301 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002302 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2303 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2304 }
2305
Marissa Wall61c58622018-07-18 10:12:20 -07002306 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002307 {
2308 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002309 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002310 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2311 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2312 }
2313}
2314
Alec Mouri80863a62019-01-17 15:19:35 -08002315TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002316 sp<SurfaceControl> layer;
2317 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002318 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002319
Marissa Wallf58c14b2018-07-24 10:50:43 -07002320 // request setCrop_legacy to be applied with the next resize
2321 Transaction()
2322 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2323 .setGeometryAppliesWithResize(layer)
2324 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002325 {
2326 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002327 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002328 }
2329
Marissa Wallf58c14b2018-07-24 10:50:43 -07002330 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002331 {
2332 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002333 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002334 }
2335
2336 Transaction().setSize(layer, 16, 16).apply();
2337 {
2338 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002339 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002340 }
2341
2342 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002343 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002344 {
2345 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002346 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002347 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2348 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2349 }
2350}
2351
Alec Mouri80863a62019-01-17 15:19:35 -08002352TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002353 sp<SurfaceControl> layer;
2354 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002355 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002356
Marissa Wallf58c14b2018-07-24 10:50:43 -07002357 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002358 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002359 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002360 .setSize(layer, 16, 16)
2361 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2362 .setGeometryAppliesWithResize(layer)
2363 .apply();
2364 {
2365 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002366 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002367 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2368 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2369 }
2370
2371 // XXX crop is never latched without other geometry change (b/69315677)
2372 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002373 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002374 Transaction().setPosition(layer, 0, 0).apply();
2375 {
2376 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002377 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002378 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2379 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2380 }
2381}
2382
Alec Mouri80863a62019-01-17 15:19:35 -08002383TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002384 sp<SurfaceControl> layer;
2385 ASSERT_NO_FATAL_FAILURE(
2386 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2387 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2388 const Rect frame(8, 8, 24, 24);
2389
2390 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002391 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002392 shot->expectColor(frame, Color::RED);
2393 shot->expectBorder(frame, Color::BLACK);
2394}
2395
Alec Mouri80863a62019-01-17 15:19:35 -08002396TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002397 sp<SurfaceControl> layer;
2398 ASSERT_NO_FATAL_FAILURE(
2399 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2400 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2401
Marissa Wall61c58622018-07-18 10:12:20 -07002402 {
Marissa Wall861616d2018-10-22 12:52:23 -07002403 SCOPED_TRACE("empty rect");
2404 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002405 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002406 }
2407
Marissa Wall61c58622018-07-18 10:12:20 -07002408 {
Marissa Wall861616d2018-10-22 12:52:23 -07002409 SCOPED_TRACE("negative rect");
2410 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002411 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002412 }
2413}
2414
Alec Mouri80863a62019-01-17 15:19:35 -08002415TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002416 sp<SurfaceControl> layer;
2417 ASSERT_NO_FATAL_FAILURE(
2418 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2419 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2420
2421 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002422 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002423 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2424 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002425}
2426
Alec Mouri80863a62019-01-17 15:19:35 -08002427TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002428 sp<SurfaceControl> parent, child;
2429 ASSERT_NO_FATAL_FAILURE(
2430 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2431 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2432 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2433
2434 ASSERT_NO_FATAL_FAILURE(
2435 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2436 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2437
2438 Transaction().reparent(child, parent->getHandle()).apply();
2439
2440 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002441 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002442 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2443 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2444}
2445
Alec Mouri80863a62019-01-17 15:19:35 -08002446TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002447 sp<SurfaceControl> parent, child;
2448 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2449 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2450
2451 ASSERT_NO_FATAL_FAILURE(
2452 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2453 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2454
2455 Transaction().reparent(child, parent->getHandle()).apply();
2456
2457 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002458 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002459 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2460 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2461}
2462
Alec Mouri80863a62019-01-17 15:19:35 -08002463TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002464 sp<SurfaceControl> layer;
2465 ASSERT_NO_FATAL_FAILURE(
2466 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2467 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2468 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2469
2470 std::this_thread::sleep_for(500ms);
2471
2472 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2473
Alec Mouri80863a62019-01-17 15:19:35 -08002474 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002475 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2476 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2477}
2478
Alec Mouri80863a62019-01-17 15:19:35 -08002479TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002480 sp<SurfaceControl> parent, child;
2481 ASSERT_NO_FATAL_FAILURE(
2482 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2483 ASSERT_NO_FATAL_FAILURE(
2484 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2485 Transaction().reparent(child, parent->getHandle()).apply();
2486
2487 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2488 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2489
2490 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2491 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2492
Alec Mouri80863a62019-01-17 15:19:35 -08002493 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002494 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2495 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2496 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2497}
2498
Alec Mouri80863a62019-01-17 15:19:35 -08002499TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002500 sp<SurfaceControl> layer;
2501 ASSERT_NO_FATAL_FAILURE(
2502 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2503
2504 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2505
Alec Mouri80863a62019-01-17 15:19:35 -08002506 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002507 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2508 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002509}
2510
Alec Mouri80863a62019-01-17 15:19:35 -08002511TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002512 sp<SurfaceControl> layer;
2513 ASSERT_NO_FATAL_FAILURE(
2514 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2515
2516 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2517
2518 {
2519 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002520 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002521 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2522 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002523 }
2524
2525 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2526
2527 {
2528 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002529 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002530 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2531 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002532 }
2533
2534 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2535
2536 {
2537 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002538 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002539 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2540 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002541 }
2542}
2543
Alec Mouri80863a62019-01-17 15:19:35 -08002544TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002545 sp<SurfaceControl> layer1;
2546 ASSERT_NO_FATAL_FAILURE(
2547 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2548
2549 sp<SurfaceControl> layer2;
2550 ASSERT_NO_FATAL_FAILURE(
2551 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2552
2553 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2554
Marissa Wall861616d2018-10-22 12:52:23 -07002555 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002556 {
2557 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002558 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002559 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2560 }
2561
2562 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2563
Marissa Wall861616d2018-10-22 12:52:23 -07002564 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002565 {
2566 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002567 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002568 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2569 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2570 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2571 }
2572
2573 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2574 {
2575 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002576 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002577 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2578 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2579 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2580 }
2581
2582 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2583
2584 {
2585 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002586 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002587 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2588 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2589 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2590 }
2591}
2592
Valerie Haua6b15a12019-02-05 14:16:30 -08002593TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002594 sp<SurfaceControl> layer;
2595 ASSERT_NO_FATAL_FAILURE(
2596 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2597
2598 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2599
2600 std::array<sp<GraphicBuffer>, 10> buffers;
2601
2602 size_t idx = 0;
2603 for (auto& buffer : buffers) {
2604 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2605 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2606 BufferUsage::COMPOSER_OVERLAY,
2607 "test");
2608 Color color = colors[idx % colors.size()];
2609 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2610 idx++;
2611 }
2612
2613 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2614 // cache is working.
2615 idx = 0;
2616 for (auto& buffer : buffers) {
2617 for (int i = 0; i < 2; i++) {
2618 Transaction().setBuffer(layer, buffer).apply();
2619
2620 Color color = colors[idx % colors.size()];
2621 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002622 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2623 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002624 }
2625 idx++;
2626 }
2627}
2628
Valerie Haua6b15a12019-02-05 14:16:30 -08002629TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002630 sp<SurfaceControl> layer;
2631 ASSERT_NO_FATAL_FAILURE(
2632 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2633
2634 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2635
2636 std::array<sp<GraphicBuffer>, 70> buffers;
2637
2638 size_t idx = 0;
2639 for (auto& buffer : buffers) {
2640 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2641 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2642 BufferUsage::COMPOSER_OVERLAY,
2643 "test");
2644 Color color = colors[idx % colors.size()];
2645 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2646 idx++;
2647 }
2648
2649 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2650 // cache is working.
2651 idx = 0;
2652 for (auto& buffer : buffers) {
2653 for (int i = 0; i < 2; i++) {
2654 Transaction().setBuffer(layer, buffer).apply();
2655
2656 Color color = colors[idx % colors.size()];
2657 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002658 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2659 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002660 }
2661 idx++;
2662 }
2663}
2664
Valerie Haua6b15a12019-02-05 14:16:30 -08002665TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002666 sp<SurfaceControl> layer;
2667 ASSERT_NO_FATAL_FAILURE(
2668 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2669
2670 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2671
2672 std::array<sp<GraphicBuffer>, 65> buffers;
2673
2674 size_t idx = 0;
2675 for (auto& buffer : buffers) {
2676 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2677 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2678 BufferUsage::COMPOSER_OVERLAY,
2679 "test");
2680 Color color = colors[idx % colors.size()];
2681 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2682 idx++;
2683 }
2684
2685 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2686 // cache is working.
2687 idx = 0;
2688 for (auto& buffer : buffers) {
2689 for (int i = 0; i < 2; i++) {
2690 Transaction().setBuffer(layer, buffer).apply();
2691
2692 Color color = colors[idx % colors.size()];
2693 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002694 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2695 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002696 }
2697 if (idx == 0) {
2698 buffers[0].clear();
2699 }
2700 idx++;
2701 }
2702}
2703
Alec Mouri80863a62019-01-17 15:19:35 -08002704TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002705 sp<SurfaceControl> layer;
2706 ASSERT_NO_FATAL_FAILURE(
2707 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2708
2709 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2710 Color::BLUE, Color::WHITE));
2711
Marissa Wall861616d2018-10-22 12:52:23 -07002712 Transaction()
2713 .setFrame(layer, Rect(0, 0, 32, 32))
2714 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2715 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002716
Alec Mouri80863a62019-01-17 15:19:35 -08002717 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2718 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002719}
2720
Alec Mouri80863a62019-01-17 15:19:35 -08002721TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002722 sp<SurfaceControl> layer;
2723 ASSERT_NO_FATAL_FAILURE(
2724 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2725
2726 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2727 Color::BLUE, Color::WHITE));
2728
Marissa Wall861616d2018-10-22 12:52:23 -07002729 Transaction()
2730 .setFrame(layer, Rect(0, 0, 32, 32))
2731 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2732 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002733
Alec Mouri80863a62019-01-17 15:19:35 -08002734 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2735 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002736}
2737
Alec Mouri80863a62019-01-17 15:19:35 -08002738TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002739 sp<SurfaceControl> layer;
2740 ASSERT_NO_FATAL_FAILURE(
2741 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2742
2743 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2744 Color::BLUE, Color::WHITE));
2745
Marissa Wall861616d2018-10-22 12:52:23 -07002746 Transaction()
2747 .setFrame(layer, Rect(0, 0, 32, 32))
2748 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2749 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002750
Alec Mouri80863a62019-01-17 15:19:35 -08002751 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2752 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002753}
2754
2755TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2756 sp<SurfaceControl> layer;
2757 ASSERT_NO_FATAL_FAILURE(
2758 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2759
2760 Transaction().setTransformToDisplayInverse(layer, false).apply();
2761
2762 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2763
2764 Transaction().setTransformToDisplayInverse(layer, true).apply();
2765}
2766
Alec Mouri80863a62019-01-17 15:19:35 -08002767TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002768 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002769 Transaction transaction;
2770 ASSERT_NO_FATAL_FAILURE(
2771 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2772
2773 sp<GraphicBuffer> buffer =
2774 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2775 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2776 BufferUsage::COMPOSER_OVERLAY,
2777 "test");
2778 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2779
2780 sp<Fence> fence;
2781 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2782 GTEST_SUCCEED() << "test not supported";
2783 return;
2784 }
2785
2786 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2787
2788 status_t status = fence->wait(1000);
2789 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2790 std::this_thread::sleep_for(200ms);
2791
Alec Mouri80863a62019-01-17 15:19:35 -08002792 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002793 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2794 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002795}
2796
Alec Mouri80863a62019-01-17 15:19:35 -08002797TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002798 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002799 ASSERT_NO_FATAL_FAILURE(
2800 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2801
2802 sp<GraphicBuffer> buffer =
2803 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2804 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2805 BufferUsage::COMPOSER_OVERLAY,
2806 "test");
2807 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2808
Marissa Wallfda30bb2018-10-12 11:34:28 -07002809 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002810
2811 Transaction()
2812 .setBuffer(layer, buffer)
2813 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002814 .apply();
2815
Alec Mouri80863a62019-01-17 15:19:35 -08002816 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002817 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2818 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002819}
2820
Alec Mouri80863a62019-01-17 15:19:35 -08002821TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002822 sp<SurfaceControl> layer;
2823 ASSERT_NO_FATAL_FAILURE(
2824 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2825
2826 sp<GraphicBuffer> buffer =
2827 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2828 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2829 BufferUsage::COMPOSER_OVERLAY,
2830 "test");
2831 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2832
2833 Transaction()
2834 .setBuffer(layer, buffer)
2835 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002836 .apply();
2837
Alec Mouri80863a62019-01-17 15:19:35 -08002838 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002839 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2840 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002841}
2842
Alec Mouri80863a62019-01-17 15:19:35 -08002843TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002844 sp<SurfaceControl> layer;
2845 ASSERT_NO_FATAL_FAILURE(
2846 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2847
2848 sp<GraphicBuffer> buffer =
2849 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2850 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2851 BufferUsage::COMPOSER_OVERLAY,
2852 "test");
2853 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2854
2855 HdrMetadata hdrMetadata;
2856 hdrMetadata.validTypes = 0;
2857 Transaction()
2858 .setBuffer(layer, buffer)
2859 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002860 .apply();
2861
Alec Mouri80863a62019-01-17 15:19:35 -08002862 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002863 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2864 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002865}
2866
Alec Mouri80863a62019-01-17 15:19:35 -08002867TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002868 sp<SurfaceControl> layer;
2869 ASSERT_NO_FATAL_FAILURE(
2870 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2871
2872 sp<GraphicBuffer> buffer =
2873 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2874 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2875 BufferUsage::COMPOSER_OVERLAY,
2876 "test");
2877 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2878
2879 Region region;
2880 region.set(32, 32);
2881 Transaction()
2882 .setBuffer(layer, buffer)
2883 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002884 .apply();
2885
Alec Mouri80863a62019-01-17 15:19:35 -08002886 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002887 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2888 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002889}
2890
Alec Mouri80863a62019-01-17 15:19:35 -08002891TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002892 sp<SurfaceControl> layer;
2893 ASSERT_NO_FATAL_FAILURE(
2894 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2895
2896 sp<GraphicBuffer> buffer =
2897 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2898 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2899 BufferUsage::COMPOSER_OVERLAY,
2900 "test");
2901 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2902
2903 Transaction()
2904 .setBuffer(layer, buffer)
2905 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002906 .apply();
2907
Alec Mouri80863a62019-01-17 15:19:35 -08002908 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002909 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2910 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002911}
2912
2913TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2914 sp<SurfaceControl> layer;
2915 ASSERT_NO_FATAL_FAILURE(
2916 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2917
2918 // verify this doesn't cause a crash
2919 Transaction().setSidebandStream(layer, nullptr).apply();
2920}
2921
Robert Carr54cf5b12019-01-25 14:02:28 -08002922TEST_F(LayerTransactionTest, ReparentToSelf) {
2923 sp<SurfaceControl> layer;
2924 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2925 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2926 Transaction().reparent(layer, layer->getHandle()).apply();
2927
2928 {
2929 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2930 // to still be functioning.
2931 SCOPED_TRACE("after reparent to self");
2932 const Rect rect(0, 0, 32, 32);
2933 auto shot = screenshot();
2934 shot->expectColor(rect, Color::RED);
2935 shot->expectBorder(rect, Color::BLACK);
2936 }
2937}
2938
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002939class ColorTransformHelper {
2940public:
2941 static void DegammaColorSingle(half& s) {
2942 if (s <= 0.03928f)
2943 s = s / 12.92f;
2944 else
2945 s = pow((s + 0.055f) / 1.055f, 2.4f);
2946 }
2947
2948 static void DegammaColor(half3& color) {
2949 DegammaColorSingle(color.r);
2950 DegammaColorSingle(color.g);
2951 DegammaColorSingle(color.b);
2952 }
2953
2954 static void GammaColorSingle(half& s) {
2955 if (s <= 0.0031308f) {
2956 s = s * 12.92f;
2957 } else {
2958 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2959 }
2960 }
2961
2962 static void GammaColor(half3& color) {
2963 GammaColorSingle(color.r);
2964 GammaColorSingle(color.g);
2965 GammaColorSingle(color.b);
2966 }
2967
2968 static void applyMatrix(half3& color, const mat3& mat) {
2969 half3 ret = half3(0);
2970
2971 for (int i = 0; i < 3; i++) {
2972 for (int j = 0; j < 3; j++) {
2973 ret[i] = ret[i] + color[j] * mat[j][i];
2974 }
2975 }
2976 color = ret;
2977 }
2978};
2979
Alec Mouri80863a62019-01-17 15:19:35 -08002980TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002981 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002982 ASSERT_NO_FATAL_FAILURE(colorLayer =
2983 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2984 ISurfaceComposerClient::eFXSurfaceColor));
2985 Transaction()
2986 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2987 .setLayer(colorLayer, mLayerZBase + 1)
2988 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002989 {
2990 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002991 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002992 }
2993
2994 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002995 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002996 mat3 matrix;
2997 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2998 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2999 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07003000
3001 // degamma before applying the matrix
3002 if (mColorManagementUsed) {
3003 ColorTransformHelper::DegammaColor(expected);
3004 }
3005
3006 ColorTransformHelper::applyMatrix(expected, matrix);
3007
3008 if (mColorManagementUsed) {
3009 ColorTransformHelper::GammaColor(expected);
3010 }
3011
3012 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3013 uint8_t(expected.b * 255), 255};
3014
3015 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3016 // channel) should be less than one
3017 const uint8_t tolerance = 1;
3018
Peiyong Lind3788632018-09-18 16:01:31 -07003019 Transaction().setColor(colorLayer, color)
3020 .setColorTransform(colorLayer, matrix, vec3()).apply();
3021 {
3022 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003023 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07003024 }
3025}
3026
Alec Mouri80863a62019-01-17 15:19:35 -08003027TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08003028 sp<SurfaceControl> parentLayer;
3029 sp<SurfaceControl> colorLayer;
3030 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3031 0 /* buffer height */,
3032 ISurfaceComposerClient::eFXSurfaceContainer));
3033 ASSERT_NO_FATAL_FAILURE(
3034 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3035 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3036
3037 Transaction()
3038 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3039 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3040 .setLayer(parentLayer, mLayerZBase + 1)
3041 .apply();
3042 {
3043 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003044 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003045 }
3046
3047 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3048 half3 expected = color;
3049 mat3 matrix;
3050 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
3051 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
3052 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
3053
3054 // degamma before applying the matrix
3055 if (mColorManagementUsed) {
3056 ColorTransformHelper::DegammaColor(expected);
3057 }
3058
3059 ColorTransformHelper::applyMatrix(expected, matrix);
3060
3061 if (mColorManagementUsed) {
3062 ColorTransformHelper::GammaColor(expected);
3063 }
3064
3065 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3066 uint8_t(expected.b * 255), 255};
3067
3068 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3069 // channel) should be less than one
3070 const uint8_t tolerance = 1;
3071
3072 Transaction()
3073 .setColor(colorLayer, color)
3074 .setColorTransform(parentLayer, matrix, vec3())
3075 .apply();
3076 {
3077 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003078 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003079 }
3080}
3081
Alec Mouri80863a62019-01-17 15:19:35 -08003082TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08003083 sp<SurfaceControl> parentLayer;
3084 sp<SurfaceControl> colorLayer;
3085 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3086 0 /* buffer height */,
3087 ISurfaceComposerClient::eFXSurfaceContainer));
3088 ASSERT_NO_FATAL_FAILURE(
3089 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3090 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3091
3092 Transaction()
3093 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3094 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3095 .setLayer(parentLayer, mLayerZBase + 1)
3096 .apply();
3097 {
3098 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003099 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003100 }
3101
3102 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3103 half3 expected = color;
3104 mat3 matrixChild;
3105 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
3106 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
3107 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
3108 mat3 matrixParent;
3109 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
3110 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
3111 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3112
3113 // degamma before applying the matrix
3114 if (mColorManagementUsed) {
3115 ColorTransformHelper::DegammaColor(expected);
3116 }
3117
3118 ColorTransformHelper::applyMatrix(expected, matrixChild);
3119 ColorTransformHelper::applyMatrix(expected, matrixParent);
3120
3121 if (mColorManagementUsed) {
3122 ColorTransformHelper::GammaColor(expected);
3123 }
3124
3125 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3126 uint8_t(expected.b * 255), 255};
3127
3128 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3129 // channel) should be less than one
3130 const uint8_t tolerance = 1;
3131
3132 Transaction()
3133 .setColor(colorLayer, color)
3134 .setColorTransform(parentLayer, matrixParent, vec3())
3135 .setColorTransform(colorLayer, matrixChild, vec3())
3136 .apply();
3137 {
3138 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003139 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003140 }
3141}
3142
Marissa Wall80d94ad2019-01-18 16:04:36 -08003143struct CallbackData {
3144 CallbackData() = default;
3145 CallbackData(nsecs_t time, const sp<Fence>& fence,
3146 const std::vector<SurfaceControlStats>& stats)
3147 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3148
3149 nsecs_t latchTime;
3150 sp<Fence> presentFence;
3151 std::vector<SurfaceControlStats> surfaceControlStats;
3152};
3153
Marissa Wallfda30bb2018-10-12 11:34:28 -07003154class ExpectedResult {
3155public:
3156 enum Transaction {
3157 NOT_PRESENTED = 0,
3158 PRESENTED,
3159 };
3160
3161 enum Buffer {
3162 NOT_ACQUIRED = 0,
3163 ACQUIRED,
3164 };
3165
3166 enum PreviousBuffer {
3167 NOT_RELEASED = 0,
3168 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003169 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003170 };
3171
3172 void reset() {
3173 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3174 mExpectedSurfaceResults.clear();
3175 }
3176
3177 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003178 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003179 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3180 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003181 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003182 std::forward_as_tuple(bufferResult, previousBufferResult));
3183 }
3184
3185 void addSurfaces(ExpectedResult::Transaction transactionResult,
3186 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003187 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003188 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3189 for (const auto& layer : layers) {
3190 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3191 }
3192 }
3193
Marissa Wall17b4e452018-12-26 16:32:34 -08003194 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3195 mExpectedPresentTime = expectedPresentTime;
3196 }
3197
Marissa Wall80d94ad2019-01-18 16:04:36 -08003198 void verifyCallbackData(const CallbackData& callbackData) const {
3199 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003200 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3201 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003202 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003203 if (mExpectedPresentTime >= 0) {
3204 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3205 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3206 // if the panel is running at 30 hz, at the worst case, our expected time just
3207 // misses vsync and we have to wait another 33.3ms
3208 ASSERT_LE(presentFence->getSignalTime(),
3209 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3210 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003211 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003212 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003213 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3214 }
3215
Marissa Wall80d94ad2019-01-18 16:04:36 -08003216 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003217 << "wrong number of surfaces";
3218
Marissa Wall80d94ad2019-01-18 16:04:36 -08003219 for (const auto& stats : surfaceControlStats) {
3220 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3221
Marissa Wallfda30bb2018-10-12 11:34:28 -07003222 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3223 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3224 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003225 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003226 }
3227 }
3228
3229private:
3230 class ExpectedSurfaceResult {
3231 public:
3232 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3233 ExpectedResult::PreviousBuffer previousBufferResult)
3234 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3235
Marissa Wall80d94ad2019-01-18 16:04:36 -08003236 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3237 nsecs_t latchTime) const {
3238 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003239
3240 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3241 << "bad acquire time";
3242 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003243
3244 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3245 ASSERT_NE(previousReleaseFence, nullptr)
3246 << "failed to set release prev buffer fence";
3247 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3248 ASSERT_EQ(previousReleaseFence, nullptr)
3249 << "should not have set released prev buffer fence";
3250 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003251 }
3252
3253 private:
3254 ExpectedResult::Buffer mBufferResult;
3255 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3256 };
3257
Marissa Wall80d94ad2019-01-18 16:04:36 -08003258 struct SCHash {
3259 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3260 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003261 }
3262 };
3263 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003264 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003265 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003266};
3267
3268class CallbackHelper {
3269public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003270 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3271 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003272 if (!callbackContext) {
3273 ALOGE("failed to get callback context");
3274 }
3275 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3276 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003277 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003278 helper->mConditionVariable.notify_all();
3279 }
3280
Marissa Wall80d94ad2019-01-18 16:04:36 -08003281 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003282 std::unique_lock lock(mMutex);
3283
Marissa Wall80d94ad2019-01-18 16:04:36 -08003284 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003285 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3286 std::cv_status::timeout)
3287 << "did not receive callback";
3288 }
3289
Marissa Wall80d94ad2019-01-18 16:04:36 -08003290 *outData = std::move(mCallbackDataQueue.front());
3291 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003292 }
3293
3294 void verifyFinalState() {
3295 // Wait to see if there are extra callbacks
3296 std::this_thread::sleep_for(500ms);
3297
3298 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003299 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3300 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003301 }
3302
3303 void* getContext() { return static_cast<void*>(this); }
3304
3305 std::mutex mMutex;
3306 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003307 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003308};
3309
3310class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003311public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003312 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003313 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003314 }
3315
Marissa Wall713b63f2018-10-17 15:42:43 -07003316 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003317 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3318 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003319 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003320 sp<GraphicBuffer> buffer;
3321 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003322 if (setBuffer) {
3323 int err = getBuffer(&buffer, &fence);
3324 if (err != NO_ERROR) {
3325 return err;
3326 }
3327
3328 transaction.setBuffer(layer, buffer);
3329 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003330 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003331
Valerie Hauaa194562019-02-05 16:21:38 -08003332 if (setBackgroundColor) {
3333 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3334 ui::Dataspace::UNKNOWN);
3335 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003336 }
3337
3338 transaction.addTransactionCompletedCallback(callbackHelper->function,
3339 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003340 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003341 }
3342
Marissa Wall861616d2018-10-22 12:52:23 -07003343 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3344 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003345 CallbackData callbackData;
3346 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3347 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003348
3349 if (finalState) {
3350 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3351 }
3352 }
3353
Marissa Wall861616d2018-10-22 12:52:23 -07003354 static void waitForCallbacks(CallbackHelper& helper,
3355 const std::vector<ExpectedResult>& expectedResults,
3356 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003357 for (const auto& expectedResult : expectedResults) {
3358 waitForCallback(helper, expectedResult);
3359 }
3360 if (finalState) {
3361 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3362 }
3363 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003364};
3365
Valerie Hauaa194562019-02-05 16:21:38 -08003366TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003367 sp<SurfaceControl> layer;
3368 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3369
3370 Transaction transaction;
3371 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003372 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003373 if (err) {
3374 GTEST_SUCCEED() << "test not supported";
3375 return;
3376 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003377
3378 transaction.apply();
3379
3380 ExpectedResult expected;
3381 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3382 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3383}
3384
Valerie Hauaa194562019-02-05 16:21:38 -08003385TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003386 sp<SurfaceControl> layer;
3387 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3388
3389 Transaction transaction;
3390 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003391 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003392 if (err) {
3393 GTEST_SUCCEED() << "test not supported";
3394 return;
3395 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003396
Marissa Wall861616d2018-10-22 12:52:23 -07003397 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003398
3399 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003400 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3401 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003402 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3403}
3404
Valerie Hauaa194562019-02-05 16:21:38 -08003405TEST_F(LayerCallbackTest, BufferNoColor) {
3406 sp<SurfaceControl> layer;
3407 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3408
3409 Transaction transaction;
3410 CallbackHelper callback;
3411 int err = fillTransaction(transaction, &callback, layer, true, false);
3412 if (err) {
3413 GTEST_SUCCEED() << "test not supported";
3414 return;
3415 }
3416
3417 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3418
3419 ExpectedResult expected;
3420 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3421 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3422}
3423
3424TEST_F(LayerCallbackTest, NoBufferColor) {
3425 sp<SurfaceControl> layer;
3426 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3427
3428 Transaction transaction;
3429 CallbackHelper callback;
3430 int err = fillTransaction(transaction, &callback, layer, false, true);
3431 if (err) {
3432 GTEST_SUCCEED() << "test not supported";
3433 return;
3434 }
3435
3436 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3437
3438 ExpectedResult expected;
3439 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3440 ExpectedResult::Buffer::NOT_ACQUIRED);
3441 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3442}
3443
Marissa Wallfda30bb2018-10-12 11:34:28 -07003444TEST_F(LayerCallbackTest, NoStateChange) {
3445 Transaction transaction;
3446 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003447 int err = fillTransaction(transaction, &callback);
3448 if (err) {
3449 GTEST_SUCCEED() << "test not supported";
3450 return;
3451 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003452
3453 transaction.apply();
3454
3455 ExpectedResult expected;
3456 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3457}
3458
3459TEST_F(LayerCallbackTest, OffScreen) {
3460 sp<SurfaceControl> layer;
3461 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3462
3463 Transaction transaction;
3464 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003465 int err = fillTransaction(transaction, &callback, layer);
3466 if (err) {
3467 GTEST_SUCCEED() << "test not supported";
3468 return;
3469 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003470
Marissa Wall861616d2018-10-22 12:52:23 -07003471 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003472
3473 ExpectedResult expected;
3474 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3475 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3476}
3477
Valerie Hauaa194562019-02-05 16:21:38 -08003478TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003479 sp<SurfaceControl> layer1, layer2;
3480 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3481 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3482
3483 Transaction transaction1, transaction2;
3484 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003485 int err = fillTransaction(transaction1, &callback1, layer1);
3486 if (err) {
3487 GTEST_SUCCEED() << "test not supported";
3488 return;
3489 }
3490 err = fillTransaction(transaction2, &callback2, layer2);
3491 if (err) {
3492 GTEST_SUCCEED() << "test not supported";
3493 return;
3494 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003495
Marissa Wall861616d2018-10-22 12:52:23 -07003496 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3497 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003498
3499 ExpectedResult expected;
3500 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3501 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3502 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3503}
3504
Valerie Hauaa194562019-02-05 16:21:38 -08003505TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3506 sp<SurfaceControl> layer1, layer2;
3507 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3508 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3509
3510 Transaction transaction1, transaction2;
3511 CallbackHelper callback1, callback2;
3512 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3513 if (err) {
3514 GTEST_SUCCEED() << "test not supported";
3515 return;
3516 }
3517 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3518 if (err) {
3519 GTEST_SUCCEED() << "test not supported";
3520 return;
3521 }
3522
3523 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3524 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3525
3526 ExpectedResult expected;
3527 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3528 ExpectedResult::Buffer::NOT_ACQUIRED);
3529 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3530 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3531}
3532
3533TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3534 sp<SurfaceControl> layer1, layer2;
3535 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3536 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3537
3538 Transaction transaction1, transaction2;
3539 CallbackHelper callback1, callback2;
3540 int err = fillTransaction(transaction1, &callback1, layer1);
3541 if (err) {
3542 GTEST_SUCCEED() << "test not supported";
3543 return;
3544 }
3545 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3546 if (err) {
3547 GTEST_SUCCEED() << "test not supported";
3548 return;
3549 }
3550
3551 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3552 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3553
3554 ExpectedResult expected;
3555 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3556 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3557 ExpectedResult::Buffer::NOT_ACQUIRED);
3558 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3559 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3560}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003561TEST_F(LayerCallbackTest, Merge_SameCallback) {
3562 sp<SurfaceControl> layer1, layer2;
3563 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3564 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3565
3566 Transaction transaction1, transaction2;
3567 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003568 int err = fillTransaction(transaction1, &callback, layer1);
3569 if (err) {
3570 GTEST_SUCCEED() << "test not supported";
3571 return;
3572 }
3573 err = fillTransaction(transaction2, &callback, layer2);
3574 if (err) {
3575 GTEST_SUCCEED() << "test not supported";
3576 return;
3577 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003578
3579 transaction2.merge(std::move(transaction1)).apply();
3580
3581 ExpectedResult expected;
3582 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3583 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3584 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3585}
3586
3587TEST_F(LayerCallbackTest, Merge_SameLayer) {
3588 sp<SurfaceControl> layer;
3589 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3590
3591 Transaction transaction1, transaction2;
3592 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003593 int err = fillTransaction(transaction1, &callback1, layer);
3594 if (err) {
3595 GTEST_SUCCEED() << "test not supported";
3596 return;
3597 }
3598 err = fillTransaction(transaction2, &callback2, layer);
3599 if (err) {
3600 GTEST_SUCCEED() << "test not supported";
3601 return;
3602 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003603
3604 transaction2.merge(std::move(transaction1)).apply();
3605
3606 ExpectedResult expected;
3607 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3608 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3609 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3610}
3611
Marissa Wallfda30bb2018-10-12 11:34:28 -07003612TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3613 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3614 client2(new SurfaceComposerClient);
3615
3616 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3617 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3618
3619 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003620 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003621 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003622 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003623 ISurfaceComposerClient::eFXSurfaceBufferState));
3624
3625 Transaction transaction1, transaction2;
3626 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003627 int err = fillTransaction(transaction1, &callback1, layer1);
3628 if (err) {
3629 GTEST_SUCCEED() << "test not supported";
3630 return;
3631 }
3632 err = fillTransaction(transaction2, &callback2, layer2);
3633 if (err) {
3634 GTEST_SUCCEED() << "test not supported";
3635 return;
3636 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003637
Marissa Wall861616d2018-10-22 12:52:23 -07003638 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3639 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003640
3641 ExpectedResult expected;
3642 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3643 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3644 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3645}
3646
3647TEST_F(LayerCallbackTest, MultipleTransactions) {
3648 sp<SurfaceControl> layer;
3649 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3650
3651 Transaction transaction;
3652 CallbackHelper callback;
3653 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003654 int err = fillTransaction(transaction, &callback, layer);
3655 if (err) {
3656 GTEST_SUCCEED() << "test not supported";
3657 return;
3658 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003659
3660 transaction.apply();
3661
3662 ExpectedResult expected;
3663 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003664 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003665 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3666 : ExpectedResult::PreviousBuffer::RELEASED);
3667 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3668 }
3669 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3670}
3671
3672TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3673 sp<SurfaceControl> layer;
3674 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3675
3676 Transaction transaction;
3677 CallbackHelper callback;
3678 for (size_t i = 0; i < 10; i++) {
3679 ExpectedResult expected;
3680
3681 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003682 int err = fillTransaction(transaction, &callback, layer);
3683 if (err) {
3684 GTEST_SUCCEED() << "test not supported";
3685 return;
3686 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003687 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3688 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003689 int err = fillTransaction(transaction, &callback);
3690 if (err) {
3691 GTEST_SUCCEED() << "test not supported";
3692 return;
3693 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003694 }
3695
3696 transaction.apply();
3697
3698 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3699 }
3700 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3701}
3702
3703TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3704 sp<SurfaceControl> layer;
3705 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3706
3707 Transaction transaction;
3708 CallbackHelper callback;
3709 for (size_t i = 0; i < 10; i++) {
3710 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003711 int err = fillTransaction(transaction, &callback, layer);
3712 if (err) {
3713 GTEST_SUCCEED() << "test not supported";
3714 return;
3715 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003716 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003717 int err = fillTransaction(transaction, &callback);
3718 if (err) {
3719 GTEST_SUCCEED() << "test not supported";
3720 return;
3721 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003722 }
3723
Marissa Wall861616d2018-10-22 12:52:23 -07003724 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003725
3726 ExpectedResult expected;
3727 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3728 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003729 layer,
3730 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3731 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003732 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3733 }
3734 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3735}
3736
3737TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3738 sp<SurfaceControl> layer1, layer2;
3739 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3740 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3741
3742 Transaction transaction1, transaction2;
3743 CallbackHelper callback1, callback2;
3744 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003745 int err = fillTransaction(transaction1, &callback1, layer1);
3746 if (err) {
3747 GTEST_SUCCEED() << "test not supported";
3748 return;
3749 }
3750 err = fillTransaction(transaction2, &callback2, layer2);
3751 if (err) {
3752 GTEST_SUCCEED() << "test not supported";
3753 return;
3754 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003755
Marissa Wall861616d2018-10-22 12:52:23 -07003756 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3757 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003758
3759 ExpectedResult expected;
3760 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003761 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003762 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3763 : ExpectedResult::PreviousBuffer::RELEASED);
3764 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3765 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3766 }
3767 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3768 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3769}
3770
3771TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3772 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3773 client2(new SurfaceComposerClient);
3774 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3775 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3776
3777 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003778 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003779 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003780 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003781 ISurfaceComposerClient::eFXSurfaceBufferState));
3782
3783 Transaction transaction1, transaction2;
3784 CallbackHelper callback1, callback2;
3785 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003786 int err = fillTransaction(transaction1, &callback1, layer1);
3787 if (err) {
3788 GTEST_SUCCEED() << "test not supported";
3789 return;
3790 }
3791 err = fillTransaction(transaction2, &callback2, layer2);
3792 if (err) {
3793 GTEST_SUCCEED() << "test not supported";
3794 return;
3795 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003796
Marissa Wall861616d2018-10-22 12:52:23 -07003797 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3798 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003799
3800 ExpectedResult expected;
3801 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003802 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003803 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3804 : ExpectedResult::PreviousBuffer::RELEASED);
3805 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3806 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3807 }
3808 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3809 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3810}
3811
3812TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3813 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3814 client2(new SurfaceComposerClient);
3815 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3816 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3817
3818 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003819 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003820 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003821 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003822 ISurfaceComposerClient::eFXSurfaceBufferState));
3823
3824 Transaction transaction1, transaction2;
3825 CallbackHelper callback1, callback2;
3826
3827 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003828 int err = fillTransaction(transaction1, &callback1, layer1);
3829 if (err) {
3830 GTEST_SUCCEED() << "test not supported";
3831 return;
3832 }
3833 err = fillTransaction(transaction2, &callback2, layer2);
3834 if (err) {
3835 GTEST_SUCCEED() << "test not supported";
3836 return;
3837 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003838
Marissa Wall861616d2018-10-22 12:52:23 -07003839 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3840 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003841
3842 ExpectedResult expected;
3843 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3844 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3845 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3846 expected.reset();
3847
3848 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003849 err = fillTransaction(transaction1, &callback1);
3850 if (err) {
3851 GTEST_SUCCEED() << "test not supported";
3852 return;
3853 }
3854 err = fillTransaction(transaction2, &callback2);
3855 if (err) {
3856 GTEST_SUCCEED() << "test not supported";
3857 return;
3858 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003859
3860 transaction2.merge(std::move(transaction1)).apply();
3861
3862 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3863 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3864}
3865
3866TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3867 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3868 client2(new SurfaceComposerClient);
3869
3870 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3871 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3872
3873 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003874 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003875 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003876 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003877 ISurfaceComposerClient::eFXSurfaceBufferState));
3878
3879 Transaction transaction1, transaction2;
3880 CallbackHelper callback1, callback2;
3881
3882 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003883 int err = fillTransaction(transaction1, &callback1, layer1);
3884 if (err) {
3885 GTEST_SUCCEED() << "test not supported";
3886 return;
3887 }
3888 err = fillTransaction(transaction2, &callback2, layer2);
3889 if (err) {
3890 GTEST_SUCCEED() << "test not supported";
3891 return;
3892 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003893
Marissa Wall861616d2018-10-22 12:52:23 -07003894 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3895 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003896
3897 ExpectedResult expected;
3898 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3899 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3900 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3901 expected.reset();
3902
3903 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003904 err = fillTransaction(transaction1, &callback1);
3905 if (err) {
3906 GTEST_SUCCEED() << "test not supported";
3907 return;
3908 }
3909 err = fillTransaction(transaction2, &callback2);
3910 if (err) {
3911 GTEST_SUCCEED() << "test not supported";
3912 return;
3913 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003914
Marissa Wall861616d2018-10-22 12:52:23 -07003915 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003916
Marissa Wall713b63f2018-10-17 15:42:43 -07003917 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3918 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003919 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3920 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3921}
3922
3923TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3924 sp<SurfaceControl> layer;
3925 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3926
3927 Transaction transaction;
3928 CallbackHelper callback;
3929 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003930 for (auto& expected : expectedResults) {
3931 expected.reset();
3932 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003933 ExpectedResult::Buffer::ACQUIRED,
3934 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003935
Marissa Wall713b63f2018-10-17 15:42:43 -07003936 int err = fillTransaction(transaction, &callback, layer);
3937 if (err) {
3938 GTEST_SUCCEED() << "test not supported";
3939 return;
3940 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003941
3942 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003943 }
3944 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3945}
3946
3947TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3948 sp<SurfaceControl> layer;
3949 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3950
Marissa Wall713b63f2018-10-17 15:42:43 -07003951 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003952 Transaction transaction;
3953 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003954 int err = fillTransaction(transaction, &callback, layer);
3955 if (err) {
3956 GTEST_SUCCEED() << "test not supported";
3957 return;
3958 }
3959
3960 transaction.apply();
3961
3962 ExpectedResult expected;
3963 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3964 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3965
3966 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003967 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003968 for (auto& expected : expectedResults) {
3969 expected.reset();
3970
Marissa Wall713b63f2018-10-17 15:42:43 -07003971 err = fillTransaction(transaction, &callback);
3972 if (err) {
3973 GTEST_SUCCEED() << "test not supported";
3974 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003975 }
3976
3977 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003978 }
3979 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3980}
3981
3982TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3983 sp<SurfaceControl> layer;
3984 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3985
3986 // Normal call to set up test
3987 Transaction transaction;
3988 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003989 int err = fillTransaction(transaction, &callback, layer);
3990 if (err) {
3991 GTEST_SUCCEED() << "test not supported";
3992 return;
3993 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003994
Marissa Wall861616d2018-10-22 12:52:23 -07003995 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003996
3997 ExpectedResult expectedResult;
3998 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3999 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
4000
4001 // Test
4002 std::vector<ExpectedResult> expectedResults(50);
4003 for (auto& expected : expectedResults) {
4004 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07004005 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
4006 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07004007
Marissa Wall713b63f2018-10-17 15:42:43 -07004008 err = fillTransaction(transaction, &callback);
4009 if (err) {
4010 GTEST_SUCCEED() << "test not supported";
4011 return;
4012 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07004013
Marissa Wall861616d2018-10-22 12:52:23 -07004014 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07004015 }
4016 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
4017}
4018
Marissa Wall17b4e452018-12-26 16:32:34 -08004019TEST_F(LayerCallbackTest, DesiredPresentTime) {
4020 sp<SurfaceControl> layer;
4021 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4022
4023 Transaction transaction;
4024 CallbackHelper callback;
4025 int err = fillTransaction(transaction, &callback, layer);
4026 if (err) {
4027 GTEST_SUCCEED() << "test not supported";
4028 return;
4029 }
4030
4031 // Try to present 100ms in the future
4032 nsecs_t time = systemTime() + (100 * 1e6);
4033
4034 transaction.setDesiredPresentTime(time);
4035 transaction.apply();
4036
4037 ExpectedResult expected;
4038 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4039 expected.addExpectedPresentTime(time);
4040 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4041}
4042
4043TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
4044 sp<SurfaceControl> layer;
4045 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4046
4047 Transaction transaction;
4048 CallbackHelper callback1;
4049 int err = fillTransaction(transaction, &callback1, layer);
4050 if (err) {
4051 GTEST_SUCCEED() << "test not supported";
4052 return;
4053 }
4054
4055 // Try to present 100ms in the future
4056 nsecs_t time = systemTime() + (100 * 1e6);
4057
4058 transaction.setDesiredPresentTime(time);
4059 transaction.apply();
4060
4061 ExpectedResult expected1;
4062 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4063 expected1.addExpectedPresentTime(time);
4064
4065 CallbackHelper callback2;
4066 err = fillTransaction(transaction, &callback2, layer);
4067 if (err) {
4068 GTEST_SUCCEED() << "test not supported";
4069 return;
4070 }
4071
4072 // Try to present 33ms after the first frame
4073 time += (33.3 * 1e6);
4074
4075 transaction.setDesiredPresentTime(time);
4076 transaction.apply();
4077
4078 ExpectedResult expected2;
4079 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4080 ExpectedResult::Buffer::ACQUIRED,
4081 ExpectedResult::PreviousBuffer::RELEASED);
4082 expected2.addExpectedPresentTime(time);
4083
4084 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4085 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4086}
4087
4088TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
4089 sp<SurfaceControl> layer;
4090 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4091
4092 Transaction transaction;
4093 CallbackHelper callback1;
4094 int err = fillTransaction(transaction, &callback1, layer);
4095 if (err) {
4096 GTEST_SUCCEED() << "test not supported";
4097 return;
4098 }
4099
4100 // Try to present 100ms in the future
4101 nsecs_t time = systemTime() + (100 * 1e6);
4102
4103 transaction.setDesiredPresentTime(time);
4104 transaction.apply();
4105
4106 ExpectedResult expected1;
4107 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4108 expected1.addExpectedPresentTime(time);
4109
4110 CallbackHelper callback2;
4111 err = fillTransaction(transaction, &callback2, layer);
4112 if (err) {
4113 GTEST_SUCCEED() << "test not supported";
4114 return;
4115 }
4116
4117 // Try to present 33ms before the previous frame
4118 time -= (33.3 * 1e6);
4119
4120 transaction.setDesiredPresentTime(time);
4121 transaction.apply();
4122
4123 ExpectedResult expected2;
4124 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4125 ExpectedResult::Buffer::ACQUIRED,
4126 ExpectedResult::PreviousBuffer::RELEASED);
4127
4128 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4129 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4130}
4131
4132TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4133 sp<SurfaceControl> layer;
4134 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4135
4136 Transaction transaction;
4137 CallbackHelper callback;
4138 int err = fillTransaction(transaction, &callback, layer);
4139 if (err) {
4140 GTEST_SUCCEED() << "test not supported";
4141 return;
4142 }
4143
4144 // Try to present 100ms in the past
4145 nsecs_t time = systemTime() - (100 * 1e6);
4146
4147 transaction.setDesiredPresentTime(time);
4148 transaction.apply();
4149
4150 ExpectedResult expected;
4151 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4152 expected.addExpectedPresentTime(systemTime());
4153 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4154}
4155
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004156class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004157protected:
4158 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004159 LayerTransactionTest::SetUp();
4160 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004161
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004162 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4163 ASSERT_FALSE(display == nullptr);
4164
Mathias Agopianc666cae2012-07-25 18:56:13 -07004165 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004166 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004167
4168 ssize_t displayWidth = info.w;
4169 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004170
4171 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004172 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4173 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004174 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004175 ASSERT_TRUE(mBGSurfaceControl->isValid());
4176 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4177
4178 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004179 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4180
Peiyong Lin566a3b42018-01-09 18:22:43 -08004181 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004182 ASSERT_TRUE(mFGSurfaceControl->isValid());
4183
4184 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4185
4186 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004187 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004188 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004189 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4190
4191 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4192
Robert Carr4cdc58f2017-08-23 14:22:20 -07004193 asTransaction([&](Transaction& t) {
4194 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004195
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004196 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004197
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004198 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4199 .setPosition(mFGSurfaceControl, 64, 64)
4200 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004201
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004202 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4203 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4204 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004205 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004206 }
4207
4208 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004209 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004210 mBGSurfaceControl = 0;
4211 mFGSurfaceControl = 0;
4212 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004213 }
4214
4215 void waitForPostedBuffers() {
4216 // Since the sync surface is in synchronous mode (i.e. double buffered)
4217 // posting three buffers to it should ensure that at least two
4218 // SurfaceFlinger::handlePageFlip calls have been made, which should
4219 // guaranteed that a buffer posted to another Surface has been retired.
4220 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4221 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4222 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4223 }
4224
Robert Carr4cdc58f2017-08-23 14:22:20 -07004225
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004226 sp<SurfaceControl> mBGSurfaceControl;
4227 sp<SurfaceControl> mFGSurfaceControl;
4228
4229 // This surface is used to ensure that the buffers posted to
4230 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4231 sp<SurfaceControl> mSyncSurfaceControl;
4232};
4233
Robert Carr7f619b22017-11-06 12:56:35 -08004234TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004235
chaviw0e3479f2018-09-10 16:49:30 -07004236 std::unique_ptr<ScreenCapture> sc;
4237
4238 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004239 fillSurfaceRGBA8(relative, 10, 10, 10);
4240 waitForPostedBuffers();
4241
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004242 Transaction{}
4243 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004244 .setPosition(relative, 64, 64)
4245 .apply();
4246
4247 {
4248 // The relative should be on top of the FG control.
4249 ScreenCapture::captureScreen(&sc);
4250 sc->checkPixel(64, 64, 10, 10, 10);
4251 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004252 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004253
4254 {
4255 // Nothing should change at this point.
4256 ScreenCapture::captureScreen(&sc);
4257 sc->checkPixel(64, 64, 10, 10, 10);
4258 }
4259
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004260 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004261
4262 {
4263 // Ensure that the relative was actually hidden, rather than
4264 // being left in the detached but visible state.
4265 ScreenCapture::captureScreen(&sc);
4266 sc->expectFGColor(64, 64);
4267 }
4268}
4269
Robert Carr8d5227b2017-03-16 15:41:03 -07004270class GeometryLatchingTest : public LayerUpdateTest {
4271protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004272 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004273 SCOPED_TRACE(trace);
4274 ScreenCapture::captureScreen(&sc);
4275 // We find the leading edge of the FG surface.
4276 sc->expectFGColor(127, 127);
4277 sc->expectBGColor(128, 128);
4278 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004279
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004280 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004281
4282 void unlockFGBuffer() {
4283 sp<Surface> s = mFGSurfaceControl->getSurface();
4284 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4285 waitForPostedBuffers();
4286 }
4287
Robert Carr8d5227b2017-03-16 15:41:03 -07004288 void completeFGResize() {
4289 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4290 waitForPostedBuffers();
4291 }
4292 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004293 asTransaction([&](Transaction& t) {
4294 t.setSize(mFGSurfaceControl, 64, 64);
4295 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004296 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004297 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004298
4299 EXPECT_INITIAL_STATE("After restoring initial state");
4300 }
chaviw0e3479f2018-09-10 16:49:30 -07004301 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004302};
4303
Robert Carr8d5227b2017-03-16 15:41:03 -07004304class CropLatchingTest : public GeometryLatchingTest {
4305protected:
4306 void EXPECT_CROPPED_STATE(const char* trace) {
4307 SCOPED_TRACE(trace);
4308 ScreenCapture::captureScreen(&sc);
4309 // The edge should be moved back one pixel by our crop.
4310 sc->expectFGColor(126, 126);
4311 sc->expectBGColor(127, 127);
4312 sc->expectBGColor(128, 128);
4313 }
chaviw59f5c562017-06-28 16:39:06 -07004314
4315 void EXPECT_RESIZE_STATE(const char* trace) {
4316 SCOPED_TRACE(trace);
4317 ScreenCapture::captureScreen(&sc);
4318 // The FG is now resized too 128,128 at 64,64
4319 sc->expectFGColor(64, 64);
4320 sc->expectFGColor(191, 191);
4321 sc->expectBGColor(192, 192);
4322 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004323};
4324
Pablo Ceballos05289c22016-04-14 15:49:55 -07004325TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004326 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004327 {
4328 SCOPED_TRACE("before anything");
4329 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004330 sc->expectBGColor(32, 32);
4331 sc->expectFGColor(96, 96);
4332 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004333 }
4334
4335 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004336 asTransaction([&](Transaction& t) {
4337 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004338 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4339 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004340 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004341
Robert Carr4cdc58f2017-08-23 14:22:20 -07004342 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004343 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004344 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4345 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004346 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004347
4348 {
4349 SCOPED_TRACE("before any trigger");
4350 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004351 sc->expectBGColor(32, 32);
4352 sc->expectFGColor(96, 96);
4353 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004354 }
4355
4356 // should trigger the first deferred transaction, but not the second one
4357 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4358 {
4359 SCOPED_TRACE("after first trigger");
4360 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004361 sc->expectBGColor(32, 32);
4362 sc->checkPixel(96, 96, 162, 63, 96);
4363 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004364 }
4365
4366 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004367 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004368
4369 // trigger the second deferred transaction
4370 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4371 {
4372 SCOPED_TRACE("after second trigger");
4373 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004374 sc->expectBGColor(32, 32);
4375 sc->expectBGColor(96, 96);
4376 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004377 }
4378}
4379
Robert Carre392b552017-09-19 12:16:05 -07004380TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004381 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004382
4383 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004384 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4385 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4386 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4387 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004388 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004389 SurfaceComposerClient::Transaction{}
4390 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4391 .show(childNoBuffer)
4392 .show(childBuffer)
4393 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004394 {
4395 ScreenCapture::captureScreen(&sc);
4396 sc->expectChildColor(73, 73);
4397 sc->expectFGColor(74, 74);
4398 }
Vishnu Nair60356342018-11-13 13:00:45 -08004399 SurfaceComposerClient::Transaction{}
4400 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4401 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004402 {
4403 ScreenCapture::captureScreen(&sc);
4404 sc->expectChildColor(73, 73);
4405 sc->expectChildColor(74, 74);
4406 }
4407}
4408
Robert Carr2c5f6d22017-09-26 12:30:35 -07004409TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004410 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004411 {
4412 SCOPED_TRACE("before move");
4413 ScreenCapture::captureScreen(&sc);
4414 sc->expectBGColor(0, 12);
4415 sc->expectFGColor(75, 75);
4416 sc->expectBGColor(145, 145);
4417 }
4418
4419 Transaction t1, t2;
4420 t1.setPosition(mFGSurfaceControl, 128, 128);
4421 t2.setPosition(mFGSurfaceControl, 0, 0);
4422 // We expect that the position update from t2 now
4423 // overwrites the position update from t1.
4424 t1.merge(std::move(t2));
4425 t1.apply();
4426
4427 {
4428 ScreenCapture::captureScreen(&sc);
4429 sc->expectFGColor(1, 1);
4430 }
4431}
4432
Vishnu Nair996bc422019-07-16 14:15:33 -07004433TEST_F(LayerUpdateTest, MergingTransactionFlags) {
4434 Transaction().hide(mFGSurfaceControl).apply();
4435 std::unique_ptr<ScreenCapture> sc;
4436 {
4437 SCOPED_TRACE("before merge");
4438 ScreenCapture::captureScreen(&sc);
4439 sc->expectBGColor(0, 12);
4440 sc->expectBGColor(75, 75);
4441 sc->expectBGColor(145, 145);
4442 }
4443
4444 Transaction t1, t2;
4445 t1.show(mFGSurfaceControl);
4446 t2.setFlags(mFGSurfaceControl, 0 /* flags */, layer_state_t::eLayerSecure /* mask */);
4447 t1.merge(std::move(t2));
4448 t1.apply();
4449
4450 {
4451 SCOPED_TRACE("after merge");
4452 ScreenCapture::captureScreen(&sc);
4453 sc->expectFGColor(75, 75);
4454 }
4455}
4456
Robert Carr1f0a16a2016-10-24 16:27:39 -07004457class ChildLayerTest : public LayerUpdateTest {
4458protected:
4459 void SetUp() override {
4460 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004461 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004462 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004463 fillSurfaceRGBA8(mChild, 200, 200, 200);
4464
4465 {
4466 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004467 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004468 mCapture->expectChildColor(64, 64);
4469 }
4470 }
4471 void TearDown() override {
4472 LayerUpdateTest::TearDown();
4473 mChild = 0;
4474 }
4475
4476 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004477 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004478};
4479
4480TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004481 asTransaction([&](Transaction& t) {
4482 t.show(mChild);
4483 t.setPosition(mChild, 10, 10);
4484 t.setPosition(mFGSurfaceControl, 64, 64);
4485 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004486
4487 {
chaviw0e3479f2018-09-10 16:49:30 -07004488 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004489 // Top left of foreground must now be visible
4490 mCapture->expectFGColor(64, 64);
4491 // But 10 pixels in we should see the child surface
4492 mCapture->expectChildColor(74, 74);
4493 // And 10 more pixels we should be back to the foreground surface
4494 mCapture->expectFGColor(84, 84);
4495 }
4496
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004497 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004498
4499 {
chaviw0e3479f2018-09-10 16:49:30 -07004500 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004501 // Top left of foreground should now be at 0, 0
4502 mCapture->expectFGColor(0, 0);
4503 // But 10 pixels in we should see the child surface
4504 mCapture->expectChildColor(10, 10);
4505 // And 10 more pixels we should be back to the foreground surface
4506 mCapture->expectFGColor(20, 20);
4507 }
4508}
4509
Robert Carr41b08b52017-06-01 16:11:34 -07004510TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004511 asTransaction([&](Transaction& t) {
4512 t.show(mChild);
4513 t.setPosition(mChild, 0, 0);
4514 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004515 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004516 });
Robert Carr41b08b52017-06-01 16:11:34 -07004517
4518 {
chaviw0e3479f2018-09-10 16:49:30 -07004519 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004520 mCapture->expectChildColor(0, 0);
4521 mCapture->expectChildColor(4, 4);
4522 mCapture->expectBGColor(5, 5);
4523 }
4524}
4525
Robert Carr1f0a16a2016-10-24 16:27:39 -07004526TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004527 asTransaction([&](Transaction& t) {
4528 t.show(mChild);
4529 t.setPosition(mFGSurfaceControl, 0, 0);
4530 t.setPosition(mChild, 63, 63);
4531 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004532
4533 {
chaviw0e3479f2018-09-10 16:49:30 -07004534 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004535 mCapture->expectFGColor(0, 0);
4536 // Last pixel in foreground should now be the child.
4537 mCapture->expectChildColor(63, 63);
4538 // But the child should be constrained and the next pixel
4539 // must be the background
4540 mCapture->expectBGColor(64, 64);
4541 }
4542}
4543
4544TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004545 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004546
4547 // Find the boundary between the parent and child
4548 {
chaviw0e3479f2018-09-10 16:49:30 -07004549 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004550 mCapture->expectChildColor(9, 9);
4551 mCapture->expectFGColor(10, 10);
4552 }
4553
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004554 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004555
4556 // The boundary should be twice as far from the origin now.
4557 // The pixels from the last test should all be child now
4558 {
chaviw0e3479f2018-09-10 16:49:30 -07004559 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004560 mCapture->expectChildColor(9, 9);
4561 mCapture->expectChildColor(10, 10);
4562 mCapture->expectChildColor(19, 19);
4563 mCapture->expectFGColor(20, 20);
4564 }
4565}
Robert Carr9524cb32017-02-13 11:32:32 -08004566
Vishnu Nairc652ff82019-03-15 12:48:54 -07004567// A child with a scale transform should be cropped by its parent bounds.
4568TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4569 asTransaction([&](Transaction& t) {
4570 t.setPosition(mFGSurfaceControl, 0, 0);
4571 t.setPosition(mChild, 0, 0);
4572 });
4573
4574 // Find the boundary between the parent and child.
4575 {
4576 mCapture = screenshot();
4577 mCapture->expectChildColor(0, 0);
4578 mCapture->expectChildColor(9, 9);
4579 mCapture->expectFGColor(10, 10);
4580 }
4581
4582 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4583
4584 // The child should fill its parent bounds and be cropped by it.
4585 {
4586 mCapture = screenshot();
4587 mCapture->expectChildColor(0, 0);
4588 mCapture->expectChildColor(63, 63);
4589 mCapture->expectBGColor(64, 64);
4590 }
4591}
4592
Robert Carr6452f122017-03-21 10:41:29 -07004593TEST_F(ChildLayerTest, ChildLayerAlpha) {
4594 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4595 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4596 fillSurfaceRGBA8(mChild, 0, 254, 0);
4597 waitForPostedBuffers();
4598
Robert Carr4cdc58f2017-08-23 14:22:20 -07004599 asTransaction([&](Transaction& t) {
4600 t.show(mChild);
4601 t.setPosition(mChild, 0, 0);
4602 t.setPosition(mFGSurfaceControl, 0, 0);
4603 });
Robert Carr6452f122017-03-21 10:41:29 -07004604
4605 {
chaviw0e3479f2018-09-10 16:49:30 -07004606 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004607 // Unblended child color
4608 mCapture->checkPixel(0, 0, 0, 254, 0);
4609 }
4610
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004611 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004612
4613 {
chaviw0e3479f2018-09-10 16:49:30 -07004614 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004615 // Child and BG blended.
4616 mCapture->checkPixel(0, 0, 127, 127, 0);
4617 }
4618
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004619 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004620
4621 {
chaviw0e3479f2018-09-10 16:49:30 -07004622 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004623 // Child and BG blended.
4624 mCapture->checkPixel(0, 0, 95, 64, 95);
4625 }
4626}
4627
Robert Carr9524cb32017-02-13 11:32:32 -08004628TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004629 asTransaction([&](Transaction& t) {
4630 t.show(mChild);
4631 t.setPosition(mChild, 10, 10);
4632 t.setPosition(mFGSurfaceControl, 64, 64);
4633 });
Robert Carr9524cb32017-02-13 11:32:32 -08004634
4635 {
chaviw0e3479f2018-09-10 16:49:30 -07004636 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004637 // Top left of foreground must now be visible
4638 mCapture->expectFGColor(64, 64);
4639 // But 10 pixels in we should see the child surface
4640 mCapture->expectChildColor(74, 74);
4641 // And 10 more pixels we should be back to the foreground surface
4642 mCapture->expectFGColor(84, 84);
4643 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004644
4645 asTransaction([&](Transaction& t) {
4646 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4647 });
4648
Robert Carr9524cb32017-02-13 11:32:32 -08004649 {
chaviw0e3479f2018-09-10 16:49:30 -07004650 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004651 mCapture->expectFGColor(64, 64);
4652 // In reparenting we should have exposed the entire foreground surface.
4653 mCapture->expectFGColor(74, 74);
4654 // And the child layer should now begin at 10, 10 (since the BG
4655 // layer is at (0, 0)).
4656 mCapture->expectBGColor(9, 9);
4657 mCapture->expectChildColor(10, 10);
4658 }
4659}
4660
Robert Carr2e102c92018-10-23 12:11:15 -07004661TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4662 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004663 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004664 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4665
4666 {
4667 SCOPED_TRACE("Grandchild visible");
4668 ScreenCapture::captureScreen(&mCapture);
4669 mCapture->checkPixel(64, 64, 111, 111, 111);
4670 }
4671
Robert Carr87246532019-02-04 15:20:26 -08004672 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004673
4674 {
4675 SCOPED_TRACE("After destroying child");
4676 ScreenCapture::captureScreen(&mCapture);
4677 mCapture->expectFGColor(64, 64);
4678 }
4679
4680 asTransaction([&](Transaction& t) {
4681 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4682 });
4683
4684 {
4685 SCOPED_TRACE("After reparenting grandchild");
4686 ScreenCapture::captureScreen(&mCapture);
4687 mCapture->checkPixel(64, 64, 111, 111, 111);
4688 }
4689}
4690
Vishnu Nair14d76922019-08-05 08:41:20 -07004691TEST_F(ChildLayerTest, ChildrenRelativeZSurvivesParentDestruction) {
4692 sp<SurfaceControl> mGrandChild =
4693 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
4694 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4695
4696 // draw grand child behind the foreground surface
4697 asTransaction([&](Transaction& t) {
4698 t.setRelativeLayer(mGrandChild, mFGSurfaceControl->getHandle(), -1);
4699 });
4700
4701 {
4702 SCOPED_TRACE("Child visible");
4703 ScreenCapture::captureScreen(&mCapture);
4704 mCapture->checkPixel(64, 64, 200, 200, 200);
4705 }
4706
4707 asTransaction([&](Transaction& t) {
4708 t.reparent(mChild, nullptr);
4709 t.reparentChildren(mChild, mFGSurfaceControl->getHandle());
4710 });
4711
4712 {
4713 SCOPED_TRACE("foreground visible reparenting grandchild");
4714 ScreenCapture::captureScreen(&mCapture);
4715 mCapture->checkPixel(64, 64, 195, 63, 63);
4716 }
4717}
4718
chaviw161410b02017-07-27 10:46:08 -07004719TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004720 asTransaction([&](Transaction& t) {
4721 t.show(mChild);
4722 t.setPosition(mChild, 10, 10);
4723 t.setPosition(mFGSurfaceControl, 64, 64);
4724 });
Robert Carr9524cb32017-02-13 11:32:32 -08004725
4726 {
chaviw0e3479f2018-09-10 16:49:30 -07004727 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004728 // Top left of foreground must now be visible
4729 mCapture->expectFGColor(64, 64);
4730 // But 10 pixels in we should see the child surface
4731 mCapture->expectChildColor(74, 74);
4732 // And 10 more pixels we should be back to the foreground surface
4733 mCapture->expectFGColor(84, 84);
4734 }
4735
chaviw0e3479f2018-09-10 16:49:30 -07004736
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004737 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004738
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004739 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004740
chaviw161410b02017-07-27 10:46:08 -07004741 // Since the child has the same client as the parent, it will not get
4742 // detached and will be hidden.
4743 {
chaviw0e3479f2018-09-10 16:49:30 -07004744 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004745 mCapture->expectFGColor(64, 64);
4746 mCapture->expectFGColor(74, 74);
4747 mCapture->expectFGColor(84, 84);
4748 }
4749}
4750
4751TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4752 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004753 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004754 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4755 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004756
chaviw161410b02017-07-27 10:46:08 -07004757 ASSERT_TRUE(mChildNewClient->isValid());
4758
4759 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4760
Robert Carr4cdc58f2017-08-23 14:22:20 -07004761 asTransaction([&](Transaction& t) {
4762 t.hide(mChild);
4763 t.show(mChildNewClient);
4764 t.setPosition(mChildNewClient, 10, 10);
4765 t.setPosition(mFGSurfaceControl, 64, 64);
4766 });
chaviw161410b02017-07-27 10:46:08 -07004767
4768 {
chaviw0e3479f2018-09-10 16:49:30 -07004769 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004770 // Top left of foreground must now be visible
4771 mCapture->expectFGColor(64, 64);
4772 // But 10 pixels in we should see the child surface
4773 mCapture->expectChildColor(74, 74);
4774 // And 10 more pixels we should be back to the foreground surface
4775 mCapture->expectFGColor(84, 84);
4776 }
4777
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004778 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004779
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004780 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004781
Robert Carr9524cb32017-02-13 11:32:32 -08004782 // Nothing should have changed.
4783 {
chaviw0e3479f2018-09-10 16:49:30 -07004784 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004785 mCapture->expectFGColor(64, 64);
4786 mCapture->expectChildColor(74, 74);
4787 mCapture->expectFGColor(84, 84);
4788 }
4789}
4790
chaviw5aedec92018-10-22 10:40:38 -07004791TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4792 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4793 sp<SurfaceControl> childNewClient =
4794 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4795 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4796
4797 ASSERT_TRUE(childNewClient != nullptr);
4798 ASSERT_TRUE(childNewClient->isValid());
4799
4800 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4801
4802 Transaction()
4803 .hide(mChild)
4804 .show(childNewClient)
4805 .setPosition(childNewClient, 10, 10)
4806 .setPosition(mFGSurfaceControl, 64, 64)
4807 .apply();
4808
4809 {
4810 mCapture = screenshot();
4811 // Top left of foreground must now be visible
4812 mCapture->expectFGColor(64, 64);
4813 // But 10 pixels in we should see the child surface
4814 mCapture->expectChildColor(74, 74);
4815 // And 10 more pixels we should be back to the foreground surface
4816 mCapture->expectFGColor(84, 84);
4817 }
4818
4819 Transaction().detachChildren(mFGSurfaceControl).apply();
4820 Transaction().hide(childNewClient).apply();
4821
4822 // Nothing should have changed.
4823 {
4824 mCapture = screenshot();
4825 mCapture->expectFGColor(64, 64);
4826 mCapture->expectChildColor(74, 74);
4827 mCapture->expectFGColor(84, 84);
4828 }
4829
4830 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4831 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4832 32);
4833 Transaction()
4834 .setLayer(newParentSurface, INT32_MAX - 1)
4835 .show(newParentSurface)
4836 .setPosition(newParentSurface, 20, 20)
4837 .reparent(childNewClient, newParentSurface->getHandle())
4838 .apply();
4839 {
4840 mCapture = screenshot();
4841 // Child is now hidden.
4842 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4843 }
4844}
chaviw43cb3cb2019-05-31 15:23:41 -07004845TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
4846 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4847 sp<SurfaceControl> childNewClient =
4848 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4849 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4850
4851 ASSERT_TRUE(childNewClient != nullptr);
4852 ASSERT_TRUE(childNewClient->isValid());
4853
4854 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4855
4856 Transaction()
4857 .hide(mChild)
4858 .show(childNewClient)
4859 .setPosition(childNewClient, 10, 10)
4860 .setPosition(mFGSurfaceControl, 64, 64)
4861 .apply();
4862
4863 {
4864 mCapture = screenshot();
4865 Rect rect = Rect(74, 74, 84, 84);
4866 mCapture->expectBorder(rect, Color{195, 63, 63, 255});
4867 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4868 }
4869
4870 Transaction()
4871 .deferTransactionUntil_legacy(childNewClient, mFGSurfaceControl->getHandle(),
4872 mFGSurfaceControl->getSurface()->getNextFrameNumber())
4873 .apply();
4874 Transaction().detachChildren(mFGSurfaceControl).apply();
4875 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(mFGSurfaceControl, Color::RED, 32, 32));
4876
4877 // BufferLayer can still dequeue buffers even though there's a detached layer with a
4878 // deferred transaction.
4879 {
4880 SCOPED_TRACE("new buffer");
4881 mCapture = screenshot();
4882 Rect rect = Rect(74, 74, 84, 84);
4883 mCapture->expectBorder(rect, Color::RED);
4884 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4885 }
4886}
chaviw5aedec92018-10-22 10:40:38 -07004887
Robert Carr9b429f42017-04-17 14:56:57 -07004888TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004889 asTransaction([&](Transaction& t) {
4890 t.show(mChild);
4891 t.setPosition(mChild, 0, 0);
4892 t.setPosition(mFGSurfaceControl, 0, 0);
4893 });
Robert Carr9b429f42017-04-17 14:56:57 -07004894
4895 {
chaviw0e3479f2018-09-10 16:49:30 -07004896 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004897 // We've positioned the child in the top left.
4898 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004899 // But it's only 10x15.
4900 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004901 }
4902
Robert Carr4cdc58f2017-08-23 14:22:20 -07004903 asTransaction([&](Transaction& t) {
4904 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4905 // We cause scaling by 2.
4906 t.setSize(mFGSurfaceControl, 128, 128);
4907 });
Robert Carr9b429f42017-04-17 14:56:57 -07004908
4909 {
chaviw0e3479f2018-09-10 16:49:30 -07004910 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004911 // We've positioned the child in the top left.
4912 mCapture->expectChildColor(0, 0);
4913 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004914 mCapture->expectChildColor(19, 29);
4915 // And now it should be scaled all the way to 20x30
4916 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004917 }
4918}
4919
Robert Carr1725eee2017-04-26 18:32:15 -07004920// Regression test for b/37673612
4921TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004922 asTransaction([&](Transaction& t) {
4923 t.show(mChild);
4924 t.setPosition(mChild, 0, 0);
4925 t.setPosition(mFGSurfaceControl, 0, 0);
4926 });
Robert Carr1725eee2017-04-26 18:32:15 -07004927
4928 {
chaviw0e3479f2018-09-10 16:49:30 -07004929 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004930 // We've positioned the child in the top left.
4931 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004932 mCapture->expectChildColor(9, 14);
4933 // But it's only 10x15.
4934 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004935 }
Robert Carr1725eee2017-04-26 18:32:15 -07004936 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4937 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004938 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004939 sp<Surface> s = mFGSurfaceControl->getSurface();
4940 auto anw = static_cast<ANativeWindow*>(s.get());
4941 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4942 native_window_set_buffers_dimensions(anw, 64, 128);
4943 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4944 waitForPostedBuffers();
4945
4946 {
4947 // The child should still be in the same place and not have any strange scaling as in
4948 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004949 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004950 mCapture->expectChildColor(0, 0);
4951 mCapture->expectFGColor(10, 10);
4952 }
4953}
4954
Vishnu Nairc652ff82019-03-15 12:48:54 -07004955// A child with a buffer transform from its parents should be cropped by its parent bounds.
4956TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4957 asTransaction([&](Transaction& t) {
4958 t.show(mChild);
4959 t.setPosition(mChild, 0, 0);
4960 t.setPosition(mFGSurfaceControl, 0, 0);
4961 t.setSize(mChild, 100, 100);
4962 });
4963 fillSurfaceRGBA8(mChild, 200, 200, 200);
4964
4965 {
4966 mCapture = screenshot();
4967
4968 mCapture->expectChildColor(0, 0);
4969 mCapture->expectChildColor(63, 63);
4970 mCapture->expectBGColor(64, 64);
4971 }
4972
4973 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4974 sp<Surface> s = mFGSurfaceControl->getSurface();
4975 auto anw = static_cast<ANativeWindow*>(s.get());
4976 // Apply a 90 transform on the buffer.
4977 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4978 native_window_set_buffers_dimensions(anw, 64, 128);
4979 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4980 waitForPostedBuffers();
4981
4982 // The child should be cropped by the new parent bounds.
4983 {
4984 mCapture = screenshot();
4985 mCapture->expectChildColor(0, 0);
4986 mCapture->expectChildColor(99, 63);
4987 mCapture->expectFGColor(100, 63);
4988 mCapture->expectBGColor(128, 64);
4989 }
4990}
4991
4992// A child with a scale transform from its parents should be cropped by its parent bounds.
4993TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4994 asTransaction([&](Transaction& t) {
4995 t.show(mChild);
4996 t.setPosition(mChild, 0, 0);
4997 t.setPosition(mFGSurfaceControl, 0, 0);
4998 t.setSize(mChild, 200, 200);
4999 });
5000 fillSurfaceRGBA8(mChild, 200, 200, 200);
5001
5002 {
5003 mCapture = screenshot();
5004
5005 mCapture->expectChildColor(0, 0);
5006 mCapture->expectChildColor(63, 63);
5007 mCapture->expectBGColor(64, 64);
5008 }
5009
5010 asTransaction([&](Transaction& t) {
5011 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5012 // Set a scaling by 2.
5013 t.setSize(mFGSurfaceControl, 128, 128);
5014 });
5015
5016 // Child should inherit its parents scale but should be cropped by its parent bounds.
5017 {
5018 mCapture = screenshot();
5019 mCapture->expectChildColor(0, 0);
5020 mCapture->expectChildColor(127, 127);
5021 mCapture->expectBGColor(128, 128);
5022 }
5023}
5024
5025// Regression test for b/127368943
5026// Child should ignore the buffer transform but apply parent scale transform.
5027TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
5028 asTransaction([&](Transaction& t) {
5029 t.show(mChild);
5030 t.setPosition(mChild, 0, 0);
5031 t.setPosition(mFGSurfaceControl, 0, 0);
5032 });
5033
5034 {
5035 mCapture = screenshot();
5036 mCapture->expectChildColor(0, 0);
5037 mCapture->expectChildColor(9, 14);
5038 mCapture->expectFGColor(10, 15);
5039 }
5040
5041 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
5042 asTransaction([&](Transaction& t) {
5043 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
5044 t.setSize(mFGSurfaceControl, 128, 64);
5045 });
5046 sp<Surface> s = mFGSurfaceControl->getSurface();
5047 auto anw = static_cast<ANativeWindow*>(s.get());
5048 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
5049 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
5050 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
5051 native_window_set_buffers_dimensions(anw, 32, 64);
5052 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
5053 waitForPostedBuffers();
5054
5055 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
5056 {
5057 mCapture = screenshot();
5058 mCapture->expectChildColor(0, 0);
5059 mCapture->expectChildColor(19, 29);
5060 mCapture->expectFGColor(20, 30);
5061 }
5062}
5063
Dan Stoza412903f2017-04-27 13:42:17 -07005064TEST_F(ChildLayerTest, Bug36858924) {
5065 // Destroy the child layer
5066 mChild.clear();
5067
5068 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08005069 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
5070 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07005071
5072 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07005073 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005074 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
5075 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07005076 t.show(mChild);
5077 });
Dan Stoza412903f2017-04-27 13:42:17 -07005078
5079 // Render the foreground surface a few times
5080 //
5081 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
5082 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
5083 // never acquire/release the first buffer
5084 ALOGI("Filling 1");
5085 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5086 ALOGI("Filling 2");
5087 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
5088 ALOGI("Filling 3");
5089 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
5090 ALOGI("Filling 4");
5091 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
5092}
5093
chaviwf1961f72017-09-18 16:41:07 -07005094TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005095 asTransaction([&](Transaction& t) {
5096 t.show(mChild);
5097 t.setPosition(mChild, 10, 10);
5098 t.setPosition(mFGSurfaceControl, 64, 64);
5099 });
chaviw06178942017-07-27 10:25:59 -07005100
5101 {
chaviw0e3479f2018-09-10 16:49:30 -07005102 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005103 // Top left of foreground must now be visible
5104 mCapture->expectFGColor(64, 64);
5105 // But 10 pixels in we should see the child surface
5106 mCapture->expectChildColor(74, 74);
5107 // And 10 more pixels we should be back to the foreground surface
5108 mCapture->expectFGColor(84, 84);
5109 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07005110
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005111 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07005112
chaviw06178942017-07-27 10:25:59 -07005113 {
chaviw0e3479f2018-09-10 16:49:30 -07005114 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07005115 mCapture->expectFGColor(64, 64);
5116 // In reparenting we should have exposed the entire foreground surface.
5117 mCapture->expectFGColor(74, 74);
5118 // And the child layer should now begin at 10, 10 (since the BG
5119 // layer is at (0, 0)).
5120 mCapture->expectBGColor(9, 9);
5121 mCapture->expectChildColor(10, 10);
5122 }
5123}
5124
chaviwf1961f72017-09-18 16:41:07 -07005125TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005126 asTransaction([&](Transaction& t) {
5127 t.show(mChild);
5128 t.setPosition(mChild, 10, 10);
5129 t.setPosition(mFGSurfaceControl, 64, 64);
5130 });
chaviwf1961f72017-09-18 16:41:07 -07005131
5132 {
chaviw0e3479f2018-09-10 16:49:30 -07005133 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005134 // Top left of foreground must now be visible
5135 mCapture->expectFGColor(64, 64);
5136 // But 10 pixels in we should see the child surface
5137 mCapture->expectChildColor(74, 74);
5138 // And 10 more pixels we should be back to the foreground surface
5139 mCapture->expectFGColor(84, 84);
5140 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005141 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07005142 {
chaviw0e3479f2018-09-10 16:49:30 -07005143 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005144 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07005145 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005146 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07005147 mCapture->expectFGColor(84, 84);
5148 }
5149}
5150
5151TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07005152 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08005153 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07005154 ASSERT_TRUE(newSurface->isValid());
5155
5156 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005157 asTransaction([&](Transaction& t) {
5158 t.hide(mChild);
5159 t.show(newSurface);
5160 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005161 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005162 t.setPosition(mFGSurfaceControl, 64, 64);
5163 });
chaviwf1961f72017-09-18 16:41:07 -07005164
5165 {
chaviw0e3479f2018-09-10 16:49:30 -07005166 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005167 // Top left of foreground must now be visible
5168 mCapture->expectFGColor(64, 64);
5169 // At 10, 10 we should see the new surface
5170 mCapture->checkPixel(10, 10, 63, 195, 63);
5171 }
5172
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005173 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07005174
5175 {
chaviw0e3479f2018-09-10 16:49:30 -07005176 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005177 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
5178 // mFGSurface, putting it at 74, 74.
5179 mCapture->expectFGColor(64, 64);
5180 mCapture->checkPixel(74, 74, 63, 195, 63);
5181 mCapture->expectFGColor(84, 84);
5182 }
5183}
5184
chaviwc9674332017-08-28 12:32:18 -07005185TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005186 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
5187 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07005188 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5189
5190 {
chaviw0e3479f2018-09-10 16:49:30 -07005191 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07005192 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
5193 // which begins at 64, 64
5194 mCapture->checkPixel(64, 64, 50, 50, 50);
5195 }
5196}
5197
Robert Carr503c7042017-09-27 15:06:08 -07005198TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005199 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07005200 fillSurfaceRGBA8(relative, 255, 255, 255);
5201
5202 Transaction t;
5203 t.setLayer(relative, INT32_MAX)
5204 .setRelativeLayer(mChild, relative->getHandle(), 1)
5205 .setPosition(mFGSurfaceControl, 0, 0)
5206 .apply(true);
5207
5208 // We expect that the child should have been elevated above our
5209 // INT_MAX layer even though it's not a child of it.
5210 {
chaviw0e3479f2018-09-10 16:49:30 -07005211 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005212 mCapture->expectChildColor(0, 0);
5213 mCapture->expectChildColor(9, 9);
5214 mCapture->checkPixel(10, 10, 255, 255, 255);
5215 }
5216}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005217
Vishnu Nair60356342018-11-13 13:00:45 -08005218class BoundlessLayerTest : public LayerUpdateTest {
5219protected:
5220 std::unique_ptr<ScreenCapture> mCapture;
5221};
5222
5223// Verify setting a size on a buffer layer has no effect.
5224TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5225 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005226 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5227 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005228 ASSERT_TRUE(bufferLayer->isValid());
5229 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5230 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5231 {
5232 mCapture = screenshot();
5233 // Top left of background must now be visible
5234 mCapture->expectBGColor(0, 0);
5235 // Foreground Surface bounds must be color layer
5236 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5237 // Buffer layer should not extend past buffer bounds
5238 mCapture->expectFGColor(95, 95);
5239 }
5240}
5241
5242// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5243// which will crop the color layer.
5244TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5245 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005246 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5247 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005248 ASSERT_TRUE(colorLayer->isValid());
5249 asTransaction([&](Transaction& t) {
5250 t.setColor(colorLayer, half3{0, 0, 0});
5251 t.show(colorLayer);
5252 });
5253 {
5254 mCapture = screenshot();
5255 // Top left of background must now be visible
5256 mCapture->expectBGColor(0, 0);
5257 // Foreground Surface bounds must be color layer
5258 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5259 // Color layer should not extend past foreground bounds
5260 mCapture->expectBGColor(129, 129);
5261 }
5262}
5263
5264// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5265// a crop which will be used to crop the color layer.
5266TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005267 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5268 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005269 ASSERT_TRUE(cropLayer->isValid());
5270 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005271 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5272 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005273 ASSERT_TRUE(colorLayer->isValid());
5274 asTransaction([&](Transaction& t) {
5275 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5276 t.setColor(colorLayer, half3{0, 0, 0});
5277 t.show(cropLayer);
5278 t.show(colorLayer);
5279 });
5280 {
5281 mCapture = screenshot();
5282 // Top left of background must now be visible
5283 mCapture->expectBGColor(0, 0);
5284 // Top left of foreground must now be visible
5285 mCapture->expectFGColor(64, 64);
5286 // 5 pixels from the foreground we should see the child surface
5287 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5288 // 10 pixels from the foreground we should be back to the foreground surface
5289 mCapture->expectFGColor(74, 74);
5290 }
5291}
5292
5293// Verify for boundless layer with no children, their transforms have no effect.
5294TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5295 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005296 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5297 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005298 ASSERT_TRUE(colorLayer->isValid());
5299 asTransaction([&](Transaction& t) {
5300 t.setPosition(colorLayer, 320, 320);
5301 t.setMatrix(colorLayer, 2, 0, 0, 2);
5302 t.setColor(colorLayer, half3{0, 0, 0});
5303 t.show(colorLayer);
5304 });
5305 {
5306 mCapture = screenshot();
5307 // Top left of background must now be visible
5308 mCapture->expectBGColor(0, 0);
5309 // Foreground Surface bounds must be color layer
5310 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5311 // Color layer should not extend past foreground bounds
5312 mCapture->expectBGColor(129, 129);
5313 }
5314}
5315
5316// Verify for boundless layer with children, their transforms have an effect.
5317TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5318 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005319 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5320 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005321 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5322 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005323 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5324 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005325 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5326 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005327 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5328 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005329 ASSERT_TRUE(colorLayer->isValid());
5330 asTransaction([&](Transaction& t) {
5331 t.setPosition(boundlessLayerRightShift, 32, 0);
5332 t.show(boundlessLayerRightShift);
5333 t.setPosition(boundlessLayerDownShift, 0, 32);
5334 t.show(boundlessLayerDownShift);
5335 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5336 t.setColor(colorLayer, half3{0, 0, 0});
5337 t.show(colorLayer);
5338 });
5339 {
5340 mCapture = screenshot();
5341 // Top left of background must now be visible
5342 mCapture->expectBGColor(0, 0);
5343 // Top left of foreground must now be visible
5344 mCapture->expectFGColor(64, 64);
5345 // Foreground Surface bounds must be color layer
5346 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5347 // Color layer should not extend past foreground bounds
5348 mCapture->expectBGColor(129, 129);
5349 }
5350}
5351
5352// Verify child layers do not get clipped if they temporarily move into the negative
5353// coordinate space as the result of an intermediate transformation.
5354TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5355 sp<SurfaceControl> boundlessLayer =
5356 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5357 0 /* flags */, mFGSurfaceControl.get());
5358 ASSERT_TRUE(boundlessLayer != nullptr);
5359 ASSERT_TRUE(boundlessLayer->isValid());
5360 sp<SurfaceControl> colorLayer =
5361 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5362 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5363 ASSERT_TRUE(colorLayer != nullptr);
5364 ASSERT_TRUE(colorLayer->isValid());
5365 asTransaction([&](Transaction& t) {
5366 // shift child layer off bounds. If this layer was not boundless, we will
5367 // expect the child layer to be cropped.
5368 t.setPosition(boundlessLayer, 32, 32);
5369 t.show(boundlessLayer);
5370 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5371 // undo shift by parent
5372 t.setPosition(colorLayer, -32, -32);
5373 t.setColor(colorLayer, half3{0, 0, 0});
5374 t.show(colorLayer);
5375 });
5376 {
5377 mCapture = screenshot();
5378 // Top left of background must now be visible
5379 mCapture->expectBGColor(0, 0);
5380 // Foreground Surface bounds must be color layer
5381 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5382 // Color layer should not extend past foreground bounds
5383 mCapture->expectBGColor(129, 129);
5384 }
5385}
5386
5387// Verify for boundless root layers with children, their transforms have an effect.
5388TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005389 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5390 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005391 ASSERT_TRUE(rootBoundlessLayer->isValid());
5392 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005393 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5394 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5395
Vishnu Nair60356342018-11-13 13:00:45 -08005396 ASSERT_TRUE(colorLayer->isValid());
5397 asTransaction([&](Transaction& t) {
5398 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5399 t.setPosition(rootBoundlessLayer, 32, 32);
5400 t.show(rootBoundlessLayer);
5401 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5402 t.setColor(colorLayer, half3{0, 0, 0});
5403 t.show(colorLayer);
5404 t.hide(mFGSurfaceControl);
5405 });
5406 {
5407 mCapture = screenshot();
5408 // Top left of background must now be visible
5409 mCapture->expectBGColor(0, 0);
5410 // Top left of foreground must now be visible
5411 mCapture->expectBGColor(31, 31);
5412 // Foreground Surface bounds must be color layer
5413 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5414 // Color layer should not extend past foreground bounds
5415 mCapture->expectBGColor(97, 97);
5416 }
5417}
Robert Carr503c7042017-09-27 15:06:08 -07005418
chaviwa76b2712017-09-20 12:02:26 -07005419class ScreenCaptureTest : public LayerUpdateTest {
5420protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005421 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005422};
5423
5424TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5425 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005426 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005427 mCapture->expectBGColor(0, 0);
5428 // Doesn't capture FG layer which is at 64, 64
5429 mCapture->expectBGColor(64, 64);
5430}
5431
5432TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5433 auto fgHandle = mFGSurfaceControl->getHandle();
5434
Vishnu Nair88a11f22018-11-28 18:30:57 -08005435 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5436 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005437 fillSurfaceRGBA8(child, 200, 200, 200);
5438
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005439 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005440
5441 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005442 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005443 mCapture->expectFGColor(10, 10);
5444 mCapture->expectChildColor(0, 0);
5445}
5446
Robert Carr578038f2018-03-09 12:25:24 -08005447TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5448 auto fgHandle = mFGSurfaceControl->getHandle();
5449
Vishnu Nair88a11f22018-11-28 18:30:57 -08005450 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5451 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005452 fillSurfaceRGBA8(child, 200, 200, 200);
5453
5454 SurfaceComposerClient::Transaction().show(child).apply(true);
5455
5456 // Captures mFGSurfaceControl's child
5457 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5458 mCapture->checkPixel(10, 10, 0, 0, 0);
5459 mCapture->expectChildColor(0, 0);
5460}
5461
Robert Carr866455f2019-04-02 16:28:26 -07005462TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5463 auto fgHandle = mFGSurfaceControl->getHandle();
5464
5465 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5466 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5467 fillSurfaceRGBA8(child, 200, 200, 200);
5468 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5469 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5470 fillSurfaceRGBA8(child2, 200, 0, 200);
5471
5472 SurfaceComposerClient::Transaction()
5473 .show(child)
5474 .show(child2)
5475 .setLayer(child, 1)
5476 .setLayer(child2, 2)
5477 .apply(true);
5478
5479 // Child2 would be visible but its excluded, so we should see child1 color instead.
5480 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5481 mCapture->checkPixel(10, 10, 0, 0, 0);
5482 mCapture->checkPixel(0, 0, 200, 200, 200);
5483}
5484
5485// Like the last test but verifies that children are also exclude.
5486TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5487 auto fgHandle = mFGSurfaceControl->getHandle();
5488
5489 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5490 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5491 fillSurfaceRGBA8(child, 200, 200, 200);
5492 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5493 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5494 fillSurfaceRGBA8(child2, 200, 0, 200);
5495 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5496 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5497 fillSurfaceRGBA8(child2, 200, 0, 200);
5498
5499 SurfaceComposerClient::Transaction()
5500 .show(child)
5501 .show(child2)
5502 .show(child3)
5503 .setLayer(child, 1)
5504 .setLayer(child2, 2)
5505 .apply(true);
5506
5507 // Child2 would be visible but its excluded, so we should see child1 color instead.
5508 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5509 mCapture->checkPixel(10, 10, 0, 0, 0);
5510 mCapture->checkPixel(0, 0, 200, 200, 200);
5511}
5512
chaviw50da5042018-04-09 13:49:37 -07005513TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005514 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5515 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005516
5517 fillSurfaceRGBA8(child, 200, 200, 200);
5518
5519 SurfaceComposerClient::Transaction().show(child).apply(true);
5520
5521 auto childHandle = child->getHandle();
5522
5523 // Captures child
5524 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5525 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5526 // Area outside of child's bounds is transparent.
5527 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5528}
5529
chaviw4b129c22018-04-09 16:19:43 -07005530TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5531 auto fgHandle = mFGSurfaceControl->getHandle();
5532
Vishnu Nair88a11f22018-11-28 18:30:57 -08005533 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5534 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5535 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005536 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005537 fillSurfaceRGBA8(child, 200, 200, 200);
5538 fillSurfaceRGBA8(relative, 100, 100, 100);
5539
5540 SurfaceComposerClient::Transaction()
5541 .show(child)
5542 // Set relative layer above fg layer so should be shown above when computing all layers.
5543 .setRelativeLayer(relative, fgHandle, 1)
5544 .show(relative)
5545 .apply(true);
5546
5547 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5548 ScreenCapture::captureLayers(&mCapture, fgHandle);
5549 mCapture->expectFGColor(10, 10);
5550 mCapture->expectChildColor(0, 0);
5551}
5552
5553TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5554 auto fgHandle = mFGSurfaceControl->getHandle();
5555
Vishnu Nair88a11f22018-11-28 18:30:57 -08005556 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5557 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5558 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5559 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005560 fillSurfaceRGBA8(child, 200, 200, 200);
5561 fillSurfaceRGBA8(relative, 100, 100, 100);
5562
5563 SurfaceComposerClient::Transaction()
5564 .show(child)
5565 // Set relative layer below fg layer but relative to child layer so it should be shown
5566 // above child layer.
5567 .setLayer(relative, -1)
5568 .setRelativeLayer(relative, child->getHandle(), 1)
5569 .show(relative)
5570 .apply(true);
5571
5572 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5573 // relative value should be taken into account, placing it above child layer.
5574 ScreenCapture::captureLayers(&mCapture, fgHandle);
5575 mCapture->expectFGColor(10, 10);
5576 // Relative layer is showing on top of child layer
5577 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5578}
Robert Carr578038f2018-03-09 12:25:24 -08005579
5580// In the following tests we verify successful skipping of a parent layer,
5581// so we use the same verification logic and only change how we mutate
5582// the parent layer to verify that various properties are ignored.
5583class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5584public:
5585 void SetUp() override {
5586 LayerUpdateTest::SetUp();
5587
Vishnu Nair88a11f22018-11-28 18:30:57 -08005588 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5589 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005590 fillSurfaceRGBA8(mChild, 200, 200, 200);
5591
5592 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5593 }
5594
Vishnu Nair333a9572019-02-15 16:05:56 -08005595 void verify(std::function<void()> verifyStartingState) {
5596 // Verify starting state before a screenshot is taken.
5597 verifyStartingState();
5598
5599 // Verify child layer does not inherit any of the properties of its
5600 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005601 auto fgHandle = mFGSurfaceControl->getHandle();
5602 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5603 mCapture->checkPixel(10, 10, 0, 0, 0);
5604 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005605
5606 // Verify all assumptions are still true after the screenshot is taken.
5607 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005608 }
5609
5610 std::unique_ptr<ScreenCapture> mCapture;
5611 sp<SurfaceControl> mChild;
5612};
5613
Vishnu Nair333a9572019-02-15 16:05:56 -08005614// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005615TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5616
5617 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5618
5619 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005620
5621 // Before and after reparenting, verify child is properly hidden
5622 // when rendering full-screen.
5623 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005624}
5625
5626TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005627 SurfaceComposerClient::Transaction()
5628 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5629 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005630
5631 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005632
5633 // Before and after reparenting, verify child is cropped by parent.
5634 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005635}
5636
Vishnu Nair333a9572019-02-15 16:05:56 -08005637// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005638TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005639 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005640
5641 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005642
Vishnu Nair333a9572019-02-15 16:05:56 -08005643 // Before and after reparenting, verify child is properly scaled.
5644 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005645}
5646
5647
chaviwa76b2712017-09-20 12:02:26 -07005648TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5649 auto fgHandle = mFGSurfaceControl->getHandle();
5650
Vishnu Nair88a11f22018-11-28 18:30:57 -08005651 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5652 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005653 fillSurfaceRGBA8(child, 200, 200, 200);
5654
Vishnu Nair88a11f22018-11-28 18:30:57 -08005655 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5656 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005657
5658 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5659 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005660 .show(child)
5661 .setPosition(grandchild, 5, 5)
5662 .show(grandchild)
5663 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005664
5665 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005666 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005667 mCapture->expectFGColor(10, 10);
5668 mCapture->expectChildColor(0, 0);
5669 mCapture->checkPixel(5, 5, 50, 50, 50);
5670}
5671
5672TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005673 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5674 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005675 fillSurfaceRGBA8(child, 200, 200, 200);
5676 auto childHandle = child->getHandle();
5677
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005678 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005679
5680 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005681 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005682 mCapture->expectChildColor(0, 0);
5683 mCapture->expectChildColor(9, 9);
5684}
5685
5686TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005687 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5688 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005689 fillSurfaceRGBA8(child, 200, 200, 200);
5690 auto childHandle = child->getHandle();
5691
Vishnu Nair88a11f22018-11-28 18:30:57 -08005692 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5693 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005694 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5695
5696 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005697 .show(child)
5698 .setPosition(grandchild, 5, 5)
5699 .show(grandchild)
5700 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005701
5702 auto grandchildHandle = grandchild->getHandle();
5703
5704 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005705 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005706 mCapture->checkPixel(0, 0, 50, 50, 50);
5707 mCapture->checkPixel(4, 4, 50, 50, 50);
5708}
5709
chaviw7206d492017-11-10 16:16:12 -08005710TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005711 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005712 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5713 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005714
Marissa Wall61c58622018-07-18 10:12:20 -07005715 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5716 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005717
5718 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005719 .setLayer(redLayer, INT32_MAX - 1)
5720 .show(redLayer)
5721 .show(blueLayer)
5722 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005723
5724 auto redLayerHandle = redLayer->getHandle();
5725
5726 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005727 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5728 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5729 // red area below the blue area
5730 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5731 // red area to the right of the blue area
5732 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005733
Marissa Wall861616d2018-10-22 12:52:23 -07005734 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005735 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005736 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5737 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005738 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005739 mCapture->checkPixel(30, 30, 0, 0, 0);
5740}
5741
5742TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005743 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005744 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5745 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005746
Marissa Wall61c58622018-07-18 10:12:20 -07005747 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5748 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005749
5750 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005751 .setLayer(redLayer, INT32_MAX - 1)
5752 .show(redLayer)
5753 .show(blueLayer)
5754 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005755
5756 auto redLayerHandle = redLayer->getHandle();
5757
5758 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005759 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5760 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5761 // red area below the blue area
5762 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5763 // red area to the right of the blue area
5764 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005765
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005766 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005767 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005768 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5769 // red area below the blue area
5770 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5771 // red area to the right of the blue area
5772 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005773 mCapture->checkPixel(30, 30, 0, 0, 0);
5774}
5775
5776TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005777 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005778
Marissa Wall61c58622018-07-18 10:12:20 -07005779 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005780
5781 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005782 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005783 SurfaceComposerClient::Transaction().apply(true);
5784
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005785 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005786
5787 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005788 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5789 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005790}
5791
chaviw8e3fe5d2018-02-22 10:55:42 -08005792
5793class DereferenceSurfaceControlTest : public LayerTransactionTest {
5794protected:
5795 void SetUp() override {
5796 LayerTransactionTest::SetUp();
5797 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005798 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005799 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005800 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005801 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5802 {
5803 SCOPED_TRACE("before anything");
5804 auto shot = screenshot();
5805 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5806 }
5807 }
5808 void TearDown() override {
5809 LayerTransactionTest::TearDown();
5810 bgLayer = 0;
5811 fgLayer = 0;
5812 }
5813
5814 sp<SurfaceControl> bgLayer;
5815 sp<SurfaceControl> fgLayer;
5816};
5817
5818TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5819 fgLayer = nullptr;
5820 {
5821 SCOPED_TRACE("after setting null");
5822 auto shot = screenshot();
5823 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5824 }
5825}
5826
5827TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5828 auto transaction = Transaction().show(fgLayer);
5829 fgLayer = nullptr;
5830 {
5831 SCOPED_TRACE("after setting null");
5832 auto shot = screenshot();
5833 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5834 }
5835}
5836
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005837class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5838protected:
5839 virtual void SetUp() {
5840 LayerTransactionTest::SetUp();
5841 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5842
5843 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5844 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5845
5846 sp<IGraphicBufferConsumer> consumer;
5847 BufferQueue::createBufferQueue(&mProducer, &consumer);
5848 consumer->setConsumerName(String8("Virtual disp consumer"));
5849 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5850 }
5851
5852 virtual void TearDown() {
5853 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5854 LayerTransactionTest::TearDown();
5855 mColorLayer = 0;
5856 }
5857
5858 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5859 mVirtualDisplay =
5860 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5861 asTransaction([&](Transaction& t) {
5862 t.setDisplaySurface(mVirtualDisplay, mProducer);
5863 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5864 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5865 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5866 });
5867 }
5868
5869 void createColorLayer(uint32_t layerStack) {
5870 mColorLayer =
5871 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5872 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5873 ASSERT_TRUE(mColorLayer != nullptr);
5874 ASSERT_TRUE(mColorLayer->isValid());
5875 asTransaction([&](Transaction& t) {
5876 t.setLayerStack(mColorLayer, layerStack);
5877 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5878 t.setLayer(mColorLayer, INT32_MAX - 2);
5879 t.setColor(mColorLayer,
5880 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5881 mExpectedColor.b / 255.0f});
5882 t.show(mColorLayer);
5883 });
5884 }
5885
5886 DisplayInfo mMainDisplayInfo;
5887 sp<IBinder> mMainDisplay;
5888 sp<IBinder> mVirtualDisplay;
5889 sp<IGraphicBufferProducer> mProducer;
5890 sp<SurfaceControl> mColorLayer;
5891 Color mExpectedColor = {63, 63, 195, 255};
5892};
5893
5894TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5895 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5896 createColorLayer(1 /* layerStack */);
5897
5898 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5899
5900 // Verify color layer does not render on main display.
5901 std::unique_ptr<ScreenCapture> sc;
5902 ScreenCapture::captureScreen(&sc, mMainDisplay);
5903 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5904 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5905
5906 // Verify color layer renders correctly on virtual display.
5907 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5908 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5909 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5910}
5911
5912TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5913 // Create a display and set its layer stack to the main display's layer stack so
5914 // the contents of the main display are mirrored on to the virtual display.
5915
5916 // Assumption here is that the new mirrored display has the same viewport as the
5917 // primary display that it is mirroring.
5918 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5919 createColorLayer(0 /* layerStack */);
5920
5921 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5922
5923 // Verify color layer renders correctly on main display and it is mirrored on the
5924 // virtual display.
5925 std::unique_ptr<ScreenCapture> sc;
5926 ScreenCapture::captureScreen(&sc, mMainDisplay);
5927 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5928 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5929
5930 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5931 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5932 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5933}
5934
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005935class DisplayActiveConfigTest : public ::testing::Test {
5936protected:
5937 void SetUp() override {
5938 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5939 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5940 EXPECT_GT(mDisplayconfigs.size(), 0);
5941
5942 // set display power to on to make sure config can be changed
5943 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5944 }
5945
5946 sp<IBinder> mDisplayToken;
5947 Vector<DisplayInfo> mDisplayconfigs;
5948};
5949
5950TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5951 std::vector<int32_t> allowedConfigs;
5952
5953 // Add all configs to the allowed configs
5954 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5955 allowedConfigs.push_back(i);
5956 }
5957
5958 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5959 EXPECT_EQ(res, NO_ERROR);
5960
5961 std::vector<int32_t> outConfigs;
5962 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5963 EXPECT_EQ(res, NO_ERROR);
5964 EXPECT_EQ(allowedConfigs, outConfigs);
5965}
5966
5967TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5968 // we need at least 2 configs available for this test
5969 if (mDisplayconfigs.size() <= 1) return;
5970
5971 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5972
5973 // We want to set the allowed config to everything but the active config
5974 std::vector<int32_t> allowedConfigs;
5975 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5976 if (i != activeConfig) {
5977 allowedConfigs.push_back(i);
5978 }
5979 }
5980
5981 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5982 EXPECT_EQ(res, NO_ERROR);
5983
5984 // Allow some time for the config change
5985 std::this_thread::sleep_for(200ms);
5986
5987 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5988 EXPECT_NE(activeConfig, newActiveConfig);
5989
5990 // Make sure the new config is part of allowed config
5991 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5992 allowedConfigs.end());
5993}
5994
Vishnu Nairda9c85a2019-06-03 17:26:48 -07005995class RelativeZTest : public LayerTransactionTest {
5996protected:
5997 virtual void SetUp() {
5998 LayerTransactionTest::SetUp();
5999 ASSERT_EQ(NO_ERROR, mClient->initCheck());
6000
6001 const auto display = SurfaceComposerClient::getInternalDisplayToken();
6002 ASSERT_FALSE(display == nullptr);
6003
6004 // Back layer
6005 mBackgroundLayer = createColorLayer("Background layer", Color::RED);
6006
6007 // Front layer
6008 mForegroundLayer = createColorLayer("Foreground layer", Color::GREEN);
6009
6010 asTransaction([&](Transaction& t) {
6011 t.setDisplayLayerStack(display, 0);
6012 t.setLayer(mBackgroundLayer, INT32_MAX - 2).show(mBackgroundLayer);
6013 t.setLayer(mForegroundLayer, INT32_MAX - 1).show(mForegroundLayer);
6014 });
6015 }
6016
6017 virtual void TearDown() {
6018 LayerTransactionTest::TearDown();
6019 mBackgroundLayer = 0;
6020 mForegroundLayer = 0;
6021 }
6022
6023 sp<SurfaceControl> mBackgroundLayer;
6024 sp<SurfaceControl> mForegroundLayer;
6025};
6026
6027// When a layer is reparented offscreen, remove relative z order if the relative parent
6028// is still onscreen so that the layer is not drawn.
6029TEST_F(RelativeZTest, LayerRemoved) {
6030 std::unique_ptr<ScreenCapture> sc;
6031
6032 // Background layer (RED)
6033 // Child layer (WHITE) (relative to foregroud layer)
6034 // Foregroud layer (GREEN)
6035 sp<SurfaceControl> childLayer =
6036 createColorLayer("Child layer", Color::BLUE, mBackgroundLayer.get());
6037
6038 Transaction{}
6039 .setRelativeLayer(childLayer, mForegroundLayer->getHandle(), 1)
6040 .show(childLayer)
6041 .apply();
6042
6043 {
6044 // The childLayer should be in front of the FG control.
6045 ScreenCapture::captureScreen(&sc);
6046 sc->checkPixel(1, 1, Color::BLUE.r, Color::BLUE.g, Color::BLUE.b);
6047 }
6048
6049 // Background layer (RED)
6050 // Foregroud layer (GREEN)
6051 Transaction{}.reparent(childLayer, nullptr).apply();
6052
6053 // Background layer (RED)
6054 // Child layer (WHITE)
6055 // Foregroud layer (GREEN)
6056 Transaction{}.reparent(childLayer, mBackgroundLayer->getHandle()).apply();
6057
6058 {
6059 // The relative z info for child layer should be reset, leaving FG control on top.
6060 ScreenCapture::captureScreen(&sc);
6061 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6062 }
6063}
6064
6065// When a layer is reparented offscreen, preseve relative z order if the relative parent
6066// is also offscreen. Regression test b/132613412
6067TEST_F(RelativeZTest, LayerRemovedOffscreenRelativeParent) {
6068 std::unique_ptr<ScreenCapture> sc;
6069
6070 // Background layer (RED)
6071 // Foregroud layer (GREEN)
6072 // child level 1 (WHITE)
6073 // child level 2a (BLUE)
6074 // child level 3 (GREEN) (relative to child level 2b)
6075 // child level 2b (BLACK)
6076 sp<SurfaceControl> childLevel1 =
6077 createColorLayer("child level 1", Color::WHITE, mForegroundLayer.get());
6078 sp<SurfaceControl> childLevel2a =
6079 createColorLayer("child level 2a", Color::BLUE, childLevel1.get());
6080 sp<SurfaceControl> childLevel2b =
6081 createColorLayer("child level 2b", Color::BLACK, childLevel1.get());
6082 sp<SurfaceControl> childLevel3 =
6083 createColorLayer("child level 3", Color::GREEN, childLevel2a.get());
6084
6085 Transaction{}
6086 .setRelativeLayer(childLevel3, childLevel2b->getHandle(), 1)
6087 .show(childLevel2a)
6088 .show(childLevel2b)
6089 .show(childLevel3)
6090 .apply();
6091
6092 {
6093 // The childLevel3 should be in front of childLevel2b.
6094 ScreenCapture::captureScreen(&sc);
6095 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6096 }
6097
6098 // Background layer (RED)
6099 // Foregroud layer (GREEN)
6100 Transaction{}.reparent(childLevel1, nullptr).apply();
6101
6102 // Background layer (RED)
6103 // Foregroud layer (GREEN)
6104 // child level 1 (WHITE)
6105 // child level 2 back (BLUE)
6106 // child level 3 (GREEN) (relative to child level 2b)
6107 // child level 2 front (BLACK)
6108 Transaction{}.reparent(childLevel1, mForegroundLayer->getHandle()).apply();
6109
6110 {
6111 // Nothing should change at this point since relative z info was preserved.
6112 ScreenCapture::captureScreen(&sc);
6113 sc->checkPixel(1, 1, Color::GREEN.r, Color::GREEN.g, Color::GREEN.b);
6114 }
6115}
6116
Steven Thomas44685cb2019-07-23 16:19:31 -07006117// This test ensures that when we drop an app buffer in SurfaceFlinger, we merge
6118// the dropped buffer's damage region into the next buffer's damage region. If
6119// we don't do this, we'll report an incorrect damage region to hardware
6120// composer, resulting in broken rendering. This test checks the BufferQueue
6121// case.
6122//
6123// Unfortunately, we don't currently have a way to inspect the damage region
6124// SurfaceFlinger sends to hardware composer from a test, so this test requires
6125// the dev to manually watch the device's screen during the test to spot broken
6126// rendering. Because the results can't be automatically verified, this test is
6127// marked disabled.
6128TEST_F(LayerTransactionTest, DISABLED_BufferQueueLayerMergeDamageRegionWhenDroppingBuffers) {
6129 const int width = mDisplayWidth;
6130 const int height = mDisplayHeight;
6131 sp<SurfaceControl> layer;
6132 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
6133 const auto producer = layer->getIGraphicBufferProducer();
6134 const sp<IProducerListener> dummyListener(new DummyProducerListener);
6135 IGraphicBufferProducer::QueueBufferOutput queueBufferOutput;
6136 ASSERT_EQ(OK,
6137 producer->connect(dummyListener, NATIVE_WINDOW_API_CPU, true, &queueBufferOutput));
6138
6139 std::map<int, sp<GraphicBuffer>> slotMap;
6140 auto slotToBuffer = [&](int slot, sp<GraphicBuffer>* buf) {
6141 ASSERT_NE(nullptr, buf);
6142 const auto iter = slotMap.find(slot);
6143 ASSERT_NE(slotMap.end(), iter);
6144 *buf = iter->second;
6145 };
6146
6147 auto dequeue = [&](int* outSlot) {
6148 ASSERT_NE(nullptr, outSlot);
6149 *outSlot = -1;
6150 int slot;
6151 sp<Fence> fence;
6152 uint64_t age;
6153 FrameEventHistoryDelta timestamps;
6154 const status_t dequeueResult =
6155 producer->dequeueBuffer(&slot, &fence, width, height, PIXEL_FORMAT_RGBA_8888,
6156 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
6157 &age, &timestamps);
6158 if (dequeueResult == IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) {
6159 sp<GraphicBuffer> newBuf;
6160 ASSERT_EQ(OK, producer->requestBuffer(slot, &newBuf));
6161 ASSERT_NE(nullptr, newBuf.get());
6162 slotMap[slot] = newBuf;
6163 } else {
6164 ASSERT_EQ(OK, dequeueResult);
6165 }
6166 *outSlot = slot;
6167 };
6168
6169 auto queue = [&](int slot, const Region& damage, nsecs_t displayTime) {
6170 IGraphicBufferProducer::QueueBufferInput input(
6171 /*timestamp=*/displayTime, /*isAutoTimestamp=*/false, HAL_DATASPACE_UNKNOWN,
6172 /*crop=*/Rect::EMPTY_RECT, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW,
6173 /*transform=*/0, Fence::NO_FENCE);
6174 input.setSurfaceDamage(damage);
6175 IGraphicBufferProducer::QueueBufferOutput output;
6176 ASSERT_EQ(OK, producer->queueBuffer(slot, input, &output));
6177 };
6178
6179 auto fillAndPostBuffers = [&](const Color& color) {
6180 int slot1;
6181 ASSERT_NO_FATAL_FAILURE(dequeue(&slot1));
6182 int slot2;
6183 ASSERT_NO_FATAL_FAILURE(dequeue(&slot2));
6184
6185 sp<GraphicBuffer> buf1;
6186 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot1, &buf1));
6187 sp<GraphicBuffer> buf2;
6188 ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot2, &buf2));
6189 fillGraphicBufferColor(buf1, Rect(width, height), color);
6190 fillGraphicBufferColor(buf2, Rect(width, height), color);
6191
6192 const auto displayTime = systemTime() + milliseconds_to_nanoseconds(100);
6193 ASSERT_NO_FATAL_FAILURE(queue(slot1, Region::INVALID_REGION, displayTime));
6194 ASSERT_NO_FATAL_FAILURE(
6195 queue(slot2, Region(Rect(width / 3, height / 3, 2 * width / 3, 2 * height / 3)),
6196 displayTime));
6197 };
6198
6199 const auto startTime = systemTime();
6200 const std::array<Color, 3> colors = {Color::RED, Color::GREEN, Color::BLUE};
6201 int colorIndex = 0;
6202 while (nanoseconds_to_seconds(systemTime() - startTime) < 10) {
6203 ASSERT_NO_FATAL_FAILURE(fillAndPostBuffers(colors[colorIndex++ % colors.size()]));
6204 std::this_thread::sleep_for(1s);
6205 }
6206
6207 ASSERT_EQ(OK, producer->disconnect(NATIVE_WINDOW_API_CPU));
6208}
6209
Chavi Weingarten40482ff2017-11-30 01:51:40 +00006210} // namespace android