blob: ba854e3f2728ff53416656a916fc2b88ce8a250e [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070035#include <hardware/hwcomposer_defs.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080036#include <private/android_filesystem_config.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070037#include <private/gui/ComposerService.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080038
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070039#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070040#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070041#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070042#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070043
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070045#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080046#include <sys/types.h>
47#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070048
Marissa Wall713b63f2018-10-17 15:42:43 -070049#include "BufferGenerator.h"
50
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070051namespace android {
52
Chia-I Wu718daf82017-10-20 11:57:17 -070053namespace {
54
55struct Color {
56 uint8_t r;
57 uint8_t g;
58 uint8_t b;
59 uint8_t a;
60
61 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070062 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070063 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070064 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070065 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070066 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070067};
68
69const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070070const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070071const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070072const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070073const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070074const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070075
Marissa Wall61c58622018-07-18 10:12:20 -070076using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070077using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070078
Chia-I Wu718daf82017-10-20 11:57:17 -070079std::ostream& operator<<(std::ostream& os, const Color& color) {
80 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
81 return os;
82}
83
84// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070085void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
86 const Color& color) {
87 Rect r(0, 0, buffer.width, buffer.height);
88 if (!r.intersect(rect, &r)) {
89 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070090 }
91
Marissa Wall61c58622018-07-18 10:12:20 -070092 int32_t width = r.right - r.left;
93 int32_t height = r.bottom - r.top;
94
95 for (int32_t row = 0; row < height; row++) {
96 uint8_t* dst =
97 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
98 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070099 dst[0] = color.r;
100 dst[1] = color.g;
101 dst[2] = color.b;
102 dst[3] = color.a;
103 dst += 4;
104 }
105 }
106}
107
Marissa Wall61c58622018-07-18 10:12:20 -0700108// Fill a region with the specified color.
109void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
110 Rect r(0, 0, buffer->width, buffer->height);
111 if (!r.intersect(rect, &r)) {
112 return;
113 }
114
115 int32_t width = r.right - r.left;
116 int32_t height = r.bottom - r.top;
117
118 uint8_t* pixels;
119 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
120 reinterpret_cast<void**>(&pixels));
121
122 for (int32_t row = 0; row < height; row++) {
123 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
124 for (int32_t column = 0; column < width; column++) {
125 dst[0] = color.r;
126 dst[1] = color.g;
127 dst[2] = color.b;
128 dst[3] = color.a;
129 dst += 4;
130 }
131 }
132 buffer->unlock();
133}
134
Chia-I Wu718daf82017-10-20 11:57:17 -0700135// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000136void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700137 const Color& color, uint8_t tolerance) {
138 int32_t x = rect.left;
139 int32_t y = rect.top;
140 int32_t width = rect.right - rect.left;
141 int32_t height = rect.bottom - rect.top;
142
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000143 int32_t bufferWidth = int32_t(outBuffer->getWidth());
144 int32_t bufferHeight = int32_t(outBuffer->getHeight());
145 if (x + width > bufferWidth) {
146 x = std::min(x, bufferWidth);
147 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000149 if (y + height > bufferHeight) {
150 y = std::min(y, bufferHeight);
151 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700152 }
153
154 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
155 uint8_t tmp = a >= b ? a - b : b - a;
156 return tmp <= tolerance;
157 };
158 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000159 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700160 for (int32_t i = 0; i < width; i++) {
161 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
162 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
163 << "pixel @ (" << x + i << ", " << y + j << "): "
164 << "expected (" << color << "), "
165 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
166 src += 4;
167 }
168 }
169}
170
171} // anonymous namespace
172
Robert Carr4cdc58f2017-08-23 14:22:20 -0700173using Transaction = SurfaceComposerClient::Transaction;
174
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700176static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
177 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700179 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800180 ASSERT_TRUE(s != nullptr);
181 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800182 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700183 for (int y = 0; y < outBuffer.height; y++) {
184 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700185 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700186 pixel[0] = r;
187 pixel[1] = g;
188 pixel[2] = b;
189 pixel[3] = 255;
190 }
191 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700192 if (unlock) {
193 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
194 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700195}
196
197// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
198// individual pixel values for testing purposes.
199class ScreenCapture : public RefBase {
200public:
chaviw0e3479f2018-09-10 16:49:30 -0700201 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800202 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
203 }
204
205 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800206 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700207 SurfaceComposerClient::Transaction().apply(true);
208
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000209 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800210 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700211 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000212 }
213
214 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
215 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
216 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
217 SurfaceComposerClient::Transaction().apply(true);
218
219 sp<GraphicBuffer> outBuffer;
220 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
221 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700222 }
223
Robert Carr578038f2018-03-09 12:25:24 -0800224 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
225 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
226 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
227 SurfaceComposerClient::Transaction().apply(true);
228
229 sp<GraphicBuffer> outBuffer;
230 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
231 *sc = std::make_unique<ScreenCapture>(outBuffer);
232 }
233
Robert Carr866455f2019-04-02 16:28:26 -0700234 static void captureChildLayersExcluding(
235 std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
236 std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>> excludeLayers) {
237 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
238 SurfaceComposerClient::Transaction().apply(true);
239
240 sp<GraphicBuffer> outBuffer;
241 ASSERT_EQ(NO_ERROR,
242 sf->captureLayers(parentHandle, &outBuffer, ui::Dataspace::V0_SRGB,
243 ui::PixelFormat::RGBA_8888, Rect::EMPTY_RECT, excludeLayers,
244 1.0f, true));
245 *sc = std::make_unique<ScreenCapture>(outBuffer);
246 }
247
Chia-I Wu718daf82017-10-20 11:57:17 -0700248 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000249 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
250 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700251 }
252
253 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000254 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700255 const bool leftBorder = rect.left > 0;
256 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000257 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
258 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700259
260 if (topBorder) {
261 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
262 if (leftBorder) {
263 top.left -= 1;
264 }
265 if (rightBorder) {
266 top.right += 1;
267 }
268 expectColor(top, color, tolerance);
269 }
270 if (leftBorder) {
271 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
272 expectColor(left, color, tolerance);
273 }
274 if (rightBorder) {
275 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
276 expectColor(right, color, tolerance);
277 }
278 if (bottomBorder) {
279 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
280 if (leftBorder) {
281 bottom.left -= 1;
282 }
283 if (rightBorder) {
284 bottom.right += 1;
285 }
286 expectColor(bottom, color, tolerance);
287 }
288 }
289
Chia-I Wu93853fe2017-11-02 08:30:27 -0700290 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
291 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
292 uint8_t tolerance = 0) {
293 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
294
295 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
296 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
297 // avoid checking borders due to unspecified filtering behavior
298 const int32_t offsetX = filtered ? 2 : 0;
299 const int32_t offsetY = filtered ? 2 : 0;
300 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
301 tolerance);
302 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
303 tolerance);
304 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
305 tolerance);
306 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
307 bottomRight, tolerance);
308 }
309
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700310 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000311 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
312 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700313 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
314 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700315 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
316 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700317 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700318 }
319 }
320
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700321 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700322
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700323 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700324
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700325 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700326
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800327 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000328 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700329 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700330
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000331 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700332
333private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000334 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800335 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700336};
337
Chia-I Wu718daf82017-10-20 11:57:17 -0700338class LayerTransactionTest : public ::testing::Test {
339protected:
340 void SetUp() override {
341 mClient = new SurfaceComposerClient;
342 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
343
344 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700345
346 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700347 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700348 }
349
chaviw0e3479f2018-09-10 16:49:30 -0700350 virtual void TearDown() {
351 mBlackBgSurface = 0;
352 mClient->dispose();
353 mClient = 0;
354 }
355
Marissa Wallfda30bb2018-10-12 11:34:28 -0700356 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
357 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800358 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
359 auto layer =
360 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700361
Vishnu Nair60356342018-11-13 13:00:45 -0800362 Transaction t;
363 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800364
365 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700366 if (error != NO_ERROR) {
367 ADD_FAILURE() << "failed to initialize SurfaceControl";
368 layer.clear();
369 }
370
371 return layer;
372 }
373
Vishnu Nair88a11f22018-11-28 18:30:57 -0800374 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
375 const char* name, uint32_t width, uint32_t height,
376 PixelFormat format, uint32_t flags,
377 SurfaceControl* parent = nullptr) {
378 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
379 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
380 return layer;
381 }
382
Marissa Wallfda30bb2018-10-12 11:34:28 -0700383 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800384 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
385 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700386 }
387
Marissa Wall61c58622018-07-18 10:12:20 -0700388 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700389 // wait for previous transactions (such as setSize) to complete
390 Transaction().apply(true);
391
392 ANativeWindow_Buffer buffer = {};
393 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
394
395 return buffer;
396 }
397
Marissa Wall61c58622018-07-18 10:12:20 -0700398 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700399 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
400
401 // wait for the newly posted buffer to be latched
402 waitForLayerBuffers();
403 }
404
Marissa Wall61c58622018-07-18 10:12:20 -0700405 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
406 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700407 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700408 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
409 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
410 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700411 }
412
Marissa Wall61c58622018-07-18 10:12:20 -0700413 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
414 int32_t bufferWidth, int32_t bufferHeight) {
415 sp<GraphicBuffer> buffer =
416 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
417 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
418 BufferUsage::COMPOSER_OVERLAY,
419 "test");
420 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700421 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700422 }
423
424 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
425 int32_t bufferWidth, int32_t bufferHeight) {
426 switch (mLayerType) {
427 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
428 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
429 break;
430 case ISurfaceComposerClient::eFXSurfaceBufferState:
431 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
432 break;
433 default:
434 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
435 }
436 }
437
438 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
439 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700440 const Color& topRight, const Color& bottomLeft,
441 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700442 switch (mLayerType) {
443 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
444 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
445 bottomLeft, bottomRight);
446 break;
447 case ISurfaceComposerClient::eFXSurfaceBufferState:
448 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
449 bottomLeft, bottomRight);
450 break;
451 default:
452 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
453 }
454 }
455
456 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
457 int32_t bufferHeight, const Color& topLeft,
458 const Color& topRight, const Color& bottomLeft,
459 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700460 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700461 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
462 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700463
Marissa Wall61c58622018-07-18 10:12:20 -0700464 const int32_t halfW = bufferWidth / 2;
465 const int32_t halfH = bufferHeight / 2;
466 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
467 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
468 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
469 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
470 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700471
Marissa Wall61c58622018-07-18 10:12:20 -0700472 postBufferQueueLayerBuffer(layer);
473 }
474
475 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
476 int32_t bufferHeight, const Color& topLeft,
477 const Color& topRight, const Color& bottomLeft,
478 const Color& bottomRight) {
479 sp<GraphicBuffer> buffer =
480 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
481 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
482 BufferUsage::COMPOSER_OVERLAY,
483 "test");
484
485 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
486
487 const int32_t halfW = bufferWidth / 2;
488 const int32_t halfH = bufferHeight / 2;
489 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
490 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
491 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
492 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
493
494 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700495 }
496
chaviw0e3479f2018-09-10 16:49:30 -0700497 std::unique_ptr<ScreenCapture> screenshot() {
498 std::unique_ptr<ScreenCapture> screenshot;
499 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700500 return screenshot;
501 }
502
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800503 void asTransaction(const std::function<void(Transaction&)>& exec) {
504 Transaction t;
505 exec(t);
506 t.apply(true);
507 }
508
Marissa Wall713b63f2018-10-17 15:42:43 -0700509 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
510 static BufferGenerator bufferGenerator;
511 return bufferGenerator.get(outBuffer, outFence);
512 }
513
Chia-I Wu718daf82017-10-20 11:57:17 -0700514 sp<SurfaceComposerClient> mClient;
515
516 sp<IBinder> mDisplay;
517 uint32_t mDisplayWidth;
518 uint32_t mDisplayHeight;
519 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700520 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700521
522 // leave room for ~256 layers
523 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
524
chaviw0e3479f2018-09-10 16:49:30 -0700525 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700526 bool mColorManagementUsed;
527
Chia-I Wu718daf82017-10-20 11:57:17 -0700528private:
529 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800530 mDisplay = mClient->getInternalDisplayToken();
531 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700532
533 // get display width/height
534 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800535 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700536 mDisplayWidth = info.w;
537 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700538 mDisplayRect =
539 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700540
541 // After a new buffer is queued, SurfaceFlinger is notified and will
542 // latch the new buffer on next vsync. Let's heuristically wait for 3
543 // vsyncs.
544 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
545
546 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700547
Vishnu Nair88a11f22018-11-28 18:30:57 -0800548 mBlackBgSurface =
549 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
550 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700551
Chia-I Wu718daf82017-10-20 11:57:17 -0700552 // set layer stack (b/68888219)
553 Transaction t;
554 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800555 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700556 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
557 t.setColor(mBlackBgSurface, half3{0, 0, 0});
558 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700559 t.apply();
560 }
561
chaviw0e3479f2018-09-10 16:49:30 -0700562 void waitForLayerBuffers() {
563 // Request an empty transaction to get applied synchronously to ensure the buffer is
564 // latched.
565 Transaction().apply(true);
566 usleep(mBufferPostDelay);
567 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700568
569 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800570
571 friend class LayerRenderPathTestHarness;
572};
573enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
574
575class LayerRenderPathTestHarness {
576public:
577 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
578 : mDelegate(delegate), mRenderPath(renderPath) {}
579
580 std::unique_ptr<ScreenCapture> getScreenCapture() {
581 switch (mRenderPath) {
582 case RenderPath::SCREENSHOT:
583 return mDelegate->screenshot();
584 case RenderPath::VIRTUAL_DISPLAY:
585
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800586 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800587 DisplayInfo mainDisplayInfo;
588 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
589
590 sp<IBinder> vDisplay;
591 sp<IGraphicBufferProducer> producer;
592 sp<IGraphicBufferConsumer> consumer;
593 sp<BufferItemConsumer> itemConsumer;
594 BufferQueue::createBufferQueue(&producer, &consumer);
595
596 consumer->setConsumerName(String8("Virtual disp consumer"));
597 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
598
599 itemConsumer = new BufferItemConsumer(consumer,
600 // Sample usage bits from screenrecord
601 GRALLOC_USAGE_HW_VIDEO_ENCODER |
602 GRALLOC_USAGE_SW_READ_OFTEN);
603
604 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
605 false /*secure*/);
606
607 SurfaceComposerClient::Transaction t;
608 t.setDisplaySurface(vDisplay, producer);
609 t.setDisplayLayerStack(vDisplay, 0);
610 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
611 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
612 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
613 t.apply();
614 SurfaceComposerClient::Transaction().apply(true);
615 BufferItem item;
616 itemConsumer->acquireBuffer(&item, 0, true);
617 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
618 itemConsumer->releaseBuffer(item);
619 SurfaceComposerClient::destroyDisplay(vDisplay);
620 return sc;
621 }
622 }
623
624protected:
625 LayerTransactionTest* mDelegate;
626 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700627};
628
Alec Mouri80863a62019-01-17 15:19:35 -0800629class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700630public:
Alec Mouri80863a62019-01-17 15:19:35 -0800631 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700632
633 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800634 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700635 // if the flags already have a layer type specified, return an error
636 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
637 return nullptr;
638 }
chaviwf66724d2018-11-28 16:35:21 -0800639 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700640 }
641
642 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
643 int32_t bufferHeight) {
644 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
645 bufferWidth, bufferHeight));
646 }
647
648 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
649 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
650 const Color& bottomLeft, const Color& bottomRight) {
651 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
652 bufferWidth, bufferHeight,
653 topLeft, topRight,
654 bottomLeft, bottomRight));
655 }
656
657protected:
658 uint32_t mLayerType;
659};
660
Alec Mouri80863a62019-01-17 15:19:35 -0800661class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
662 public ::testing::WithParamInterface<uint32_t> {
663public:
664 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
665};
666
667class LayerTypeAndRenderTypeTransactionTest
668 : public LayerTypeTransactionHarness,
669 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
670public:
671 LayerTypeAndRenderTypeTransactionTest()
672 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
673 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
674
675 std::unique_ptr<ScreenCapture> getScreenCapture() {
676 return mRenderPathHarness.getScreenCapture();
677 }
678
679protected:
680 LayerRenderPathTestHarness mRenderPathHarness;
681};
682
683// Environment for starting up binder threads. This is required for testing
684// virtual displays, as BufferQueue parameters may be queried over binder.
685class BinderEnvironment : public ::testing::Environment {
686public:
687 void SetUp() override { ProcessState::self()->startThreadPool(); }
688};
689
690::testing::Environment* const binderEnv =
691 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
692
693class LayerRenderTypeTransactionTest : public LayerTransactionTest,
694 public ::testing::WithParamInterface<RenderPath> {
695public:
696 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
697
698 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
699 void setRelativeZBasicHelper(uint32_t layerType);
700 void setRelativeZGroupHelper(uint32_t layerType);
701 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800702 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
703 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800704
705protected:
706 LayerRenderPathTestHarness mHarness;
707};
708
709INSTANTIATE_TEST_CASE_P(
710 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
711 ::testing::Combine(
712 ::testing::Values(
713 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
714 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
715 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
716
717INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
718 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
719
Marissa Wall61c58622018-07-18 10:12:20 -0700720INSTANTIATE_TEST_CASE_P(
721 LayerTypeTransactionTests, LayerTypeTransactionTest,
722 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
723 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
724
Alec Mouri80863a62019-01-17 15:19:35 -0800725TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700726 sp<SurfaceControl> layer;
727 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700728 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700729
730 {
731 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700732 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800733 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700734 shot->expectColor(rect, Color::RED);
735 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700736 }
737
738 Transaction().setPosition(layer, 5, 10).apply();
739 {
740 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700741 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800742 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700743 shot->expectColor(rect, Color::RED);
744 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700745 }
746}
747
Alec Mouri80863a62019-01-17 15:19:35 -0800748TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700749 sp<SurfaceControl> layer;
750 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700751 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700752
753 // GLES requires only 4 bits of subpixel precision during rasterization
754 // XXX GLES composition does not match HWC composition due to precision
755 // loss (b/69315223)
756 const float epsilon = 1.0f / 16.0f;
757 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
758 {
759 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762
763 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
764 {
765 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800766 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700767 }
768}
769
Alec Mouri80863a62019-01-17 15:19:35 -0800770TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 sp<SurfaceControl> layer;
772 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700773 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700774
775 Transaction().setPosition(layer, -32, -32).apply();
776 {
777 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800778 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700779 }
780
781 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
782 {
783 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800784 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700785 }
786}
787
Alec Mouri80863a62019-01-17 15:19:35 -0800788TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700789 sp<SurfaceControl> layer;
790 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700791 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700792
793 // partially out of bounds
794 Transaction().setPosition(layer, -30, -30).apply();
795 {
796 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800797 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700798 }
799
800 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
801 {
802 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800803 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
804 mDisplayHeight),
805 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700806 }
807}
808
Alec Mouri80863a62019-01-17 15:19:35 -0800809TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700810 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700811 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
812 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700813
814 // setPosition is applied immediately by default, with or without resize
815 // pending
816 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
817 {
818 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800819 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700820 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700821 shot->expectColor(rect, Color::RED);
822 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700823 }
824
Marissa Wall861616d2018-10-22 12:52:23 -0700825 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700826 {
827 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800828 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700829 }
830}
831
Alec Mouri80863a62019-01-17 15:19:35 -0800832TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700833 sp<SurfaceControl> layer;
834 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700835 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700836
837 // request setPosition to be applied with the next resize
838 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
839 {
840 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800841 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700842 }
843
844 Transaction().setPosition(layer, 15, 20).apply();
845 {
846 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800847 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700848 }
849
850 Transaction().setSize(layer, 64, 64).apply();
851 {
852 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800853 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700854 }
855
856 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 {
859 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862}
863
Alec Mouri80863a62019-01-17 15:19:35 -0800864TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700865 sp<SurfaceControl> layer;
866 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700868
869 // setPosition is not immediate even with SCALE_TO_WINDOW override
870 Transaction()
871 .setPosition(layer, 5, 10)
872 .setSize(layer, 64, 64)
873 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
874 .setGeometryAppliesWithResize(layer)
875 .apply();
876 {
877 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800878 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700879 }
880
Marissa Wall61c58622018-07-18 10:12:20 -0700881 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700882 {
883 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800884 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700885 }
886}
887
Alec Mouri80863a62019-01-17 15:19:35 -0800888TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700890 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
891 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700892
893 Transaction().setSize(layer, 64, 64).apply();
894 {
895 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800896 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700897 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700898 shot->expectColor(rect, Color::RED);
899 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700900 }
901
Marissa Wall861616d2018-10-22 12:52:23 -0700902 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903 {
904 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800905 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700906 const Rect rect(0, 0, 64, 64);
907 shot->expectColor(rect, Color::RED);
908 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700909 }
910}
911
Alec Mouri80863a62019-01-17 15:19:35 -0800912TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700913 // cannot test robustness against invalid sizes (zero or really huge)
914}
915
Alec Mouri80863a62019-01-17 15:19:35 -0800916TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700917 sp<SurfaceControl> layer;
918 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700919 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700920
921 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
922 Transaction()
923 .setSize(layer, 64, 64)
924 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
925 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800926 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700927}
928
Alec Mouri80863a62019-01-17 15:19:35 -0800929TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700930 sp<SurfaceControl> layerR;
931 sp<SurfaceControl> layerG;
932 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700933 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700934 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700935 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700936
937 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
938 {
939 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800940 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700941 }
942
943 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
944 {
945 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800946 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 }
948}
949
Alec Mouri80863a62019-01-17 15:19:35 -0800950TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700951 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800952 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700953 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800954 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700955 sp<SurfaceControl> layerR;
956 sp<SurfaceControl> layerG;
957 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700958 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700959 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700960 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700961
chaviw0e3479f2018-09-10 16:49:30 -0700962 Transaction()
963 .reparent(layerR, parent->getHandle())
964 .reparent(layerG, parent->getHandle())
965 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700966 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
967 {
968 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800969 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700970 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700971 }
972
973 Transaction().setLayer(layerR, -3).apply();
974 {
975 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800976 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700977 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700978 }
979}
980
Alec Mouri80863a62019-01-17 15:19:35 -0800981void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700982 sp<SurfaceControl> layerR;
983 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700984 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
985 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
986 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
987 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700988
Marissa Wall861616d2018-10-22 12:52:23 -0700989 switch (layerType) {
990 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
991 Transaction()
992 .setPosition(layerG, 16, 16)
993 .setRelativeLayer(layerG, layerR->getHandle(), 1)
994 .apply();
995 break;
996 case ISurfaceComposerClient::eFXSurfaceBufferState:
997 Transaction()
998 .setFrame(layerR, Rect(0, 0, 32, 32))
999 .setFrame(layerG, Rect(16, 16, 48, 48))
1000 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1001 .apply();
1002 break;
1003 default:
1004 ASSERT_FALSE(true) << "Unsupported layer type";
1005 }
Chia-I Wu49313302017-10-31 10:14:40 -07001006 {
1007 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -08001008 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001009 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1010 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
1011 }
1012
1013 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1014 {
1015 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001016 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001017 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1018 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1019 }
1020}
1021
Alec Mouri80863a62019-01-17 15:19:35 -08001022TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001023 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1024}
1025
Alec Mouri80863a62019-01-17 15:19:35 -08001026TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001027 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1028}
1029
Marissa Wall61c58622018-07-18 10:12:20 -07001030TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001031 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001032 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001033 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001034 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001035 sp<SurfaceControl> layerR;
1036 sp<SurfaceControl> layerG;
1037 sp<SurfaceControl> layerB;
1038 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001039 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001040 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001041 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001042 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001043 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001044
chaviw0e3479f2018-09-10 16:49:30 -07001045 Transaction()
1046 .reparent(layerB, parent->getHandle())
1047 .apply();
1048
Chia-I Wuec2d9852017-11-21 09:21:01 -08001049 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1050 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1051
chaviw0e3479f2018-09-10 16:49:30 -07001052 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001053 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001054 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001055 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001056 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1057}
1058
Alec Mouri80863a62019-01-17 15:19:35 -08001059void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001060 sp<SurfaceControl> layerR;
1061 sp<SurfaceControl> layerG;
1062 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001063 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1064 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1065 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1066 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1067 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1068 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001069
1070 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001071 switch (layerType) {
1072 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1073 Transaction()
1074 .setPosition(layerG, 8, 8)
1075 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1076 .setPosition(layerB, 16, 16)
1077 .setLayer(layerB, mLayerZBase + 2)
1078 .apply();
1079 break;
1080 case ISurfaceComposerClient::eFXSurfaceBufferState:
1081 Transaction()
1082 .setFrame(layerR, Rect(0, 0, 32, 32))
1083 .setFrame(layerG, Rect(8, 8, 40, 40))
1084 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1085 .setFrame(layerB, Rect(16, 16, 48, 48))
1086 .setLayer(layerB, mLayerZBase + 2)
1087 .apply();
1088 break;
1089 default:
1090 ASSERT_FALSE(true) << "Unsupported layer type";
1091 }
1092
Chia-I Wu49313302017-10-31 10:14:40 -07001093 {
1094 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001095 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001096 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1097 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1098 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1099 }
1100
1101 // layerR = 4, layerG = layerR + 3, layerB = 2
1102 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1103 {
1104 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001105 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001106 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1107 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1108 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1109 }
1110
1111 // layerR = 4, layerG = layerR - 3, layerB = 2
1112 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1113 {
1114 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001115 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001116 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1117 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1118 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1119 }
1120
1121 // restore to absolute z
1122 // layerR = 4, layerG = 0, layerB = 2
1123 Transaction().setLayer(layerG, mLayerZBase).apply();
1124 {
1125 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001126 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001127 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1128 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1129 }
1130
1131 // layerR should not affect layerG anymore
1132 // layerR = 1, layerG = 0, layerB = 2
1133 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1134 {
1135 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001136 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001137 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1138 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1139 }
1140}
1141
Alec Mouri80863a62019-01-17 15:19:35 -08001142TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001143 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1144}
1145
Alec Mouri80863a62019-01-17 15:19:35 -08001146TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001147 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1148}
1149
Alec Mouri80863a62019-01-17 15:19:35 -08001150TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001151 sp<SurfaceControl> layerR;
1152 sp<SurfaceControl> layerG;
1153
1154 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001155 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001156 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001157 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001158
1159 Transaction()
1160 .setPosition(layerG, 16, 16)
1161 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1162 .apply();
1163
Robert Carr87246532019-02-04 15:20:26 -08001164 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001165 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001166 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001167}
1168
Alec Mouri80863a62019-01-17 15:19:35 -08001169TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001170 sp<SurfaceControl> layer;
1171 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001172 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001173
1174 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1175 {
1176 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001177 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001178 }
1179
1180 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1181 {
1182 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001183 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001184 }
1185}
1186
Alec Mouri80863a62019-01-17 15:19:35 -08001187TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001188 const Color translucentRed = {100, 0, 0, 100};
1189 sp<SurfaceControl> layerR;
1190 sp<SurfaceControl> layerG;
1191 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001192 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001193 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001194 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001195
1196 Transaction()
1197 .setLayer(layerR, mLayerZBase + 1)
1198 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1199 .apply();
1200 {
1201 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001202 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001203 }
1204
1205 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1206 {
1207 SCOPED_TRACE("layerR translucent");
1208 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001209 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001210 }
1211}
1212
Marissa Wall61c58622018-07-18 10:12:20 -07001213TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001214 sp<SurfaceControl> layer;
1215 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001216 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001217
1218 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001219 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001220 Transaction()
1221 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1222 .apply(true);
1223 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001224 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001225
1226 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1227 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001228 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001229}
1230
Robert Carrfa8855f2019-02-19 10:05:00 -08001231/** RAII Wrapper around get/seteuid */
1232class UIDFaker {
1233 uid_t oldId;
1234public:
1235 UIDFaker(uid_t uid) {
1236 oldId = geteuid();
1237 seteuid(uid);
1238 }
1239 ~UIDFaker() {
1240 seteuid(oldId);
1241 }
1242};
1243
1244TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1245 sp<SurfaceControl> layer;
1246 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1247 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1248
1249 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1250 sp<GraphicBuffer> outBuffer;
1251 Transaction()
1252 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1253 .apply(true);
1254 ASSERT_EQ(PERMISSION_DENIED,
1255 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1256
1257 UIDFaker f(AID_SYSTEM);
1258
1259 // By default the system can capture screenshots with secure layers but they
1260 // will be blacked out
1261 ASSERT_EQ(NO_ERROR,
1262 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1263
1264 {
1265 SCOPED_TRACE("as system");
1266 auto shot = screenshot();
1267 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1268 }
1269
1270 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1271 // to receive them...we are expected to take care with the results.
1272 ASSERT_EQ(NO_ERROR,
1273 composer->captureScreen(mDisplay, &outBuffer,
1274 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888,
1275 Rect(), 0, 0, false,
1276 ISurfaceComposer::eRotateNone, true));
1277 ScreenCapture sc(outBuffer);
1278 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1279}
1280
Alec Mouri80863a62019-01-17 15:19:35 -08001281TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001282 const Rect top(0, 0, 32, 16);
1283 const Rect bottom(0, 16, 32, 32);
1284 sp<SurfaceControl> layer;
1285 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1286
1287 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001288 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1289 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1290 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001291 // setTransparentRegionHint always applies to the following buffer
1292 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001293 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001294 {
1295 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001296 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001297 shot->expectColor(top, Color::BLACK);
1298 shot->expectColor(bottom, Color::RED);
1299 }
1300
1301 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1302 {
1303 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001304 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001305 shot->expectColor(top, Color::BLACK);
1306 shot->expectColor(bottom, Color::RED);
1307 }
1308
Marissa Wall61c58622018-07-18 10:12:20 -07001309 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1310 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1311 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1312 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001313 {
1314 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001315 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001316 shot->expectColor(top, Color::RED);
1317 shot->expectColor(bottom, Color::BLACK);
1318 }
1319}
1320
Alec Mouri80863a62019-01-17 15:19:35 -08001321TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001322 const Rect top(0, 0, 32, 16);
1323 const Rect bottom(0, 16, 32, 32);
1324 sp<SurfaceControl> layer;
1325 ASSERT_NO_FATAL_FAILURE(
1326 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1327
1328 sp<GraphicBuffer> buffer =
1329 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1330 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1331 BufferUsage::COMPOSER_OVERLAY,
1332 "test");
1333
1334 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1335 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1336 Transaction()
1337 .setTransparentRegionHint(layer, Region(top))
1338 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001339 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001340 .apply();
1341 {
1342 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001343 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001344 shot->expectColor(top, Color::BLACK);
1345 shot->expectColor(bottom, Color::RED);
1346 }
1347
1348 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1349 {
1350 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001351 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001352 shot->expectColor(top, Color::BLACK);
1353 shot->expectColor(bottom, Color::BLACK);
1354 }
1355
1356 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1357 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1358 BufferUsage::COMPOSER_OVERLAY,
1359 "test");
1360
1361 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1362 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001363 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001364 {
1365 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001366 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001367 shot->expectColor(top, Color::RED);
1368 shot->expectColor(bottom, Color::BLACK);
1369 }
1370}
1371
Alec Mouri80863a62019-01-17 15:19:35 -08001372TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001373 sp<SurfaceControl> layerTransparent;
1374 sp<SurfaceControl> layerR;
1375 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1376 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1377
1378 // check that transparent region hint is bound by the layer size
1379 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001380 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001381 .setPosition(layerR, 16, 16)
1382 .setLayer(layerR, mLayerZBase + 1)
1383 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001384 ASSERT_NO_FATAL_FAILURE(
1385 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1386 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001387 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001388}
1389
Alec Mouri80863a62019-01-17 15:19:35 -08001390TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001391 sp<SurfaceControl> layerTransparent;
1392 sp<SurfaceControl> layerR;
1393 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1394 ASSERT_NO_FATAL_FAILURE(
1395 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1396
1397 // check that transparent region hint is bound by the layer size
1398 Transaction()
1399 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1400 .setFrame(layerR, Rect(16, 16, 48, 48))
1401 .setLayer(layerR, mLayerZBase + 1)
1402 .apply();
1403 ASSERT_NO_FATAL_FAILURE(
1404 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1405 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001406 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001407}
1408
Alec Mouri80863a62019-01-17 15:19:35 -08001409void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001410 sp<SurfaceControl> layer1;
1411 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001412 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1413 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1414 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1415 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001416
Marissa Wall861616d2018-10-22 12:52:23 -07001417 switch (layerType) {
1418 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1419 Transaction()
1420 .setAlpha(layer1, 0.25f)
1421 .setAlpha(layer2, 0.75f)
1422 .setPosition(layer2, 16, 0)
1423 .setLayer(layer2, mLayerZBase + 1)
1424 .apply();
1425 break;
1426 case ISurfaceComposerClient::eFXSurfaceBufferState:
1427 Transaction()
1428 .setAlpha(layer1, 0.25f)
1429 .setAlpha(layer2, 0.75f)
1430 .setFrame(layer1, Rect(0, 0, 32, 32))
1431 .setFrame(layer2, Rect(16, 0, 48, 32))
1432 .setLayer(layer2, mLayerZBase + 1)
1433 .apply();
1434 break;
1435 default:
1436 ASSERT_FALSE(true) << "Unsupported layer type";
1437 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001438 {
Alec Mouri80863a62019-01-17 15:19:35 -08001439 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001440 uint8_t r = 16; // 64 * 0.25f
1441 uint8_t g = 48; // 64 * 0.75f
1442 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1443 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1444
1445 r /= 4; // r * (1.0f - 0.75f)
1446 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1447 }
1448}
1449
Alec Mouri80863a62019-01-17 15:19:35 -08001450TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001451 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1452}
1453
Alec Mouri80863a62019-01-17 15:19:35 -08001454TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001455 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1456}
1457
Alec Mouri80863a62019-01-17 15:19:35 -08001458TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001459 const Color color = {64, 0, 0, 255};
1460 sp<SurfaceControl> layer;
1461 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001462 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001463
1464 Transaction().setAlpha(layer, 2.0f).apply();
1465 {
1466 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001467 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001468 }
1469
1470 Transaction().setAlpha(layer, -1.0f).apply();
1471 {
1472 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001473 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001474 }
1475}
1476
Alec Mouri80863a62019-01-17 15:19:35 -08001477TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001478 sp<SurfaceControl> layer;
1479 const uint8_t size = 64;
1480 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001481 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001482 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1483 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1484
1485 Transaction()
1486 .setCornerRadius(layer, cornerRadius)
1487 .apply();
1488 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001489 const uint8_t bottom = size - 1;
1490 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001491 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001492 // Transparent corners
1493 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001494 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1495 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1496 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1497 }
1498}
1499
Alec Mouri80863a62019-01-17 15:19:35 -08001500TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001501 sp<SurfaceControl> parent;
1502 sp<SurfaceControl> child;
1503 const uint8_t size = 64;
1504 const uint8_t testArea = 4;
1505 const float cornerRadius = 20.0f;
1506 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1507 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1508 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1509 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1510
1511 Transaction()
1512 .setCornerRadius(parent, cornerRadius)
1513 .reparent(child, parent->getHandle())
1514 .setPosition(child, 0, size / 2)
1515 .apply();
1516 {
1517 const uint8_t bottom = size - 1;
1518 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001519 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001520 // Top edge of child should not have rounded corners because it's translated in the parent
1521 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1522 Color::GREEN);
1523 // But bottom edges should have been clipped according to parent bounds
1524 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1525 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001526 }
1527}
1528
Alec Mouri80863a62019-01-17 15:19:35 -08001529TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001530 sp<SurfaceControl> bufferLayer;
1531 sp<SurfaceControl> colorLayer;
1532 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001533 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001534 ASSERT_NO_FATAL_FAILURE(colorLayer =
1535 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1536 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001537
Vishnu Nair88a11f22018-11-28 18:30:57 -08001538 Transaction()
1539 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1540 .setLayer(colorLayer, mLayerZBase + 1)
1541 .apply();
1542
Chia-I Wue4ef6102017-11-01 15:16:35 -07001543 {
1544 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001545 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001546 }
1547
1548 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1549 const Color expected = {15, 51, 85, 255};
1550 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1551 // channel) should be less than one
1552 const uint8_t tolerance = 1;
1553 Transaction().setColor(colorLayer, color).apply();
1554 {
1555 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001556 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001557 }
1558}
1559
Valerie Haudd0b7572019-01-29 14:59:27 -08001560// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1561// BLUE: prior background color
1562// GREEN: final background color
1563// BLACK: no color or fill
1564void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1565 bool bufferFill, float alpha,
1566 Color finalColor) {
1567 sp<SurfaceControl> layer;
1568 int32_t width = 500;
1569 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001570
Valerie Haudd0b7572019-01-29 14:59:27 -08001571 Color fillColor = Color::RED;
1572 Color priorBgColor = Color::BLUE;
1573 Color expectedColor = Color::BLACK;
1574 switch (layerType) {
1575 case ISurfaceComposerClient::eFXSurfaceColor:
1576 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1577 Transaction()
1578 .setCrop_legacy(layer, Rect(0, 0, width, height))
1579 .setColor(layer, half3(1.0f, 0, 0))
1580 .apply();
1581 expectedColor = fillColor;
1582 break;
1583 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1584 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1585 if (bufferFill) {
1586 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1587 expectedColor = fillColor;
1588 }
1589 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1590 break;
1591 case ISurfaceComposerClient::eFXSurfaceBufferState:
1592 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1593 if (bufferFill) {
1594 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1595 expectedColor = fillColor;
1596 }
1597 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1598 break;
1599 default:
1600 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1601 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001602 }
1603
Valerie Haudd0b7572019-01-29 14:59:27 -08001604 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1605 Transaction()
1606 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1607 .apply();
1608 if (!bufferFill) {
1609 expectedColor = priorBgColor;
1610 }
1611 }
1612
1613 {
1614 SCOPED_TRACE("default before setting background color layer");
1615 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1616 }
Valerie Haua72e2812019-01-23 13:40:39 -08001617 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001618 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001619 .apply();
1620
1621 {
Valerie Haua72e2812019-01-23 13:40:39 -08001622 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001623 shot->expectColor(Rect(0, 0, width, height), finalColor);
1624 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001625 }
1626}
1627
Valerie Haudd0b7572019-01-29 14:59:27 -08001628TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1629 bool priorColor = false;
1630 bool bufferFill = false;
1631 float alpha = 1.0f;
1632 Color finalColor = Color::RED;
1633 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1634 priorColor, bufferFill, alpha, finalColor));
1635}
Valerie Haua72e2812019-01-23 13:40:39 -08001636
Valerie Haudd0b7572019-01-29 14:59:27 -08001637TEST_P(LayerRenderTypeTransactionTest,
1638 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1639 bool priorColor = false;
1640 bool bufferFill = true;
1641 float alpha = 1.0f;
1642 Color finalColor = Color::RED;
1643 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1644 priorColor, bufferFill, alpha, finalColor));
1645}
Valerie Haua72e2812019-01-23 13:40:39 -08001646
Valerie Haudd0b7572019-01-29 14:59:27 -08001647TEST_P(LayerRenderTypeTransactionTest,
1648 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1649 bool priorColor = false;
1650 bool bufferFill = false;
1651 float alpha = 1.0f;
1652 Color finalColor = Color::GREEN;
1653 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1654 priorColor, bufferFill, alpha, finalColor));
1655}
Valerie Haua72e2812019-01-23 13:40:39 -08001656
Valerie Haudd0b7572019-01-29 14:59:27 -08001657TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1658 bool priorColor = true;
1659 bool bufferFill = true;
1660 float alpha = 1.0f;
1661 Color finalColor = Color::RED;
1662 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1663 priorColor, bufferFill, alpha, finalColor));
1664}
1665
1666TEST_P(LayerRenderTypeTransactionTest,
1667 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1668 bool priorColor = true;
1669 bool bufferFill = false;
1670 float alpha = 1.0f;
1671 Color finalColor = Color::GREEN;
1672 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1673 priorColor, bufferFill, alpha, finalColor));
1674}
1675TEST_P(LayerRenderTypeTransactionTest,
1676 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1677 bool priorColor = false;
1678 bool bufferFill = false;
1679 float alpha = 0;
1680 Color finalColor = Color::BLACK;
1681 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1682 priorColor, bufferFill, alpha, finalColor));
1683}
1684
1685TEST_P(LayerRenderTypeTransactionTest,
1686 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1687 bool priorColor = true;
1688 bool bufferFill = false;
1689 float alpha = 0;
1690 Color finalColor = Color::BLACK;
1691 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1692 priorColor, bufferFill, alpha, finalColor));
1693}
1694
1695TEST_P(LayerRenderTypeTransactionTest,
1696 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1697 bool priorColor = false;
1698 bool bufferFill = true;
1699 float alpha = 1.0f;
1700 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001701 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001702 priorColor, bufferFill, alpha, finalColor));
1703}
1704
1705TEST_P(LayerRenderTypeTransactionTest,
1706 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1707 bool priorColor = false;
1708 bool bufferFill = false;
1709 float alpha = 1.0f;
1710 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001711 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001712 priorColor, bufferFill, alpha, finalColor));
1713}
1714
1715TEST_P(LayerRenderTypeTransactionTest,
1716 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1717 bool priorColor = true;
1718 bool bufferFill = false;
1719 float alpha = 1.0f;
1720 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001721 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001722 priorColor, bufferFill, alpha, finalColor));
1723}
1724
1725TEST_P(LayerRenderTypeTransactionTest,
1726 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1727 bool priorColor = false;
1728 bool bufferFill = false;
1729 float alpha = 0;
1730 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001731 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001732 priorColor, bufferFill, alpha, finalColor));
1733}
1734
1735TEST_P(LayerRenderTypeTransactionTest,
1736 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1737 bool priorColor = true;
1738 bool bufferFill = false;
1739 float alpha = 0;
1740 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001741 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001742 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001743}
1744
Alec Mouri80863a62019-01-17 15:19:35 -08001745TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001746 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001747 ASSERT_NO_FATAL_FAILURE(colorLayer =
1748 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1749 ISurfaceComposerClient::eFXSurfaceColor));
1750 Transaction()
1751 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1752 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1753 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001754
Alec Mouri80863a62019-01-17 15:19:35 -08001755 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001756}
1757
Alec Mouri80863a62019-01-17 15:19:35 -08001758TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001759 sp<SurfaceControl> bufferLayer;
1760 sp<SurfaceControl> colorLayer;
1761 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001762 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001763 ASSERT_NO_FATAL_FAILURE(colorLayer =
1764 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1765 ISurfaceComposerClient::eFXSurfaceColor));
1766 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001767
1768 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1769 const float alpha = 0.25f;
1770 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1771 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1772 // channel) should be less than one
1773 const uint8_t tolerance = 1;
1774 Transaction()
1775 .setColor(colorLayer, color)
1776 .setAlpha(colorLayer, alpha)
1777 .setLayer(colorLayer, mLayerZBase + 1)
1778 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001779 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1780 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001781}
1782
Alec Mouri80863a62019-01-17 15:19:35 -08001783TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001784 sp<SurfaceControl> bufferLayer;
1785 sp<SurfaceControl> parentLayer;
1786 sp<SurfaceControl> colorLayer;
1787 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1788 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001789 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001790 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1791 0 /* buffer height */,
1792 ISurfaceComposerClient::eFXSurfaceColor));
1793 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001794 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1795 const float alpha = 0.25f;
1796 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1797 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1798 // channel) should be less than one
1799 const uint8_t tolerance = 1;
1800 Transaction()
1801 .reparent(colorLayer, parentLayer->getHandle())
1802 .setColor(colorLayer, color)
1803 .setAlpha(parentLayer, alpha)
1804 .setLayer(parentLayer, mLayerZBase + 1)
1805 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001806 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1807 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001808}
1809
Alec Mouri80863a62019-01-17 15:19:35 -08001810TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001811 sp<SurfaceControl> bufferLayer;
1812 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001813 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001814
1815 // color is ignored
1816 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001817 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001818}
1819
Alec Mouri80863a62019-01-17 15:19:35 -08001820TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001821 sp<SurfaceControl> layer;
1822 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001823 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001824
1825 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1826 {
1827 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001828 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001829 }
1830
1831 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1832 {
1833 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001834 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001835 }
1836}
1837
Alec Mouri80863a62019-01-17 15:19:35 -08001838TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001839 sp<SurfaceControl> layer;
1840 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001841 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1842 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001843
1844 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1845 {
1846 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001847 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1848 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001849 }
1850
1851 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1852 {
1853 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001854 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1855 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001856 }
1857
1858 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1859 {
1860 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001861 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1862 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001863 }
1864
1865 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1866 {
1867 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001868 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1869 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001870 }
1871
1872 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1873 {
1874 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001875 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1876 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001877 }
1878}
1879
Alec Mouri80863a62019-01-17 15:19:35 -08001880TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001881 sp<SurfaceControl> layer;
1882 ASSERT_NO_FATAL_FAILURE(
1883 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1884 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1885 Color::BLUE, Color::WHITE));
1886
1887 Transaction()
1888 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1889 .setFrame(layer, Rect(0, 0, 32, 32))
1890 .apply();
1891 {
1892 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001893 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1894 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001895 }
1896
1897 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1898 {
1899 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001900 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1901 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001902 }
1903
1904 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1905 {
1906 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001907 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1908 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001909 }
1910
1911 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1912 {
1913 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001914 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1915 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001916 }
1917
1918 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1919 {
1920 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001921 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1922 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001923 }
1924}
1925
Alec Mouri80863a62019-01-17 15:19:35 -08001926TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001927 sp<SurfaceControl> layer;
1928 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001929 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1930 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001931
1932 const float rot = M_SQRT1_2; // 45 degrees
1933 const float trans = M_SQRT2 * 16.0f;
1934 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1935
Alec Mouri80863a62019-01-17 15:19:35 -08001936 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001937 // check a 8x8 region inside each color
1938 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1939 const int32_t halfL = 4;
1940 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1941 };
1942 const int32_t unit = int32_t(trans / 2);
1943 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1944 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1945 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1946 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1947}
1948
Alec Mouri80863a62019-01-17 15:19:35 -08001949TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001950 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001951 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1952 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001953
1954 // setMatrix is applied after any pending resize, unlike setPosition
1955 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1956 {
1957 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001958 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001959 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001960 shot->expectColor(rect, Color::RED);
1961 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001962 }
1963
Marissa Wall861616d2018-10-22 12:52:23 -07001964 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001965 {
1966 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001967 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001968 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001969 }
1970}
1971
Alec Mouri80863a62019-01-17 15:19:35 -08001972TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001973 sp<SurfaceControl> layer;
1974 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001975 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001976
1977 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1978 Transaction()
1979 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1980 .setSize(layer, 64, 64)
1981 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1982 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001983 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001984}
1985
Alec Mouri80863a62019-01-17 15:19:35 -08001986TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001987 sp<SurfaceControl> layer;
1988 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001989 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1990 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001991
1992 // XXX SCALE_CROP is not respected; calling setSize and
1993 // setOverrideScalingMode in separate transactions does not work
1994 // (b/69315456)
1995 Transaction()
1996 .setSize(layer, 64, 16)
1997 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1998 .apply();
1999 {
2000 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002001 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2002 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002003 }
2004}
2005
Dan Stoza000dd012018-08-01 13:31:52 -07002006TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2007 sp<SurfaceControl> layer;
2008 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2009
2010 sp<IBinder> handle = layer->getHandle();
2011 ASSERT_TRUE(handle != nullptr);
2012
2013 FrameStats frameStats;
2014 mClient->getLayerFrameStats(handle, &frameStats);
2015
2016 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2017}
2018
Alec Mouri80863a62019-01-17 15:19:35 -08002019TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002020 sp<SurfaceControl> layer;
2021 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002022 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002023 const Rect crop(8, 8, 24, 24);
2024
Marissa Wallf58c14b2018-07-24 10:50:43 -07002025 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002026 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002027 shot->expectColor(crop, Color::RED);
2028 shot->expectBorder(crop, Color::BLACK);
2029}
2030
Alec Mouri80863a62019-01-17 15:19:35 -08002031TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002032 sp<SurfaceControl> layer;
2033 ASSERT_NO_FATAL_FAILURE(
2034 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2035 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2036 const Rect crop(8, 8, 24, 24);
2037
2038 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002039 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002040 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2041 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002042}
2043
Alec Mouri80863a62019-01-17 15:19:35 -08002044TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002045 sp<SurfaceControl> layer;
2046 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002047 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002048
2049 {
2050 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002051 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002052 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002053 }
2054
2055 {
2056 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002057 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002058 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002059 }
2060}
2061
Alec Mouri80863a62019-01-17 15:19:35 -08002062TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002063 sp<SurfaceControl> layer;
2064 ASSERT_NO_FATAL_FAILURE(
2065 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2066 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2067
2068 {
2069 SCOPED_TRACE("empty rect");
2070 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002071 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002072 }
2073
2074 {
2075 SCOPED_TRACE("negative rect");
2076 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002077 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002078 }
2079}
2080
Alec Mouri80863a62019-01-17 15:19:35 -08002081TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002082 sp<SurfaceControl> layer;
2083 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002084 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002085
Marissa Wallf58c14b2018-07-24 10:50:43 -07002086 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002087 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002088 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2089 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2090}
2091
Alec Mouri80863a62019-01-17 15:19:35 -08002092TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002093 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002094 ASSERT_NO_FATAL_FAILURE(
2095 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002096 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002097 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002098 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2099 BufferUsage::COMPOSER_OVERLAY,
2100 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002101 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2102 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2103
2104 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002105
2106 Transaction().setBuffer(layer, buffer).apply();
2107
2108 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002109 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002110 {
2111 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002112 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002113 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2114 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002115 }
2116
2117 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002118 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002119 {
2120 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002121 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002122 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2123 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002124 }
2125
2126 // Fully out of buffer space bounds
2127 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2128 {
2129 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002130 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002131 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2132 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2133 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002134 }
2135}
2136
Alec Mouri80863a62019-01-17 15:19:35 -08002137TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002138 sp<SurfaceControl> layer;
2139 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002140 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002141
2142 const Point position(32, 32);
2143 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002144 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002145 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002146 shot->expectColor(crop + position, Color::RED);
2147 shot->expectBorder(crop + position, Color::BLACK);
2148}
2149
Alec Mouri80863a62019-01-17 15:19:35 -08002150TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002151 sp<SurfaceControl> layer;
2152 ASSERT_NO_FATAL_FAILURE(
2153 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2154 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2155
Marissa Wall861616d2018-10-22 12:52:23 -07002156 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002157 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002158 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002159 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002160 shot->expectColor(frame, Color::RED);
2161 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002162}
2163
Alec Mouri80863a62019-01-17 15:19:35 -08002164TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002165 sp<SurfaceControl> layer;
2166 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002167 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002168
Marissa Wall861616d2018-10-22 12:52:23 -07002169 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002170 Transaction()
2171 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002172 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002173 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002174 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002175 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2176 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2177}
2178
Alec Mouri80863a62019-01-17 15:19:35 -08002179TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002180 sp<SurfaceControl> layer;
2181 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002182 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002183
Marissa Wallf58c14b2018-07-24 10:50:43 -07002184 // setCrop_legacy is applied immediately by default, with or without resize pending
2185 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002186 {
2187 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002188 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2190 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2191 }
2192
Marissa Wall61c58622018-07-18 10:12:20 -07002193 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002194 {
2195 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002196 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002197 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2198 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2199 }
2200}
2201
Alec Mouri80863a62019-01-17 15:19:35 -08002202TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002203 sp<SurfaceControl> layer;
2204 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002205 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002206
Marissa Wallf58c14b2018-07-24 10:50:43 -07002207 // request setCrop_legacy to be applied with the next resize
2208 Transaction()
2209 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2210 .setGeometryAppliesWithResize(layer)
2211 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002212 {
2213 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002214 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002215 }
2216
Marissa Wallf58c14b2018-07-24 10:50:43 -07002217 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002218 {
2219 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002220 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002221 }
2222
2223 Transaction().setSize(layer, 16, 16).apply();
2224 {
2225 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002226 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002227 }
2228
2229 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002230 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002231 {
2232 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002233 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002234 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2235 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2236 }
2237}
2238
Alec Mouri80863a62019-01-17 15:19:35 -08002239TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002240 sp<SurfaceControl> layer;
2241 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002242 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002243
Marissa Wallf58c14b2018-07-24 10:50:43 -07002244 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002245 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002246 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002247 .setSize(layer, 16, 16)
2248 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2249 .setGeometryAppliesWithResize(layer)
2250 .apply();
2251 {
2252 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002253 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002254 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2255 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2256 }
2257
2258 // XXX crop is never latched without other geometry change (b/69315677)
2259 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002260 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002261 Transaction().setPosition(layer, 0, 0).apply();
2262 {
2263 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002264 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002265 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2266 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2267 }
2268}
2269
Alec Mouri80863a62019-01-17 15:19:35 -08002270TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002271 sp<SurfaceControl> layer;
2272 ASSERT_NO_FATAL_FAILURE(
2273 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2274 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2275 const Rect frame(8, 8, 24, 24);
2276
2277 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002278 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002279 shot->expectColor(frame, Color::RED);
2280 shot->expectBorder(frame, Color::BLACK);
2281}
2282
Alec Mouri80863a62019-01-17 15:19:35 -08002283TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002284 sp<SurfaceControl> layer;
2285 ASSERT_NO_FATAL_FAILURE(
2286 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2287 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2288
Marissa Wall61c58622018-07-18 10:12:20 -07002289 {
Marissa Wall861616d2018-10-22 12:52:23 -07002290 SCOPED_TRACE("empty rect");
2291 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002292 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002293 }
2294
Marissa Wall61c58622018-07-18 10:12:20 -07002295 {
Marissa Wall861616d2018-10-22 12:52:23 -07002296 SCOPED_TRACE("negative rect");
2297 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002298 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002299 }
2300}
2301
Alec Mouri80863a62019-01-17 15:19:35 -08002302TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002303 sp<SurfaceControl> layer;
2304 ASSERT_NO_FATAL_FAILURE(
2305 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2306 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2307
2308 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002309 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002310 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2311 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002312}
2313
Alec Mouri80863a62019-01-17 15:19:35 -08002314TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002315 sp<SurfaceControl> parent, child;
2316 ASSERT_NO_FATAL_FAILURE(
2317 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2318 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2319 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2320
2321 ASSERT_NO_FATAL_FAILURE(
2322 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2323 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2324
2325 Transaction().reparent(child, parent->getHandle()).apply();
2326
2327 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002328 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002329 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2330 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2331}
2332
Alec Mouri80863a62019-01-17 15:19:35 -08002333TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002334 sp<SurfaceControl> parent, child;
2335 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2336 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2337
2338 ASSERT_NO_FATAL_FAILURE(
2339 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2340 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2341
2342 Transaction().reparent(child, parent->getHandle()).apply();
2343
2344 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002345 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002346 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2347 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2348}
2349
Alec Mouri80863a62019-01-17 15:19:35 -08002350TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002351 sp<SurfaceControl> layer;
2352 ASSERT_NO_FATAL_FAILURE(
2353 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2354 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2355 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2356
2357 std::this_thread::sleep_for(500ms);
2358
2359 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2360
Alec Mouri80863a62019-01-17 15:19:35 -08002361 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002362 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2363 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2364}
2365
Alec Mouri80863a62019-01-17 15:19:35 -08002366TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002367 sp<SurfaceControl> parent, child;
2368 ASSERT_NO_FATAL_FAILURE(
2369 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2370 ASSERT_NO_FATAL_FAILURE(
2371 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2372 Transaction().reparent(child, parent->getHandle()).apply();
2373
2374 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2375 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2376
2377 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2378 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2379
Alec Mouri80863a62019-01-17 15:19:35 -08002380 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002381 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2382 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2383 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2384}
2385
Alec Mouri80863a62019-01-17 15:19:35 -08002386TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002387 sp<SurfaceControl> layer;
2388 ASSERT_NO_FATAL_FAILURE(
2389 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2390
2391 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2392
Alec Mouri80863a62019-01-17 15:19:35 -08002393 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002394 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2395 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002396}
2397
Alec Mouri80863a62019-01-17 15:19:35 -08002398TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002399 sp<SurfaceControl> layer;
2400 ASSERT_NO_FATAL_FAILURE(
2401 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2402
2403 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2404
2405 {
2406 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002407 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002408 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2409 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002410 }
2411
2412 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2413
2414 {
2415 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002416 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002417 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2418 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002419 }
2420
2421 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2422
2423 {
2424 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002425 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002426 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2427 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002428 }
2429}
2430
Alec Mouri80863a62019-01-17 15:19:35 -08002431TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002432 sp<SurfaceControl> layer1;
2433 ASSERT_NO_FATAL_FAILURE(
2434 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2435
2436 sp<SurfaceControl> layer2;
2437 ASSERT_NO_FATAL_FAILURE(
2438 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2439
2440 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2441
Marissa Wall861616d2018-10-22 12:52:23 -07002442 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002443 {
2444 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002445 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002446 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2447 }
2448
2449 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2450
Marissa Wall861616d2018-10-22 12:52:23 -07002451 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002452 {
2453 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002454 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002455 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2456 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2457 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2458 }
2459
2460 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2461 {
2462 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002463 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002464 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2465 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2466 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2467 }
2468
2469 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2470
2471 {
2472 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002473 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002474 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2475 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2476 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2477 }
2478}
2479
Valerie Haua6b15a12019-02-05 14:16:30 -08002480TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002481 sp<SurfaceControl> layer;
2482 ASSERT_NO_FATAL_FAILURE(
2483 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2484
2485 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2486
2487 std::array<sp<GraphicBuffer>, 10> buffers;
2488
2489 size_t idx = 0;
2490 for (auto& buffer : buffers) {
2491 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2492 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2493 BufferUsage::COMPOSER_OVERLAY,
2494 "test");
2495 Color color = colors[idx % colors.size()];
2496 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2497 idx++;
2498 }
2499
2500 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2501 // cache is working.
2502 idx = 0;
2503 for (auto& buffer : buffers) {
2504 for (int i = 0; i < 2; i++) {
2505 Transaction().setBuffer(layer, buffer).apply();
2506
2507 Color color = colors[idx % colors.size()];
2508 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002509 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2510 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002511 }
2512 idx++;
2513 }
2514}
2515
Valerie Haua6b15a12019-02-05 14:16:30 -08002516TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002517 sp<SurfaceControl> layer;
2518 ASSERT_NO_FATAL_FAILURE(
2519 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2520
2521 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2522
2523 std::array<sp<GraphicBuffer>, 70> buffers;
2524
2525 size_t idx = 0;
2526 for (auto& buffer : buffers) {
2527 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2528 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2529 BufferUsage::COMPOSER_OVERLAY,
2530 "test");
2531 Color color = colors[idx % colors.size()];
2532 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2533 idx++;
2534 }
2535
2536 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2537 // cache is working.
2538 idx = 0;
2539 for (auto& buffer : buffers) {
2540 for (int i = 0; i < 2; i++) {
2541 Transaction().setBuffer(layer, buffer).apply();
2542
2543 Color color = colors[idx % colors.size()];
2544 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002545 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2546 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002547 }
2548 idx++;
2549 }
2550}
2551
Valerie Haua6b15a12019-02-05 14:16:30 -08002552TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002553 sp<SurfaceControl> layer;
2554 ASSERT_NO_FATAL_FAILURE(
2555 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2556
2557 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2558
2559 std::array<sp<GraphicBuffer>, 65> buffers;
2560
2561 size_t idx = 0;
2562 for (auto& buffer : buffers) {
2563 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2564 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2565 BufferUsage::COMPOSER_OVERLAY,
2566 "test");
2567 Color color = colors[idx % colors.size()];
2568 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2569 idx++;
2570 }
2571
2572 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2573 // cache is working.
2574 idx = 0;
2575 for (auto& buffer : buffers) {
2576 for (int i = 0; i < 2; i++) {
2577 Transaction().setBuffer(layer, buffer).apply();
2578
2579 Color color = colors[idx % colors.size()];
2580 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002581 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2582 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002583 }
2584 if (idx == 0) {
2585 buffers[0].clear();
2586 }
2587 idx++;
2588 }
2589}
2590
Alec Mouri80863a62019-01-17 15:19:35 -08002591TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002592 sp<SurfaceControl> layer;
2593 ASSERT_NO_FATAL_FAILURE(
2594 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2595
2596 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2597 Color::BLUE, Color::WHITE));
2598
Marissa Wall861616d2018-10-22 12:52:23 -07002599 Transaction()
2600 .setFrame(layer, Rect(0, 0, 32, 32))
2601 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2602 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002603
Alec Mouri80863a62019-01-17 15:19:35 -08002604 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2605 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002606}
2607
Alec Mouri80863a62019-01-17 15:19:35 -08002608TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002609 sp<SurfaceControl> layer;
2610 ASSERT_NO_FATAL_FAILURE(
2611 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2612
2613 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2614 Color::BLUE, Color::WHITE));
2615
Marissa Wall861616d2018-10-22 12:52:23 -07002616 Transaction()
2617 .setFrame(layer, Rect(0, 0, 32, 32))
2618 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2619 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002620
Alec Mouri80863a62019-01-17 15:19:35 -08002621 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2622 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002623}
2624
Alec Mouri80863a62019-01-17 15:19:35 -08002625TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002626 sp<SurfaceControl> layer;
2627 ASSERT_NO_FATAL_FAILURE(
2628 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2629
2630 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2631 Color::BLUE, Color::WHITE));
2632
Marissa Wall861616d2018-10-22 12:52:23 -07002633 Transaction()
2634 .setFrame(layer, Rect(0, 0, 32, 32))
2635 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2636 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002637
Alec Mouri80863a62019-01-17 15:19:35 -08002638 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2639 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002640}
2641
2642TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2643 sp<SurfaceControl> layer;
2644 ASSERT_NO_FATAL_FAILURE(
2645 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2646
2647 Transaction().setTransformToDisplayInverse(layer, false).apply();
2648
2649 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2650
2651 Transaction().setTransformToDisplayInverse(layer, true).apply();
2652}
2653
Alec Mouri80863a62019-01-17 15:19:35 -08002654TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002655 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002656 Transaction transaction;
2657 ASSERT_NO_FATAL_FAILURE(
2658 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2659
2660 sp<GraphicBuffer> buffer =
2661 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2662 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2663 BufferUsage::COMPOSER_OVERLAY,
2664 "test");
2665 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2666
2667 sp<Fence> fence;
2668 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2669 GTEST_SUCCEED() << "test not supported";
2670 return;
2671 }
2672
2673 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2674
2675 status_t status = fence->wait(1000);
2676 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2677 std::this_thread::sleep_for(200ms);
2678
Alec Mouri80863a62019-01-17 15:19:35 -08002679 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002680 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2681 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002682}
2683
Alec Mouri80863a62019-01-17 15:19:35 -08002684TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002685 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002686 ASSERT_NO_FATAL_FAILURE(
2687 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2688
2689 sp<GraphicBuffer> buffer =
2690 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2691 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2692 BufferUsage::COMPOSER_OVERLAY,
2693 "test");
2694 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2695
Marissa Wallfda30bb2018-10-12 11:34:28 -07002696 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002697
2698 Transaction()
2699 .setBuffer(layer, buffer)
2700 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002701 .apply();
2702
Alec Mouri80863a62019-01-17 15:19:35 -08002703 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002704 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2705 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002706}
2707
Alec Mouri80863a62019-01-17 15:19:35 -08002708TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002709 sp<SurfaceControl> layer;
2710 ASSERT_NO_FATAL_FAILURE(
2711 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2712
2713 sp<GraphicBuffer> buffer =
2714 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2715 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2716 BufferUsage::COMPOSER_OVERLAY,
2717 "test");
2718 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2719
2720 Transaction()
2721 .setBuffer(layer, buffer)
2722 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002723 .apply();
2724
Alec Mouri80863a62019-01-17 15:19:35 -08002725 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002726 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2727 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002728}
2729
Alec Mouri80863a62019-01-17 15:19:35 -08002730TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002731 sp<SurfaceControl> layer;
2732 ASSERT_NO_FATAL_FAILURE(
2733 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2734
2735 sp<GraphicBuffer> buffer =
2736 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2737 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2738 BufferUsage::COMPOSER_OVERLAY,
2739 "test");
2740 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2741
2742 HdrMetadata hdrMetadata;
2743 hdrMetadata.validTypes = 0;
2744 Transaction()
2745 .setBuffer(layer, buffer)
2746 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002747 .apply();
2748
Alec Mouri80863a62019-01-17 15:19:35 -08002749 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002750 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2751 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002752}
2753
Alec Mouri80863a62019-01-17 15:19:35 -08002754TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002755 sp<SurfaceControl> layer;
2756 ASSERT_NO_FATAL_FAILURE(
2757 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2758
2759 sp<GraphicBuffer> buffer =
2760 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2761 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2762 BufferUsage::COMPOSER_OVERLAY,
2763 "test");
2764 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2765
2766 Region region;
2767 region.set(32, 32);
2768 Transaction()
2769 .setBuffer(layer, buffer)
2770 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002771 .apply();
2772
Alec Mouri80863a62019-01-17 15:19:35 -08002773 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002774 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2775 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002776}
2777
Alec Mouri80863a62019-01-17 15:19:35 -08002778TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002779 sp<SurfaceControl> layer;
2780 ASSERT_NO_FATAL_FAILURE(
2781 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2782
2783 sp<GraphicBuffer> buffer =
2784 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2785 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2786 BufferUsage::COMPOSER_OVERLAY,
2787 "test");
2788 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2789
2790 Transaction()
2791 .setBuffer(layer, buffer)
2792 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002793 .apply();
2794
Alec Mouri80863a62019-01-17 15:19:35 -08002795 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002796 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2797 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002798}
2799
2800TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2801 sp<SurfaceControl> layer;
2802 ASSERT_NO_FATAL_FAILURE(
2803 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2804
2805 // verify this doesn't cause a crash
2806 Transaction().setSidebandStream(layer, nullptr).apply();
2807}
2808
Robert Carr54cf5b12019-01-25 14:02:28 -08002809TEST_F(LayerTransactionTest, ReparentToSelf) {
2810 sp<SurfaceControl> layer;
2811 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2812 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2813 Transaction().reparent(layer, layer->getHandle()).apply();
2814
2815 {
2816 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2817 // to still be functioning.
2818 SCOPED_TRACE("after reparent to self");
2819 const Rect rect(0, 0, 32, 32);
2820 auto shot = screenshot();
2821 shot->expectColor(rect, Color::RED);
2822 shot->expectBorder(rect, Color::BLACK);
2823 }
2824}
2825
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002826class ColorTransformHelper {
2827public:
2828 static void DegammaColorSingle(half& s) {
2829 if (s <= 0.03928f)
2830 s = s / 12.92f;
2831 else
2832 s = pow((s + 0.055f) / 1.055f, 2.4f);
2833 }
2834
2835 static void DegammaColor(half3& color) {
2836 DegammaColorSingle(color.r);
2837 DegammaColorSingle(color.g);
2838 DegammaColorSingle(color.b);
2839 }
2840
2841 static void GammaColorSingle(half& s) {
2842 if (s <= 0.0031308f) {
2843 s = s * 12.92f;
2844 } else {
2845 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2846 }
2847 }
2848
2849 static void GammaColor(half3& color) {
2850 GammaColorSingle(color.r);
2851 GammaColorSingle(color.g);
2852 GammaColorSingle(color.b);
2853 }
2854
2855 static void applyMatrix(half3& color, const mat3& mat) {
2856 half3 ret = half3(0);
2857
2858 for (int i = 0; i < 3; i++) {
2859 for (int j = 0; j < 3; j++) {
2860 ret[i] = ret[i] + color[j] * mat[j][i];
2861 }
2862 }
2863 color = ret;
2864 }
2865};
2866
Alec Mouri80863a62019-01-17 15:19:35 -08002867TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002868 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002869 ASSERT_NO_FATAL_FAILURE(colorLayer =
2870 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2871 ISurfaceComposerClient::eFXSurfaceColor));
2872 Transaction()
2873 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2874 .setLayer(colorLayer, mLayerZBase + 1)
2875 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002876 {
2877 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002878 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002879 }
2880
2881 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002882 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002883 mat3 matrix;
2884 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2885 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2886 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002887
2888 // degamma before applying the matrix
2889 if (mColorManagementUsed) {
2890 ColorTransformHelper::DegammaColor(expected);
2891 }
2892
2893 ColorTransformHelper::applyMatrix(expected, matrix);
2894
2895 if (mColorManagementUsed) {
2896 ColorTransformHelper::GammaColor(expected);
2897 }
2898
2899 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2900 uint8_t(expected.b * 255), 255};
2901
2902 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2903 // channel) should be less than one
2904 const uint8_t tolerance = 1;
2905
Peiyong Lind3788632018-09-18 16:01:31 -07002906 Transaction().setColor(colorLayer, color)
2907 .setColorTransform(colorLayer, matrix, vec3()).apply();
2908 {
2909 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002910 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002911 }
2912}
2913
Alec Mouri80863a62019-01-17 15:19:35 -08002914TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002915 sp<SurfaceControl> parentLayer;
2916 sp<SurfaceControl> colorLayer;
2917 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2918 0 /* buffer height */,
2919 ISurfaceComposerClient::eFXSurfaceContainer));
2920 ASSERT_NO_FATAL_FAILURE(
2921 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2922 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2923
2924 Transaction()
2925 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2926 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2927 .setLayer(parentLayer, mLayerZBase + 1)
2928 .apply();
2929 {
2930 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002931 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002932 }
2933
2934 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2935 half3 expected = color;
2936 mat3 matrix;
2937 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2938 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2939 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2940
2941 // degamma before applying the matrix
2942 if (mColorManagementUsed) {
2943 ColorTransformHelper::DegammaColor(expected);
2944 }
2945
2946 ColorTransformHelper::applyMatrix(expected, matrix);
2947
2948 if (mColorManagementUsed) {
2949 ColorTransformHelper::GammaColor(expected);
2950 }
2951
2952 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2953 uint8_t(expected.b * 255), 255};
2954
2955 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2956 // channel) should be less than one
2957 const uint8_t tolerance = 1;
2958
2959 Transaction()
2960 .setColor(colorLayer, color)
2961 .setColorTransform(parentLayer, matrix, vec3())
2962 .apply();
2963 {
2964 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002965 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002966 }
2967}
2968
Alec Mouri80863a62019-01-17 15:19:35 -08002969TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002970 sp<SurfaceControl> parentLayer;
2971 sp<SurfaceControl> colorLayer;
2972 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2973 0 /* buffer height */,
2974 ISurfaceComposerClient::eFXSurfaceContainer));
2975 ASSERT_NO_FATAL_FAILURE(
2976 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2977 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2978
2979 Transaction()
2980 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2981 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2982 .setLayer(parentLayer, mLayerZBase + 1)
2983 .apply();
2984 {
2985 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002986 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002987 }
2988
2989 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2990 half3 expected = color;
2991 mat3 matrixChild;
2992 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2993 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2994 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2995 mat3 matrixParent;
2996 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2997 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2998 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
2999
3000 // degamma before applying the matrix
3001 if (mColorManagementUsed) {
3002 ColorTransformHelper::DegammaColor(expected);
3003 }
3004
3005 ColorTransformHelper::applyMatrix(expected, matrixChild);
3006 ColorTransformHelper::applyMatrix(expected, matrixParent);
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
3019 Transaction()
3020 .setColor(colorLayer, color)
3021 .setColorTransform(parentLayer, matrixParent, vec3())
3022 .setColorTransform(colorLayer, matrixChild, vec3())
3023 .apply();
3024 {
3025 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003026 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003027 }
3028}
3029
Marissa Wall80d94ad2019-01-18 16:04:36 -08003030struct CallbackData {
3031 CallbackData() = default;
3032 CallbackData(nsecs_t time, const sp<Fence>& fence,
3033 const std::vector<SurfaceControlStats>& stats)
3034 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3035
3036 nsecs_t latchTime;
3037 sp<Fence> presentFence;
3038 std::vector<SurfaceControlStats> surfaceControlStats;
3039};
3040
Marissa Wallfda30bb2018-10-12 11:34:28 -07003041class ExpectedResult {
3042public:
3043 enum Transaction {
3044 NOT_PRESENTED = 0,
3045 PRESENTED,
3046 };
3047
3048 enum Buffer {
3049 NOT_ACQUIRED = 0,
3050 ACQUIRED,
3051 };
3052
3053 enum PreviousBuffer {
3054 NOT_RELEASED = 0,
3055 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003056 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003057 };
3058
3059 void reset() {
3060 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3061 mExpectedSurfaceResults.clear();
3062 }
3063
3064 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003065 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003066 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3067 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003068 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003069 std::forward_as_tuple(bufferResult, previousBufferResult));
3070 }
3071
3072 void addSurfaces(ExpectedResult::Transaction transactionResult,
3073 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003074 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003075 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3076 for (const auto& layer : layers) {
3077 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3078 }
3079 }
3080
Marissa Wall17b4e452018-12-26 16:32:34 -08003081 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3082 mExpectedPresentTime = expectedPresentTime;
3083 }
3084
Marissa Wall80d94ad2019-01-18 16:04:36 -08003085 void verifyCallbackData(const CallbackData& callbackData) const {
3086 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003087 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3088 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003089 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003090 if (mExpectedPresentTime >= 0) {
3091 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3092 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3093 // if the panel is running at 30 hz, at the worst case, our expected time just
3094 // misses vsync and we have to wait another 33.3ms
3095 ASSERT_LE(presentFence->getSignalTime(),
3096 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3097 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003098 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003099 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003100 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3101 }
3102
Marissa Wall80d94ad2019-01-18 16:04:36 -08003103 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003104 << "wrong number of surfaces";
3105
Marissa Wall80d94ad2019-01-18 16:04:36 -08003106 for (const auto& stats : surfaceControlStats) {
3107 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3108
Marissa Wallfda30bb2018-10-12 11:34:28 -07003109 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3110 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3111 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003112 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003113 }
3114 }
3115
3116private:
3117 class ExpectedSurfaceResult {
3118 public:
3119 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3120 ExpectedResult::PreviousBuffer previousBufferResult)
3121 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3122
Marissa Wall80d94ad2019-01-18 16:04:36 -08003123 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3124 nsecs_t latchTime) const {
3125 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003126
3127 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3128 << "bad acquire time";
3129 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003130
3131 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3132 ASSERT_NE(previousReleaseFence, nullptr)
3133 << "failed to set release prev buffer fence";
3134 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3135 ASSERT_EQ(previousReleaseFence, nullptr)
3136 << "should not have set released prev buffer fence";
3137 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003138 }
3139
3140 private:
3141 ExpectedResult::Buffer mBufferResult;
3142 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3143 };
3144
Marissa Wall80d94ad2019-01-18 16:04:36 -08003145 struct SCHash {
3146 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3147 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003148 }
3149 };
3150 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003151 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003152 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003153};
3154
3155class CallbackHelper {
3156public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003157 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3158 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003159 if (!callbackContext) {
3160 ALOGE("failed to get callback context");
3161 }
3162 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3163 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003164 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003165 helper->mConditionVariable.notify_all();
3166 }
3167
Marissa Wall80d94ad2019-01-18 16:04:36 -08003168 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003169 std::unique_lock lock(mMutex);
3170
Marissa Wall80d94ad2019-01-18 16:04:36 -08003171 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003172 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3173 std::cv_status::timeout)
3174 << "did not receive callback";
3175 }
3176
Marissa Wall80d94ad2019-01-18 16:04:36 -08003177 *outData = std::move(mCallbackDataQueue.front());
3178 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003179 }
3180
3181 void verifyFinalState() {
3182 // Wait to see if there are extra callbacks
3183 std::this_thread::sleep_for(500ms);
3184
3185 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003186 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3187 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003188 }
3189
3190 void* getContext() { return static_cast<void*>(this); }
3191
3192 std::mutex mMutex;
3193 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003194 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003195};
3196
3197class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003198public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003199 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003200 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003201 }
3202
Marissa Wall713b63f2018-10-17 15:42:43 -07003203 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003204 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3205 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003206 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003207 sp<GraphicBuffer> buffer;
3208 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003209 if (setBuffer) {
3210 int err = getBuffer(&buffer, &fence);
3211 if (err != NO_ERROR) {
3212 return err;
3213 }
3214
3215 transaction.setBuffer(layer, buffer);
3216 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003217 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003218
Valerie Hauaa194562019-02-05 16:21:38 -08003219 if (setBackgroundColor) {
3220 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3221 ui::Dataspace::UNKNOWN);
3222 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003223 }
3224
3225 transaction.addTransactionCompletedCallback(callbackHelper->function,
3226 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003227 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003228 }
3229
Marissa Wall861616d2018-10-22 12:52:23 -07003230 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3231 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003232 CallbackData callbackData;
3233 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3234 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003235
3236 if (finalState) {
3237 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3238 }
3239 }
3240
Marissa Wall861616d2018-10-22 12:52:23 -07003241 static void waitForCallbacks(CallbackHelper& helper,
3242 const std::vector<ExpectedResult>& expectedResults,
3243 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003244 for (const auto& expectedResult : expectedResults) {
3245 waitForCallback(helper, expectedResult);
3246 }
3247 if (finalState) {
3248 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3249 }
3250 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003251};
3252
Valerie Hauaa194562019-02-05 16:21:38 -08003253TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003254 sp<SurfaceControl> layer;
3255 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3256
3257 Transaction transaction;
3258 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003259 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003260 if (err) {
3261 GTEST_SUCCEED() << "test not supported";
3262 return;
3263 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003264
3265 transaction.apply();
3266
3267 ExpectedResult expected;
3268 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3269 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3270}
3271
Valerie Hauaa194562019-02-05 16:21:38 -08003272TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003273 sp<SurfaceControl> layer;
3274 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3275
3276 Transaction transaction;
3277 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003278 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003279 if (err) {
3280 GTEST_SUCCEED() << "test not supported";
3281 return;
3282 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003283
Marissa Wall861616d2018-10-22 12:52:23 -07003284 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003285
3286 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003287 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3288 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003289 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3290}
3291
Valerie Hauaa194562019-02-05 16:21:38 -08003292TEST_F(LayerCallbackTest, BufferNoColor) {
3293 sp<SurfaceControl> layer;
3294 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3295
3296 Transaction transaction;
3297 CallbackHelper callback;
3298 int err = fillTransaction(transaction, &callback, layer, true, false);
3299 if (err) {
3300 GTEST_SUCCEED() << "test not supported";
3301 return;
3302 }
3303
3304 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3305
3306 ExpectedResult expected;
3307 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3308 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3309}
3310
3311TEST_F(LayerCallbackTest, NoBufferColor) {
3312 sp<SurfaceControl> layer;
3313 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3314
3315 Transaction transaction;
3316 CallbackHelper callback;
3317 int err = fillTransaction(transaction, &callback, layer, false, true);
3318 if (err) {
3319 GTEST_SUCCEED() << "test not supported";
3320 return;
3321 }
3322
3323 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3324
3325 ExpectedResult expected;
3326 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3327 ExpectedResult::Buffer::NOT_ACQUIRED);
3328 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3329}
3330
Marissa Wallfda30bb2018-10-12 11:34:28 -07003331TEST_F(LayerCallbackTest, NoStateChange) {
3332 Transaction transaction;
3333 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003334 int err = fillTransaction(transaction, &callback);
3335 if (err) {
3336 GTEST_SUCCEED() << "test not supported";
3337 return;
3338 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003339
3340 transaction.apply();
3341
3342 ExpectedResult expected;
3343 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3344}
3345
3346TEST_F(LayerCallbackTest, OffScreen) {
3347 sp<SurfaceControl> layer;
3348 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3349
3350 Transaction transaction;
3351 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003352 int err = fillTransaction(transaction, &callback, layer);
3353 if (err) {
3354 GTEST_SUCCEED() << "test not supported";
3355 return;
3356 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003357
Marissa Wall861616d2018-10-22 12:52:23 -07003358 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003359
3360 ExpectedResult expected;
3361 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3362 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3363}
3364
Valerie Hauaa194562019-02-05 16:21:38 -08003365TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003366 sp<SurfaceControl> layer1, layer2;
3367 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3368 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3369
3370 Transaction transaction1, transaction2;
3371 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003372 int err = fillTransaction(transaction1, &callback1, layer1);
3373 if (err) {
3374 GTEST_SUCCEED() << "test not supported";
3375 return;
3376 }
3377 err = fillTransaction(transaction2, &callback2, layer2);
3378 if (err) {
3379 GTEST_SUCCEED() << "test not supported";
3380 return;
3381 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003382
Marissa Wall861616d2018-10-22 12:52:23 -07003383 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3384 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003385
3386 ExpectedResult expected;
3387 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3388 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3389 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3390}
3391
Valerie Hauaa194562019-02-05 16:21:38 -08003392TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3393 sp<SurfaceControl> layer1, layer2;
3394 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3395 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3396
3397 Transaction transaction1, transaction2;
3398 CallbackHelper callback1, callback2;
3399 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3400 if (err) {
3401 GTEST_SUCCEED() << "test not supported";
3402 return;
3403 }
3404 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3405 if (err) {
3406 GTEST_SUCCEED() << "test not supported";
3407 return;
3408 }
3409
3410 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3411 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3412
3413 ExpectedResult expected;
3414 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3415 ExpectedResult::Buffer::NOT_ACQUIRED);
3416 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3417 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3418}
3419
3420TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3421 sp<SurfaceControl> layer1, layer2;
3422 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3423 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3424
3425 Transaction transaction1, transaction2;
3426 CallbackHelper callback1, callback2;
3427 int err = fillTransaction(transaction1, &callback1, layer1);
3428 if (err) {
3429 GTEST_SUCCEED() << "test not supported";
3430 return;
3431 }
3432 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3433 if (err) {
3434 GTEST_SUCCEED() << "test not supported";
3435 return;
3436 }
3437
3438 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3439 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3440
3441 ExpectedResult expected;
3442 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3443 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3444 ExpectedResult::Buffer::NOT_ACQUIRED);
3445 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3446 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3447}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003448TEST_F(LayerCallbackTest, Merge_SameCallback) {
3449 sp<SurfaceControl> layer1, layer2;
3450 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3451 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3452
3453 Transaction transaction1, transaction2;
3454 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003455 int err = fillTransaction(transaction1, &callback, layer1);
3456 if (err) {
3457 GTEST_SUCCEED() << "test not supported";
3458 return;
3459 }
3460 err = fillTransaction(transaction2, &callback, layer2);
3461 if (err) {
3462 GTEST_SUCCEED() << "test not supported";
3463 return;
3464 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003465
3466 transaction2.merge(std::move(transaction1)).apply();
3467
3468 ExpectedResult expected;
3469 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3470 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3471 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3472}
3473
3474TEST_F(LayerCallbackTest, Merge_SameLayer) {
3475 sp<SurfaceControl> layer;
3476 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3477
3478 Transaction transaction1, transaction2;
3479 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003480 int err = fillTransaction(transaction1, &callback1, layer);
3481 if (err) {
3482 GTEST_SUCCEED() << "test not supported";
3483 return;
3484 }
3485 err = fillTransaction(transaction2, &callback2, layer);
3486 if (err) {
3487 GTEST_SUCCEED() << "test not supported";
3488 return;
3489 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003490
3491 transaction2.merge(std::move(transaction1)).apply();
3492
3493 ExpectedResult expected;
3494 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3495 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3496 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3497}
3498
Marissa Wallfda30bb2018-10-12 11:34:28 -07003499TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3500 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3501 client2(new SurfaceComposerClient);
3502
3503 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3504 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3505
3506 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003507 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003508 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003509 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003510 ISurfaceComposerClient::eFXSurfaceBufferState));
3511
3512 Transaction transaction1, transaction2;
3513 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003514 int err = fillTransaction(transaction1, &callback1, layer1);
3515 if (err) {
3516 GTEST_SUCCEED() << "test not supported";
3517 return;
3518 }
3519 err = fillTransaction(transaction2, &callback2, layer2);
3520 if (err) {
3521 GTEST_SUCCEED() << "test not supported";
3522 return;
3523 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003524
Marissa Wall861616d2018-10-22 12:52:23 -07003525 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3526 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003527
3528 ExpectedResult expected;
3529 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3530 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3531 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3532}
3533
3534TEST_F(LayerCallbackTest, MultipleTransactions) {
3535 sp<SurfaceControl> layer;
3536 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3537
3538 Transaction transaction;
3539 CallbackHelper callback;
3540 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003541 int err = fillTransaction(transaction, &callback, layer);
3542 if (err) {
3543 GTEST_SUCCEED() << "test not supported";
3544 return;
3545 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003546
3547 transaction.apply();
3548
3549 ExpectedResult expected;
3550 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003551 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003552 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3553 : ExpectedResult::PreviousBuffer::RELEASED);
3554 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3555 }
3556 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3557}
3558
3559TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3560 sp<SurfaceControl> layer;
3561 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3562
3563 Transaction transaction;
3564 CallbackHelper callback;
3565 for (size_t i = 0; i < 10; i++) {
3566 ExpectedResult expected;
3567
3568 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003569 int err = fillTransaction(transaction, &callback, layer);
3570 if (err) {
3571 GTEST_SUCCEED() << "test not supported";
3572 return;
3573 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003574 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3575 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003576 int err = fillTransaction(transaction, &callback);
3577 if (err) {
3578 GTEST_SUCCEED() << "test not supported";
3579 return;
3580 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003581 }
3582
3583 transaction.apply();
3584
3585 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3586 }
3587 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3588}
3589
3590TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3591 sp<SurfaceControl> layer;
3592 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3593
3594 Transaction transaction;
3595 CallbackHelper callback;
3596 for (size_t i = 0; i < 10; i++) {
3597 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003598 int err = fillTransaction(transaction, &callback, layer);
3599 if (err) {
3600 GTEST_SUCCEED() << "test not supported";
3601 return;
3602 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003603 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003604 int err = fillTransaction(transaction, &callback);
3605 if (err) {
3606 GTEST_SUCCEED() << "test not supported";
3607 return;
3608 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003609 }
3610
Marissa Wall861616d2018-10-22 12:52:23 -07003611 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003612
3613 ExpectedResult expected;
3614 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3615 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003616 layer,
3617 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3618 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003619 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3620 }
3621 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3622}
3623
3624TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3625 sp<SurfaceControl> layer1, layer2;
3626 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3627 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3628
3629 Transaction transaction1, transaction2;
3630 CallbackHelper callback1, callback2;
3631 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003632 int err = fillTransaction(transaction1, &callback1, layer1);
3633 if (err) {
3634 GTEST_SUCCEED() << "test not supported";
3635 return;
3636 }
3637 err = fillTransaction(transaction2, &callback2, layer2);
3638 if (err) {
3639 GTEST_SUCCEED() << "test not supported";
3640 return;
3641 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003642
Marissa Wall861616d2018-10-22 12:52:23 -07003643 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3644 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003645
3646 ExpectedResult expected;
3647 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003648 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003649 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3650 : ExpectedResult::PreviousBuffer::RELEASED);
3651 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3652 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3653 }
3654 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3655 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3656}
3657
3658TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3659 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3660 client2(new SurfaceComposerClient);
3661 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3662 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3663
3664 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003665 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003666 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003667 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003668 ISurfaceComposerClient::eFXSurfaceBufferState));
3669
3670 Transaction transaction1, transaction2;
3671 CallbackHelper callback1, callback2;
3672 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003673 int err = fillTransaction(transaction1, &callback1, layer1);
3674 if (err) {
3675 GTEST_SUCCEED() << "test not supported";
3676 return;
3677 }
3678 err = fillTransaction(transaction2, &callback2, layer2);
3679 if (err) {
3680 GTEST_SUCCEED() << "test not supported";
3681 return;
3682 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003683
Marissa Wall861616d2018-10-22 12:52:23 -07003684 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3685 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003686
3687 ExpectedResult expected;
3688 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003689 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003690 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3691 : ExpectedResult::PreviousBuffer::RELEASED);
3692 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3693 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3694 }
3695 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3696 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3697}
3698
3699TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3700 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3701 client2(new SurfaceComposerClient);
3702 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3703 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3704
3705 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003706 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003707 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003708 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003709 ISurfaceComposerClient::eFXSurfaceBufferState));
3710
3711 Transaction transaction1, transaction2;
3712 CallbackHelper callback1, callback2;
3713
3714 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003715 int err = fillTransaction(transaction1, &callback1, layer1);
3716 if (err) {
3717 GTEST_SUCCEED() << "test not supported";
3718 return;
3719 }
3720 err = fillTransaction(transaction2, &callback2, layer2);
3721 if (err) {
3722 GTEST_SUCCEED() << "test not supported";
3723 return;
3724 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003725
Marissa Wall861616d2018-10-22 12:52:23 -07003726 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3727 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003728
3729 ExpectedResult expected;
3730 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3731 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3732 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3733 expected.reset();
3734
3735 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003736 err = fillTransaction(transaction1, &callback1);
3737 if (err) {
3738 GTEST_SUCCEED() << "test not supported";
3739 return;
3740 }
3741 err = fillTransaction(transaction2, &callback2);
3742 if (err) {
3743 GTEST_SUCCEED() << "test not supported";
3744 return;
3745 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003746
3747 transaction2.merge(std::move(transaction1)).apply();
3748
3749 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3750 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3751}
3752
3753TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3754 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3755 client2(new SurfaceComposerClient);
3756
3757 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3758 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3759
3760 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003761 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003762 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003763 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003764 ISurfaceComposerClient::eFXSurfaceBufferState));
3765
3766 Transaction transaction1, transaction2;
3767 CallbackHelper callback1, callback2;
3768
3769 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003770 int err = fillTransaction(transaction1, &callback1, layer1);
3771 if (err) {
3772 GTEST_SUCCEED() << "test not supported";
3773 return;
3774 }
3775 err = fillTransaction(transaction2, &callback2, layer2);
3776 if (err) {
3777 GTEST_SUCCEED() << "test not supported";
3778 return;
3779 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003780
Marissa Wall861616d2018-10-22 12:52:23 -07003781 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3782 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003783
3784 ExpectedResult expected;
3785 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3786 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3787 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3788 expected.reset();
3789
3790 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003791 err = fillTransaction(transaction1, &callback1);
3792 if (err) {
3793 GTEST_SUCCEED() << "test not supported";
3794 return;
3795 }
3796 err = fillTransaction(transaction2, &callback2);
3797 if (err) {
3798 GTEST_SUCCEED() << "test not supported";
3799 return;
3800 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003801
Marissa Wall861616d2018-10-22 12:52:23 -07003802 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003803
Marissa Wall713b63f2018-10-17 15:42:43 -07003804 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3805 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003806 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3807 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3808}
3809
3810TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3811 sp<SurfaceControl> layer;
3812 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3813
3814 Transaction transaction;
3815 CallbackHelper callback;
3816 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003817 for (auto& expected : expectedResults) {
3818 expected.reset();
3819 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003820 ExpectedResult::Buffer::ACQUIRED,
3821 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003822
Marissa Wall713b63f2018-10-17 15:42:43 -07003823 int err = fillTransaction(transaction, &callback, layer);
3824 if (err) {
3825 GTEST_SUCCEED() << "test not supported";
3826 return;
3827 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003828
3829 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003830 }
3831 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3832}
3833
3834TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3835 sp<SurfaceControl> layer;
3836 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3837
Marissa Wall713b63f2018-10-17 15:42:43 -07003838 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003839 Transaction transaction;
3840 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003841 int err = fillTransaction(transaction, &callback, layer);
3842 if (err) {
3843 GTEST_SUCCEED() << "test not supported";
3844 return;
3845 }
3846
3847 transaction.apply();
3848
3849 ExpectedResult expected;
3850 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3851 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3852
3853 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003854 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003855 for (auto& expected : expectedResults) {
3856 expected.reset();
3857
Marissa Wall713b63f2018-10-17 15:42:43 -07003858 err = fillTransaction(transaction, &callback);
3859 if (err) {
3860 GTEST_SUCCEED() << "test not supported";
3861 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003862 }
3863
3864 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003865 }
3866 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3867}
3868
3869TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3870 sp<SurfaceControl> layer;
3871 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3872
3873 // Normal call to set up test
3874 Transaction transaction;
3875 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003876 int err = fillTransaction(transaction, &callback, layer);
3877 if (err) {
3878 GTEST_SUCCEED() << "test not supported";
3879 return;
3880 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003881
Marissa Wall861616d2018-10-22 12:52:23 -07003882 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003883
3884 ExpectedResult expectedResult;
3885 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3886 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3887
3888 // Test
3889 std::vector<ExpectedResult> expectedResults(50);
3890 for (auto& expected : expectedResults) {
3891 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003892 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3893 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003894
Marissa Wall713b63f2018-10-17 15:42:43 -07003895 err = fillTransaction(transaction, &callback);
3896 if (err) {
3897 GTEST_SUCCEED() << "test not supported";
3898 return;
3899 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003900
Marissa Wall861616d2018-10-22 12:52:23 -07003901 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003902 }
3903 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3904}
3905
Marissa Wall17b4e452018-12-26 16:32:34 -08003906TEST_F(LayerCallbackTest, DesiredPresentTime) {
3907 sp<SurfaceControl> layer;
3908 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3909
3910 Transaction transaction;
3911 CallbackHelper callback;
3912 int err = fillTransaction(transaction, &callback, layer);
3913 if (err) {
3914 GTEST_SUCCEED() << "test not supported";
3915 return;
3916 }
3917
3918 // Try to present 100ms in the future
3919 nsecs_t time = systemTime() + (100 * 1e6);
3920
3921 transaction.setDesiredPresentTime(time);
3922 transaction.apply();
3923
3924 ExpectedResult expected;
3925 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3926 expected.addExpectedPresentTime(time);
3927 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3928}
3929
3930TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3931 sp<SurfaceControl> layer;
3932 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3933
3934 Transaction transaction;
3935 CallbackHelper callback1;
3936 int err = fillTransaction(transaction, &callback1, layer);
3937 if (err) {
3938 GTEST_SUCCEED() << "test not supported";
3939 return;
3940 }
3941
3942 // Try to present 100ms in the future
3943 nsecs_t time = systemTime() + (100 * 1e6);
3944
3945 transaction.setDesiredPresentTime(time);
3946 transaction.apply();
3947
3948 ExpectedResult expected1;
3949 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3950 expected1.addExpectedPresentTime(time);
3951
3952 CallbackHelper callback2;
3953 err = fillTransaction(transaction, &callback2, layer);
3954 if (err) {
3955 GTEST_SUCCEED() << "test not supported";
3956 return;
3957 }
3958
3959 // Try to present 33ms after the first frame
3960 time += (33.3 * 1e6);
3961
3962 transaction.setDesiredPresentTime(time);
3963 transaction.apply();
3964
3965 ExpectedResult expected2;
3966 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3967 ExpectedResult::Buffer::ACQUIRED,
3968 ExpectedResult::PreviousBuffer::RELEASED);
3969 expected2.addExpectedPresentTime(time);
3970
3971 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3972 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3973}
3974
3975TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3976 sp<SurfaceControl> layer;
3977 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3978
3979 Transaction transaction;
3980 CallbackHelper callback1;
3981 int err = fillTransaction(transaction, &callback1, layer);
3982 if (err) {
3983 GTEST_SUCCEED() << "test not supported";
3984 return;
3985 }
3986
3987 // Try to present 100ms in the future
3988 nsecs_t time = systemTime() + (100 * 1e6);
3989
3990 transaction.setDesiredPresentTime(time);
3991 transaction.apply();
3992
3993 ExpectedResult expected1;
3994 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3995 expected1.addExpectedPresentTime(time);
3996
3997 CallbackHelper callback2;
3998 err = fillTransaction(transaction, &callback2, layer);
3999 if (err) {
4000 GTEST_SUCCEED() << "test not supported";
4001 return;
4002 }
4003
4004 // Try to present 33ms before the previous frame
4005 time -= (33.3 * 1e6);
4006
4007 transaction.setDesiredPresentTime(time);
4008 transaction.apply();
4009
4010 ExpectedResult expected2;
4011 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4012 ExpectedResult::Buffer::ACQUIRED,
4013 ExpectedResult::PreviousBuffer::RELEASED);
4014
4015 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4016 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4017}
4018
4019TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
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 past
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(systemTime());
4040 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4041}
4042
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004043class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004044protected:
4045 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004046 LayerTransactionTest::SetUp();
4047 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004048
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004049 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4050 ASSERT_FALSE(display == nullptr);
4051
Mathias Agopianc666cae2012-07-25 18:56:13 -07004052 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004053 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004054
4055 ssize_t displayWidth = info.w;
4056 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004057
4058 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004059 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4060 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004061 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004062 ASSERT_TRUE(mBGSurfaceControl->isValid());
4063 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4064
4065 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004066 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4067
Peiyong Lin566a3b42018-01-09 18:22:43 -08004068 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004069 ASSERT_TRUE(mFGSurfaceControl->isValid());
4070
4071 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4072
4073 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004074 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004075 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004076 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4077
4078 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4079
Robert Carr4cdc58f2017-08-23 14:22:20 -07004080 asTransaction([&](Transaction& t) {
4081 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004082
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004083 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004084
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004085 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4086 .setPosition(mFGSurfaceControl, 64, 64)
4087 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004088
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004089 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4090 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4091 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004092 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004093 }
4094
4095 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004096 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004097 mBGSurfaceControl = 0;
4098 mFGSurfaceControl = 0;
4099 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004100 }
4101
4102 void waitForPostedBuffers() {
4103 // Since the sync surface is in synchronous mode (i.e. double buffered)
4104 // posting three buffers to it should ensure that at least two
4105 // SurfaceFlinger::handlePageFlip calls have been made, which should
4106 // guaranteed that a buffer posted to another Surface has been retired.
4107 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4108 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4109 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4110 }
4111
Robert Carr4cdc58f2017-08-23 14:22:20 -07004112
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004113 sp<SurfaceControl> mBGSurfaceControl;
4114 sp<SurfaceControl> mFGSurfaceControl;
4115
4116 // This surface is used to ensure that the buffers posted to
4117 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4118 sp<SurfaceControl> mSyncSurfaceControl;
4119};
4120
Robert Carr7f619b22017-11-06 12:56:35 -08004121TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004122
chaviw0e3479f2018-09-10 16:49:30 -07004123 std::unique_ptr<ScreenCapture> sc;
4124
4125 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004126 fillSurfaceRGBA8(relative, 10, 10, 10);
4127 waitForPostedBuffers();
4128
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004129 Transaction{}
4130 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004131 .setPosition(relative, 64, 64)
4132 .apply();
4133
4134 {
4135 // The relative should be on top of the FG control.
4136 ScreenCapture::captureScreen(&sc);
4137 sc->checkPixel(64, 64, 10, 10, 10);
4138 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004139 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004140
4141 {
4142 // Nothing should change at this point.
4143 ScreenCapture::captureScreen(&sc);
4144 sc->checkPixel(64, 64, 10, 10, 10);
4145 }
4146
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004147 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004148
4149 {
4150 // Ensure that the relative was actually hidden, rather than
4151 // being left in the detached but visible state.
4152 ScreenCapture::captureScreen(&sc);
4153 sc->expectFGColor(64, 64);
4154 }
4155}
4156
Robert Carr8d5227b2017-03-16 15:41:03 -07004157class GeometryLatchingTest : public LayerUpdateTest {
4158protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004159 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004160 SCOPED_TRACE(trace);
4161 ScreenCapture::captureScreen(&sc);
4162 // We find the leading edge of the FG surface.
4163 sc->expectFGColor(127, 127);
4164 sc->expectBGColor(128, 128);
4165 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004166
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004167 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004168
4169 void unlockFGBuffer() {
4170 sp<Surface> s = mFGSurfaceControl->getSurface();
4171 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4172 waitForPostedBuffers();
4173 }
4174
Robert Carr8d5227b2017-03-16 15:41:03 -07004175 void completeFGResize() {
4176 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4177 waitForPostedBuffers();
4178 }
4179 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004180 asTransaction([&](Transaction& t) {
4181 t.setSize(mFGSurfaceControl, 64, 64);
4182 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004183 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004184 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004185
4186 EXPECT_INITIAL_STATE("After restoring initial state");
4187 }
chaviw0e3479f2018-09-10 16:49:30 -07004188 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004189};
4190
Robert Carr8d5227b2017-03-16 15:41:03 -07004191class CropLatchingTest : public GeometryLatchingTest {
4192protected:
4193 void EXPECT_CROPPED_STATE(const char* trace) {
4194 SCOPED_TRACE(trace);
4195 ScreenCapture::captureScreen(&sc);
4196 // The edge should be moved back one pixel by our crop.
4197 sc->expectFGColor(126, 126);
4198 sc->expectBGColor(127, 127);
4199 sc->expectBGColor(128, 128);
4200 }
chaviw59f5c562017-06-28 16:39:06 -07004201
4202 void EXPECT_RESIZE_STATE(const char* trace) {
4203 SCOPED_TRACE(trace);
4204 ScreenCapture::captureScreen(&sc);
4205 // The FG is now resized too 128,128 at 64,64
4206 sc->expectFGColor(64, 64);
4207 sc->expectFGColor(191, 191);
4208 sc->expectBGColor(192, 192);
4209 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004210};
4211
Pablo Ceballos05289c22016-04-14 15:49:55 -07004212TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004213 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004214 {
4215 SCOPED_TRACE("before anything");
4216 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004217 sc->expectBGColor(32, 32);
4218 sc->expectFGColor(96, 96);
4219 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004220 }
4221
4222 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004223 asTransaction([&](Transaction& t) {
4224 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004225 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4226 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004227 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004228
Robert Carr4cdc58f2017-08-23 14:22:20 -07004229 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004230 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004231 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4232 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004233 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004234
4235 {
4236 SCOPED_TRACE("before any trigger");
4237 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004238 sc->expectBGColor(32, 32);
4239 sc->expectFGColor(96, 96);
4240 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004241 }
4242
4243 // should trigger the first deferred transaction, but not the second one
4244 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4245 {
4246 SCOPED_TRACE("after first trigger");
4247 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004248 sc->expectBGColor(32, 32);
4249 sc->checkPixel(96, 96, 162, 63, 96);
4250 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004251 }
4252
4253 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004254 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004255
4256 // trigger the second deferred transaction
4257 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4258 {
4259 SCOPED_TRACE("after second trigger");
4260 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004261 sc->expectBGColor(32, 32);
4262 sc->expectBGColor(96, 96);
4263 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004264 }
4265}
4266
Robert Carre392b552017-09-19 12:16:05 -07004267TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004268 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004269
4270 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004271 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4272 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4273 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4274 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004275 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004276 SurfaceComposerClient::Transaction{}
4277 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4278 .show(childNoBuffer)
4279 .show(childBuffer)
4280 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004281 {
4282 ScreenCapture::captureScreen(&sc);
4283 sc->expectChildColor(73, 73);
4284 sc->expectFGColor(74, 74);
4285 }
Vishnu Nair60356342018-11-13 13:00:45 -08004286 SurfaceComposerClient::Transaction{}
4287 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4288 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004289 {
4290 ScreenCapture::captureScreen(&sc);
4291 sc->expectChildColor(73, 73);
4292 sc->expectChildColor(74, 74);
4293 }
4294}
4295
Robert Carr2c5f6d22017-09-26 12:30:35 -07004296TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004297 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004298 {
4299 SCOPED_TRACE("before move");
4300 ScreenCapture::captureScreen(&sc);
4301 sc->expectBGColor(0, 12);
4302 sc->expectFGColor(75, 75);
4303 sc->expectBGColor(145, 145);
4304 }
4305
4306 Transaction t1, t2;
4307 t1.setPosition(mFGSurfaceControl, 128, 128);
4308 t2.setPosition(mFGSurfaceControl, 0, 0);
4309 // We expect that the position update from t2 now
4310 // overwrites the position update from t1.
4311 t1.merge(std::move(t2));
4312 t1.apply();
4313
4314 {
4315 ScreenCapture::captureScreen(&sc);
4316 sc->expectFGColor(1, 1);
4317 }
4318}
4319
Robert Carr1f0a16a2016-10-24 16:27:39 -07004320class ChildLayerTest : public LayerUpdateTest {
4321protected:
4322 void SetUp() override {
4323 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004324 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004325 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004326 fillSurfaceRGBA8(mChild, 200, 200, 200);
4327
4328 {
4329 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004330 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004331 mCapture->expectChildColor(64, 64);
4332 }
4333 }
4334 void TearDown() override {
4335 LayerUpdateTest::TearDown();
4336 mChild = 0;
4337 }
4338
4339 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004340 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004341};
4342
4343TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004344 asTransaction([&](Transaction& t) {
4345 t.show(mChild);
4346 t.setPosition(mChild, 10, 10);
4347 t.setPosition(mFGSurfaceControl, 64, 64);
4348 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004349
4350 {
chaviw0e3479f2018-09-10 16:49:30 -07004351 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004352 // Top left of foreground must now be visible
4353 mCapture->expectFGColor(64, 64);
4354 // But 10 pixels in we should see the child surface
4355 mCapture->expectChildColor(74, 74);
4356 // And 10 more pixels we should be back to the foreground surface
4357 mCapture->expectFGColor(84, 84);
4358 }
4359
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004360 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004361
4362 {
chaviw0e3479f2018-09-10 16:49:30 -07004363 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004364 // Top left of foreground should now be at 0, 0
4365 mCapture->expectFGColor(0, 0);
4366 // But 10 pixels in we should see the child surface
4367 mCapture->expectChildColor(10, 10);
4368 // And 10 more pixels we should be back to the foreground surface
4369 mCapture->expectFGColor(20, 20);
4370 }
4371}
4372
Robert Carr41b08b52017-06-01 16:11:34 -07004373TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004374 asTransaction([&](Transaction& t) {
4375 t.show(mChild);
4376 t.setPosition(mChild, 0, 0);
4377 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004378 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004379 });
Robert Carr41b08b52017-06-01 16:11:34 -07004380
4381 {
chaviw0e3479f2018-09-10 16:49:30 -07004382 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004383 mCapture->expectChildColor(0, 0);
4384 mCapture->expectChildColor(4, 4);
4385 mCapture->expectBGColor(5, 5);
4386 }
4387}
4388
Robert Carr1f0a16a2016-10-24 16:27:39 -07004389TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004390 asTransaction([&](Transaction& t) {
4391 t.show(mChild);
4392 t.setPosition(mFGSurfaceControl, 0, 0);
4393 t.setPosition(mChild, 63, 63);
4394 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004395
4396 {
chaviw0e3479f2018-09-10 16:49:30 -07004397 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004398 mCapture->expectFGColor(0, 0);
4399 // Last pixel in foreground should now be the child.
4400 mCapture->expectChildColor(63, 63);
4401 // But the child should be constrained and the next pixel
4402 // must be the background
4403 mCapture->expectBGColor(64, 64);
4404 }
4405}
4406
4407TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004408 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004409
4410 // Find the boundary between the parent and child
4411 {
chaviw0e3479f2018-09-10 16:49:30 -07004412 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004413 mCapture->expectChildColor(9, 9);
4414 mCapture->expectFGColor(10, 10);
4415 }
4416
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004417 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004418
4419 // The boundary should be twice as far from the origin now.
4420 // The pixels from the last test should all be child now
4421 {
chaviw0e3479f2018-09-10 16:49:30 -07004422 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004423 mCapture->expectChildColor(9, 9);
4424 mCapture->expectChildColor(10, 10);
4425 mCapture->expectChildColor(19, 19);
4426 mCapture->expectFGColor(20, 20);
4427 }
4428}
Robert Carr9524cb32017-02-13 11:32:32 -08004429
Vishnu Nairc652ff82019-03-15 12:48:54 -07004430// A child with a scale transform should be cropped by its parent bounds.
4431TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4432 asTransaction([&](Transaction& t) {
4433 t.setPosition(mFGSurfaceControl, 0, 0);
4434 t.setPosition(mChild, 0, 0);
4435 });
4436
4437 // Find the boundary between the parent and child.
4438 {
4439 mCapture = screenshot();
4440 mCapture->expectChildColor(0, 0);
4441 mCapture->expectChildColor(9, 9);
4442 mCapture->expectFGColor(10, 10);
4443 }
4444
4445 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4446
4447 // The child should fill its parent bounds and be cropped by it.
4448 {
4449 mCapture = screenshot();
4450 mCapture->expectChildColor(0, 0);
4451 mCapture->expectChildColor(63, 63);
4452 mCapture->expectBGColor(64, 64);
4453 }
4454}
4455
Robert Carr6452f122017-03-21 10:41:29 -07004456TEST_F(ChildLayerTest, ChildLayerAlpha) {
4457 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4458 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4459 fillSurfaceRGBA8(mChild, 0, 254, 0);
4460 waitForPostedBuffers();
4461
Robert Carr4cdc58f2017-08-23 14:22:20 -07004462 asTransaction([&](Transaction& t) {
4463 t.show(mChild);
4464 t.setPosition(mChild, 0, 0);
4465 t.setPosition(mFGSurfaceControl, 0, 0);
4466 });
Robert Carr6452f122017-03-21 10:41:29 -07004467
4468 {
chaviw0e3479f2018-09-10 16:49:30 -07004469 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004470 // Unblended child color
4471 mCapture->checkPixel(0, 0, 0, 254, 0);
4472 }
4473
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004474 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004475
4476 {
chaviw0e3479f2018-09-10 16:49:30 -07004477 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004478 // Child and BG blended.
4479 mCapture->checkPixel(0, 0, 127, 127, 0);
4480 }
4481
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004482 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004483
4484 {
chaviw0e3479f2018-09-10 16:49:30 -07004485 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004486 // Child and BG blended.
4487 mCapture->checkPixel(0, 0, 95, 64, 95);
4488 }
4489}
4490
Robert Carr9524cb32017-02-13 11:32:32 -08004491TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004492 asTransaction([&](Transaction& t) {
4493 t.show(mChild);
4494 t.setPosition(mChild, 10, 10);
4495 t.setPosition(mFGSurfaceControl, 64, 64);
4496 });
Robert Carr9524cb32017-02-13 11:32:32 -08004497
4498 {
chaviw0e3479f2018-09-10 16:49:30 -07004499 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004500 // Top left of foreground must now be visible
4501 mCapture->expectFGColor(64, 64);
4502 // But 10 pixels in we should see the child surface
4503 mCapture->expectChildColor(74, 74);
4504 // And 10 more pixels we should be back to the foreground surface
4505 mCapture->expectFGColor(84, 84);
4506 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004507
4508 asTransaction([&](Transaction& t) {
4509 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4510 });
4511
Robert Carr9524cb32017-02-13 11:32:32 -08004512 {
chaviw0e3479f2018-09-10 16:49:30 -07004513 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004514 mCapture->expectFGColor(64, 64);
4515 // In reparenting we should have exposed the entire foreground surface.
4516 mCapture->expectFGColor(74, 74);
4517 // And the child layer should now begin at 10, 10 (since the BG
4518 // layer is at (0, 0)).
4519 mCapture->expectBGColor(9, 9);
4520 mCapture->expectChildColor(10, 10);
4521 }
4522}
4523
Robert Carr2e102c92018-10-23 12:11:15 -07004524TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4525 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004526 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004527 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4528
4529 {
4530 SCOPED_TRACE("Grandchild visible");
4531 ScreenCapture::captureScreen(&mCapture);
4532 mCapture->checkPixel(64, 64, 111, 111, 111);
4533 }
4534
Robert Carr87246532019-02-04 15:20:26 -08004535 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004536
4537 {
4538 SCOPED_TRACE("After destroying child");
4539 ScreenCapture::captureScreen(&mCapture);
4540 mCapture->expectFGColor(64, 64);
4541 }
4542
4543 asTransaction([&](Transaction& t) {
4544 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4545 });
4546
4547 {
4548 SCOPED_TRACE("After reparenting grandchild");
4549 ScreenCapture::captureScreen(&mCapture);
4550 mCapture->checkPixel(64, 64, 111, 111, 111);
4551 }
4552}
4553
chaviw161410b02017-07-27 10:46:08 -07004554TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004555 asTransaction([&](Transaction& t) {
4556 t.show(mChild);
4557 t.setPosition(mChild, 10, 10);
4558 t.setPosition(mFGSurfaceControl, 64, 64);
4559 });
Robert Carr9524cb32017-02-13 11:32:32 -08004560
4561 {
chaviw0e3479f2018-09-10 16:49:30 -07004562 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004563 // Top left of foreground must now be visible
4564 mCapture->expectFGColor(64, 64);
4565 // But 10 pixels in we should see the child surface
4566 mCapture->expectChildColor(74, 74);
4567 // And 10 more pixels we should be back to the foreground surface
4568 mCapture->expectFGColor(84, 84);
4569 }
4570
chaviw0e3479f2018-09-10 16:49:30 -07004571
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004572 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004573
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004574 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004575
chaviw161410b02017-07-27 10:46:08 -07004576 // Since the child has the same client as the parent, it will not get
4577 // detached and will be hidden.
4578 {
chaviw0e3479f2018-09-10 16:49:30 -07004579 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004580 mCapture->expectFGColor(64, 64);
4581 mCapture->expectFGColor(74, 74);
4582 mCapture->expectFGColor(84, 84);
4583 }
4584}
4585
4586TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4587 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004588 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004589 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4590 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004591
chaviw161410b02017-07-27 10:46:08 -07004592 ASSERT_TRUE(mChildNewClient->isValid());
4593
4594 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4595
Robert Carr4cdc58f2017-08-23 14:22:20 -07004596 asTransaction([&](Transaction& t) {
4597 t.hide(mChild);
4598 t.show(mChildNewClient);
4599 t.setPosition(mChildNewClient, 10, 10);
4600 t.setPosition(mFGSurfaceControl, 64, 64);
4601 });
chaviw161410b02017-07-27 10:46:08 -07004602
4603 {
chaviw0e3479f2018-09-10 16:49:30 -07004604 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004605 // Top left of foreground must now be visible
4606 mCapture->expectFGColor(64, 64);
4607 // But 10 pixels in we should see the child surface
4608 mCapture->expectChildColor(74, 74);
4609 // And 10 more pixels we should be back to the foreground surface
4610 mCapture->expectFGColor(84, 84);
4611 }
4612
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004613 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004614
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004615 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004616
Robert Carr9524cb32017-02-13 11:32:32 -08004617 // Nothing should have changed.
4618 {
chaviw0e3479f2018-09-10 16:49:30 -07004619 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004620 mCapture->expectFGColor(64, 64);
4621 mCapture->expectChildColor(74, 74);
4622 mCapture->expectFGColor(84, 84);
4623 }
4624}
4625
chaviw5aedec92018-10-22 10:40:38 -07004626TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4627 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4628 sp<SurfaceControl> childNewClient =
4629 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4630 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4631
4632 ASSERT_TRUE(childNewClient != nullptr);
4633 ASSERT_TRUE(childNewClient->isValid());
4634
4635 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4636
4637 Transaction()
4638 .hide(mChild)
4639 .show(childNewClient)
4640 .setPosition(childNewClient, 10, 10)
4641 .setPosition(mFGSurfaceControl, 64, 64)
4642 .apply();
4643
4644 {
4645 mCapture = screenshot();
4646 // Top left of foreground must now be visible
4647 mCapture->expectFGColor(64, 64);
4648 // But 10 pixels in we should see the child surface
4649 mCapture->expectChildColor(74, 74);
4650 // And 10 more pixels we should be back to the foreground surface
4651 mCapture->expectFGColor(84, 84);
4652 }
4653
4654 Transaction().detachChildren(mFGSurfaceControl).apply();
4655 Transaction().hide(childNewClient).apply();
4656
4657 // Nothing should have changed.
4658 {
4659 mCapture = screenshot();
4660 mCapture->expectFGColor(64, 64);
4661 mCapture->expectChildColor(74, 74);
4662 mCapture->expectFGColor(84, 84);
4663 }
4664
4665 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4666 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4667 32);
4668 Transaction()
4669 .setLayer(newParentSurface, INT32_MAX - 1)
4670 .show(newParentSurface)
4671 .setPosition(newParentSurface, 20, 20)
4672 .reparent(childNewClient, newParentSurface->getHandle())
4673 .apply();
4674 {
4675 mCapture = screenshot();
4676 // Child is now hidden.
4677 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4678 }
4679}
4680
Robert Carr9b429f42017-04-17 14:56:57 -07004681TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004682 asTransaction([&](Transaction& t) {
4683 t.show(mChild);
4684 t.setPosition(mChild, 0, 0);
4685 t.setPosition(mFGSurfaceControl, 0, 0);
4686 });
Robert Carr9b429f42017-04-17 14:56:57 -07004687
4688 {
chaviw0e3479f2018-09-10 16:49:30 -07004689 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004690 // We've positioned the child in the top left.
4691 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004692 // But it's only 10x15.
4693 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004694 }
4695
Robert Carr4cdc58f2017-08-23 14:22:20 -07004696 asTransaction([&](Transaction& t) {
4697 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4698 // We cause scaling by 2.
4699 t.setSize(mFGSurfaceControl, 128, 128);
4700 });
Robert Carr9b429f42017-04-17 14:56:57 -07004701
4702 {
chaviw0e3479f2018-09-10 16:49:30 -07004703 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004704 // We've positioned the child in the top left.
4705 mCapture->expectChildColor(0, 0);
4706 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004707 mCapture->expectChildColor(19, 29);
4708 // And now it should be scaled all the way to 20x30
4709 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004710 }
4711}
4712
Robert Carr1725eee2017-04-26 18:32:15 -07004713// Regression test for b/37673612
4714TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004715 asTransaction([&](Transaction& t) {
4716 t.show(mChild);
4717 t.setPosition(mChild, 0, 0);
4718 t.setPosition(mFGSurfaceControl, 0, 0);
4719 });
Robert Carr1725eee2017-04-26 18:32:15 -07004720
4721 {
chaviw0e3479f2018-09-10 16:49:30 -07004722 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004723 // We've positioned the child in the top left.
4724 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004725 mCapture->expectChildColor(9, 14);
4726 // But it's only 10x15.
4727 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004728 }
Robert Carr1725eee2017-04-26 18:32:15 -07004729 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4730 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004731 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004732 sp<Surface> s = mFGSurfaceControl->getSurface();
4733 auto anw = static_cast<ANativeWindow*>(s.get());
4734 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4735 native_window_set_buffers_dimensions(anw, 64, 128);
4736 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4737 waitForPostedBuffers();
4738
4739 {
4740 // The child should still be in the same place and not have any strange scaling as in
4741 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004742 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004743 mCapture->expectChildColor(0, 0);
4744 mCapture->expectFGColor(10, 10);
4745 }
4746}
4747
Vishnu Nairc652ff82019-03-15 12:48:54 -07004748// A child with a buffer transform from its parents should be cropped by its parent bounds.
4749TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4750 asTransaction([&](Transaction& t) {
4751 t.show(mChild);
4752 t.setPosition(mChild, 0, 0);
4753 t.setPosition(mFGSurfaceControl, 0, 0);
4754 t.setSize(mChild, 100, 100);
4755 });
4756 fillSurfaceRGBA8(mChild, 200, 200, 200);
4757
4758 {
4759 mCapture = screenshot();
4760
4761 mCapture->expectChildColor(0, 0);
4762 mCapture->expectChildColor(63, 63);
4763 mCapture->expectBGColor(64, 64);
4764 }
4765
4766 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4767 sp<Surface> s = mFGSurfaceControl->getSurface();
4768 auto anw = static_cast<ANativeWindow*>(s.get());
4769 // Apply a 90 transform on the buffer.
4770 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4771 native_window_set_buffers_dimensions(anw, 64, 128);
4772 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4773 waitForPostedBuffers();
4774
4775 // The child should be cropped by the new parent bounds.
4776 {
4777 mCapture = screenshot();
4778 mCapture->expectChildColor(0, 0);
4779 mCapture->expectChildColor(99, 63);
4780 mCapture->expectFGColor(100, 63);
4781 mCapture->expectBGColor(128, 64);
4782 }
4783}
4784
4785// A child with a scale transform from its parents should be cropped by its parent bounds.
4786TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4787 asTransaction([&](Transaction& t) {
4788 t.show(mChild);
4789 t.setPosition(mChild, 0, 0);
4790 t.setPosition(mFGSurfaceControl, 0, 0);
4791 t.setSize(mChild, 200, 200);
4792 });
4793 fillSurfaceRGBA8(mChild, 200, 200, 200);
4794
4795 {
4796 mCapture = screenshot();
4797
4798 mCapture->expectChildColor(0, 0);
4799 mCapture->expectChildColor(63, 63);
4800 mCapture->expectBGColor(64, 64);
4801 }
4802
4803 asTransaction([&](Transaction& t) {
4804 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4805 // Set a scaling by 2.
4806 t.setSize(mFGSurfaceControl, 128, 128);
4807 });
4808
4809 // Child should inherit its parents scale but should be cropped by its parent bounds.
4810 {
4811 mCapture = screenshot();
4812 mCapture->expectChildColor(0, 0);
4813 mCapture->expectChildColor(127, 127);
4814 mCapture->expectBGColor(128, 128);
4815 }
4816}
4817
4818// Regression test for b/127368943
4819// Child should ignore the buffer transform but apply parent scale transform.
4820TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
4821 asTransaction([&](Transaction& t) {
4822 t.show(mChild);
4823 t.setPosition(mChild, 0, 0);
4824 t.setPosition(mFGSurfaceControl, 0, 0);
4825 });
4826
4827 {
4828 mCapture = screenshot();
4829 mCapture->expectChildColor(0, 0);
4830 mCapture->expectChildColor(9, 14);
4831 mCapture->expectFGColor(10, 15);
4832 }
4833
4834 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
4835 asTransaction([&](Transaction& t) {
4836 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4837 t.setSize(mFGSurfaceControl, 128, 64);
4838 });
4839 sp<Surface> s = mFGSurfaceControl->getSurface();
4840 auto anw = static_cast<ANativeWindow*>(s.get());
4841 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
4842 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
4843 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4844 native_window_set_buffers_dimensions(anw, 32, 64);
4845 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4846 waitForPostedBuffers();
4847
4848 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
4849 {
4850 mCapture = screenshot();
4851 mCapture->expectChildColor(0, 0);
4852 mCapture->expectChildColor(19, 29);
4853 mCapture->expectFGColor(20, 30);
4854 }
4855}
4856
Dan Stoza412903f2017-04-27 13:42:17 -07004857TEST_F(ChildLayerTest, Bug36858924) {
4858 // Destroy the child layer
4859 mChild.clear();
4860
4861 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004862 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4863 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004864
4865 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004866 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004867 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4868 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004869 t.show(mChild);
4870 });
Dan Stoza412903f2017-04-27 13:42:17 -07004871
4872 // Render the foreground surface a few times
4873 //
4874 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4875 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4876 // never acquire/release the first buffer
4877 ALOGI("Filling 1");
4878 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4879 ALOGI("Filling 2");
4880 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4881 ALOGI("Filling 3");
4882 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4883 ALOGI("Filling 4");
4884 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4885}
4886
chaviwf1961f72017-09-18 16:41:07 -07004887TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004888 asTransaction([&](Transaction& t) {
4889 t.show(mChild);
4890 t.setPosition(mChild, 10, 10);
4891 t.setPosition(mFGSurfaceControl, 64, 64);
4892 });
chaviw06178942017-07-27 10:25:59 -07004893
4894 {
chaviw0e3479f2018-09-10 16:49:30 -07004895 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004896 // Top left of foreground must now be visible
4897 mCapture->expectFGColor(64, 64);
4898 // But 10 pixels in we should see the child surface
4899 mCapture->expectChildColor(74, 74);
4900 // And 10 more pixels we should be back to the foreground surface
4901 mCapture->expectFGColor(84, 84);
4902 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004903
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004904 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004905
chaviw06178942017-07-27 10:25:59 -07004906 {
chaviw0e3479f2018-09-10 16:49:30 -07004907 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004908 mCapture->expectFGColor(64, 64);
4909 // In reparenting we should have exposed the entire foreground surface.
4910 mCapture->expectFGColor(74, 74);
4911 // And the child layer should now begin at 10, 10 (since the BG
4912 // layer is at (0, 0)).
4913 mCapture->expectBGColor(9, 9);
4914 mCapture->expectChildColor(10, 10);
4915 }
4916}
4917
chaviwf1961f72017-09-18 16:41:07 -07004918TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004919 asTransaction([&](Transaction& t) {
4920 t.show(mChild);
4921 t.setPosition(mChild, 10, 10);
4922 t.setPosition(mFGSurfaceControl, 64, 64);
4923 });
chaviwf1961f72017-09-18 16:41:07 -07004924
4925 {
chaviw0e3479f2018-09-10 16:49:30 -07004926 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004927 // Top left of foreground must now be visible
4928 mCapture->expectFGColor(64, 64);
4929 // But 10 pixels in we should see the child surface
4930 mCapture->expectChildColor(74, 74);
4931 // And 10 more pixels we should be back to the foreground surface
4932 mCapture->expectFGColor(84, 84);
4933 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004934 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004935 {
chaviw0e3479f2018-09-10 16:49:30 -07004936 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004937 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004938 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004939 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004940 mCapture->expectFGColor(84, 84);
4941 }
4942}
4943
4944TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004945 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004946 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004947 ASSERT_TRUE(newSurface->isValid());
4948
4949 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004950 asTransaction([&](Transaction& t) {
4951 t.hide(mChild);
4952 t.show(newSurface);
4953 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004954 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004955 t.setPosition(mFGSurfaceControl, 64, 64);
4956 });
chaviwf1961f72017-09-18 16:41:07 -07004957
4958 {
chaviw0e3479f2018-09-10 16:49:30 -07004959 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004960 // Top left of foreground must now be visible
4961 mCapture->expectFGColor(64, 64);
4962 // At 10, 10 we should see the new surface
4963 mCapture->checkPixel(10, 10, 63, 195, 63);
4964 }
4965
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004966 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004967
4968 {
chaviw0e3479f2018-09-10 16:49:30 -07004969 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004970 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4971 // mFGSurface, putting it at 74, 74.
4972 mCapture->expectFGColor(64, 64);
4973 mCapture->checkPixel(74, 74, 63, 195, 63);
4974 mCapture->expectFGColor(84, 84);
4975 }
4976}
4977
chaviwc9674332017-08-28 12:32:18 -07004978TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004979 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4980 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004981 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4982
4983 {
chaviw0e3479f2018-09-10 16:49:30 -07004984 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004985 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4986 // which begins at 64, 64
4987 mCapture->checkPixel(64, 64, 50, 50, 50);
4988 }
4989}
4990
Robert Carr503c7042017-09-27 15:06:08 -07004991TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004992 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004993 fillSurfaceRGBA8(relative, 255, 255, 255);
4994
4995 Transaction t;
4996 t.setLayer(relative, INT32_MAX)
4997 .setRelativeLayer(mChild, relative->getHandle(), 1)
4998 .setPosition(mFGSurfaceControl, 0, 0)
4999 .apply(true);
5000
5001 // We expect that the child should have been elevated above our
5002 // INT_MAX layer even though it's not a child of it.
5003 {
chaviw0e3479f2018-09-10 16:49:30 -07005004 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005005 mCapture->expectChildColor(0, 0);
5006 mCapture->expectChildColor(9, 9);
5007 mCapture->checkPixel(10, 10, 255, 255, 255);
5008 }
5009}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005010
Vishnu Nair60356342018-11-13 13:00:45 -08005011class BoundlessLayerTest : public LayerUpdateTest {
5012protected:
5013 std::unique_ptr<ScreenCapture> mCapture;
5014};
5015
5016// Verify setting a size on a buffer layer has no effect.
5017TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5018 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005019 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5020 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005021 ASSERT_TRUE(bufferLayer->isValid());
5022 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5023 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5024 {
5025 mCapture = screenshot();
5026 // Top left of background must now be visible
5027 mCapture->expectBGColor(0, 0);
5028 // Foreground Surface bounds must be color layer
5029 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5030 // Buffer layer should not extend past buffer bounds
5031 mCapture->expectFGColor(95, 95);
5032 }
5033}
5034
5035// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5036// which will crop the color layer.
5037TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5038 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005039 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5040 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005041 ASSERT_TRUE(colorLayer->isValid());
5042 asTransaction([&](Transaction& t) {
5043 t.setColor(colorLayer, half3{0, 0, 0});
5044 t.show(colorLayer);
5045 });
5046 {
5047 mCapture = screenshot();
5048 // Top left of background must now be visible
5049 mCapture->expectBGColor(0, 0);
5050 // Foreground Surface bounds must be color layer
5051 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5052 // Color layer should not extend past foreground bounds
5053 mCapture->expectBGColor(129, 129);
5054 }
5055}
5056
5057// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5058// a crop which will be used to crop the color layer.
5059TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005060 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5061 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005062 ASSERT_TRUE(cropLayer->isValid());
5063 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005064 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5065 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005066 ASSERT_TRUE(colorLayer->isValid());
5067 asTransaction([&](Transaction& t) {
5068 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5069 t.setColor(colorLayer, half3{0, 0, 0});
5070 t.show(cropLayer);
5071 t.show(colorLayer);
5072 });
5073 {
5074 mCapture = screenshot();
5075 // Top left of background must now be visible
5076 mCapture->expectBGColor(0, 0);
5077 // Top left of foreground must now be visible
5078 mCapture->expectFGColor(64, 64);
5079 // 5 pixels from the foreground we should see the child surface
5080 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5081 // 10 pixels from the foreground we should be back to the foreground surface
5082 mCapture->expectFGColor(74, 74);
5083 }
5084}
5085
5086// Verify for boundless layer with no children, their transforms have no effect.
5087TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5088 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005089 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5090 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005091 ASSERT_TRUE(colorLayer->isValid());
5092 asTransaction([&](Transaction& t) {
5093 t.setPosition(colorLayer, 320, 320);
5094 t.setMatrix(colorLayer, 2, 0, 0, 2);
5095 t.setColor(colorLayer, half3{0, 0, 0});
5096 t.show(colorLayer);
5097 });
5098 {
5099 mCapture = screenshot();
5100 // Top left of background must now be visible
5101 mCapture->expectBGColor(0, 0);
5102 // Foreground Surface bounds must be color layer
5103 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5104 // Color layer should not extend past foreground bounds
5105 mCapture->expectBGColor(129, 129);
5106 }
5107}
5108
5109// Verify for boundless layer with children, their transforms have an effect.
5110TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5111 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005112 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5113 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005114 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5115 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005116 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5117 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005118 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5119 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005120 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5121 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005122 ASSERT_TRUE(colorLayer->isValid());
5123 asTransaction([&](Transaction& t) {
5124 t.setPosition(boundlessLayerRightShift, 32, 0);
5125 t.show(boundlessLayerRightShift);
5126 t.setPosition(boundlessLayerDownShift, 0, 32);
5127 t.show(boundlessLayerDownShift);
5128 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5129 t.setColor(colorLayer, half3{0, 0, 0});
5130 t.show(colorLayer);
5131 });
5132 {
5133 mCapture = screenshot();
5134 // Top left of background must now be visible
5135 mCapture->expectBGColor(0, 0);
5136 // Top left of foreground must now be visible
5137 mCapture->expectFGColor(64, 64);
5138 // Foreground Surface bounds must be color layer
5139 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5140 // Color layer should not extend past foreground bounds
5141 mCapture->expectBGColor(129, 129);
5142 }
5143}
5144
5145// Verify child layers do not get clipped if they temporarily move into the negative
5146// coordinate space as the result of an intermediate transformation.
5147TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5148 sp<SurfaceControl> boundlessLayer =
5149 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5150 0 /* flags */, mFGSurfaceControl.get());
5151 ASSERT_TRUE(boundlessLayer != nullptr);
5152 ASSERT_TRUE(boundlessLayer->isValid());
5153 sp<SurfaceControl> colorLayer =
5154 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5155 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5156 ASSERT_TRUE(colorLayer != nullptr);
5157 ASSERT_TRUE(colorLayer->isValid());
5158 asTransaction([&](Transaction& t) {
5159 // shift child layer off bounds. If this layer was not boundless, we will
5160 // expect the child layer to be cropped.
5161 t.setPosition(boundlessLayer, 32, 32);
5162 t.show(boundlessLayer);
5163 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5164 // undo shift by parent
5165 t.setPosition(colorLayer, -32, -32);
5166 t.setColor(colorLayer, half3{0, 0, 0});
5167 t.show(colorLayer);
5168 });
5169 {
5170 mCapture = screenshot();
5171 // Top left of background must now be visible
5172 mCapture->expectBGColor(0, 0);
5173 // Foreground Surface bounds must be color layer
5174 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5175 // Color layer should not extend past foreground bounds
5176 mCapture->expectBGColor(129, 129);
5177 }
5178}
5179
5180// Verify for boundless root layers with children, their transforms have an effect.
5181TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005182 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5183 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005184 ASSERT_TRUE(rootBoundlessLayer->isValid());
5185 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005186 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5187 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5188
Vishnu Nair60356342018-11-13 13:00:45 -08005189 ASSERT_TRUE(colorLayer->isValid());
5190 asTransaction([&](Transaction& t) {
5191 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5192 t.setPosition(rootBoundlessLayer, 32, 32);
5193 t.show(rootBoundlessLayer);
5194 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5195 t.setColor(colorLayer, half3{0, 0, 0});
5196 t.show(colorLayer);
5197 t.hide(mFGSurfaceControl);
5198 });
5199 {
5200 mCapture = screenshot();
5201 // Top left of background must now be visible
5202 mCapture->expectBGColor(0, 0);
5203 // Top left of foreground must now be visible
5204 mCapture->expectBGColor(31, 31);
5205 // Foreground Surface bounds must be color layer
5206 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5207 // Color layer should not extend past foreground bounds
5208 mCapture->expectBGColor(97, 97);
5209 }
5210}
Robert Carr503c7042017-09-27 15:06:08 -07005211
chaviwa76b2712017-09-20 12:02:26 -07005212class ScreenCaptureTest : public LayerUpdateTest {
5213protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005214 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005215};
5216
5217TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5218 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005219 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005220 mCapture->expectBGColor(0, 0);
5221 // Doesn't capture FG layer which is at 64, 64
5222 mCapture->expectBGColor(64, 64);
5223}
5224
5225TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5226 auto fgHandle = mFGSurfaceControl->getHandle();
5227
Vishnu Nair88a11f22018-11-28 18:30:57 -08005228 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5229 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005230 fillSurfaceRGBA8(child, 200, 200, 200);
5231
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005232 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005233
5234 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005235 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005236 mCapture->expectFGColor(10, 10);
5237 mCapture->expectChildColor(0, 0);
5238}
5239
Robert Carr578038f2018-03-09 12:25:24 -08005240TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5241 auto fgHandle = mFGSurfaceControl->getHandle();
5242
Vishnu Nair88a11f22018-11-28 18:30:57 -08005243 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5244 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005245 fillSurfaceRGBA8(child, 200, 200, 200);
5246
5247 SurfaceComposerClient::Transaction().show(child).apply(true);
5248
5249 // Captures mFGSurfaceControl's child
5250 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5251 mCapture->checkPixel(10, 10, 0, 0, 0);
5252 mCapture->expectChildColor(0, 0);
5253}
5254
Robert Carr866455f2019-04-02 16:28:26 -07005255TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5256 auto fgHandle = mFGSurfaceControl->getHandle();
5257
5258 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5259 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5260 fillSurfaceRGBA8(child, 200, 200, 200);
5261 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5262 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5263 fillSurfaceRGBA8(child2, 200, 0, 200);
5264
5265 SurfaceComposerClient::Transaction()
5266 .show(child)
5267 .show(child2)
5268 .setLayer(child, 1)
5269 .setLayer(child2, 2)
5270 .apply(true);
5271
5272 // Child2 would be visible but its excluded, so we should see child1 color instead.
5273 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5274 mCapture->checkPixel(10, 10, 0, 0, 0);
5275 mCapture->checkPixel(0, 0, 200, 200, 200);
5276}
5277
5278// Like the last test but verifies that children are also exclude.
5279TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5280 auto fgHandle = mFGSurfaceControl->getHandle();
5281
5282 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5283 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5284 fillSurfaceRGBA8(child, 200, 200, 200);
5285 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5286 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5287 fillSurfaceRGBA8(child2, 200, 0, 200);
5288 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5289 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5290 fillSurfaceRGBA8(child2, 200, 0, 200);
5291
5292 SurfaceComposerClient::Transaction()
5293 .show(child)
5294 .show(child2)
5295 .show(child3)
5296 .setLayer(child, 1)
5297 .setLayer(child2, 2)
5298 .apply(true);
5299
5300 // Child2 would be visible but its excluded, so we should see child1 color instead.
5301 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5302 mCapture->checkPixel(10, 10, 0, 0, 0);
5303 mCapture->checkPixel(0, 0, 200, 200, 200);
5304}
5305
chaviw50da5042018-04-09 13:49:37 -07005306TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005307 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5308 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005309
5310 fillSurfaceRGBA8(child, 200, 200, 200);
5311
5312 SurfaceComposerClient::Transaction().show(child).apply(true);
5313
5314 auto childHandle = child->getHandle();
5315
5316 // Captures child
5317 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5318 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5319 // Area outside of child's bounds is transparent.
5320 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5321}
5322
chaviw4b129c22018-04-09 16:19:43 -07005323TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5324 auto fgHandle = mFGSurfaceControl->getHandle();
5325
Vishnu Nair88a11f22018-11-28 18:30:57 -08005326 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5327 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5328 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005329 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005330 fillSurfaceRGBA8(child, 200, 200, 200);
5331 fillSurfaceRGBA8(relative, 100, 100, 100);
5332
5333 SurfaceComposerClient::Transaction()
5334 .show(child)
5335 // Set relative layer above fg layer so should be shown above when computing all layers.
5336 .setRelativeLayer(relative, fgHandle, 1)
5337 .show(relative)
5338 .apply(true);
5339
5340 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5341 ScreenCapture::captureLayers(&mCapture, fgHandle);
5342 mCapture->expectFGColor(10, 10);
5343 mCapture->expectChildColor(0, 0);
5344}
5345
5346TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5347 auto fgHandle = mFGSurfaceControl->getHandle();
5348
Vishnu Nair88a11f22018-11-28 18:30:57 -08005349 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5350 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5351 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5352 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005353 fillSurfaceRGBA8(child, 200, 200, 200);
5354 fillSurfaceRGBA8(relative, 100, 100, 100);
5355
5356 SurfaceComposerClient::Transaction()
5357 .show(child)
5358 // Set relative layer below fg layer but relative to child layer so it should be shown
5359 // above child layer.
5360 .setLayer(relative, -1)
5361 .setRelativeLayer(relative, child->getHandle(), 1)
5362 .show(relative)
5363 .apply(true);
5364
5365 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5366 // relative value should be taken into account, placing it above child layer.
5367 ScreenCapture::captureLayers(&mCapture, fgHandle);
5368 mCapture->expectFGColor(10, 10);
5369 // Relative layer is showing on top of child layer
5370 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5371}
Robert Carr578038f2018-03-09 12:25:24 -08005372
5373// In the following tests we verify successful skipping of a parent layer,
5374// so we use the same verification logic and only change how we mutate
5375// the parent layer to verify that various properties are ignored.
5376class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5377public:
5378 void SetUp() override {
5379 LayerUpdateTest::SetUp();
5380
Vishnu Nair88a11f22018-11-28 18:30:57 -08005381 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5382 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005383 fillSurfaceRGBA8(mChild, 200, 200, 200);
5384
5385 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5386 }
5387
Vishnu Nair333a9572019-02-15 16:05:56 -08005388 void verify(std::function<void()> verifyStartingState) {
5389 // Verify starting state before a screenshot is taken.
5390 verifyStartingState();
5391
5392 // Verify child layer does not inherit any of the properties of its
5393 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005394 auto fgHandle = mFGSurfaceControl->getHandle();
5395 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5396 mCapture->checkPixel(10, 10, 0, 0, 0);
5397 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005398
5399 // Verify all assumptions are still true after the screenshot is taken.
5400 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005401 }
5402
5403 std::unique_ptr<ScreenCapture> mCapture;
5404 sp<SurfaceControl> mChild;
5405};
5406
Vishnu Nair333a9572019-02-15 16:05:56 -08005407// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005408TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5409
5410 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5411
5412 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005413
5414 // Before and after reparenting, verify child is properly hidden
5415 // when rendering full-screen.
5416 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005417}
5418
5419TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005420 SurfaceComposerClient::Transaction()
5421 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5422 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005423
5424 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005425
5426 // Before and after reparenting, verify child is cropped by parent.
5427 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005428}
5429
Vishnu Nair333a9572019-02-15 16:05:56 -08005430// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005431TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005432 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005433
5434 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005435
Vishnu Nair333a9572019-02-15 16:05:56 -08005436 // Before and after reparenting, verify child is properly scaled.
5437 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005438}
5439
5440
chaviwa76b2712017-09-20 12:02:26 -07005441TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5442 auto fgHandle = mFGSurfaceControl->getHandle();
5443
Vishnu Nair88a11f22018-11-28 18:30:57 -08005444 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5445 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005446 fillSurfaceRGBA8(child, 200, 200, 200);
5447
Vishnu Nair88a11f22018-11-28 18:30:57 -08005448 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5449 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005450
5451 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5452 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005453 .show(child)
5454 .setPosition(grandchild, 5, 5)
5455 .show(grandchild)
5456 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005457
5458 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005459 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005460 mCapture->expectFGColor(10, 10);
5461 mCapture->expectChildColor(0, 0);
5462 mCapture->checkPixel(5, 5, 50, 50, 50);
5463}
5464
5465TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005466 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5467 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005468 fillSurfaceRGBA8(child, 200, 200, 200);
5469 auto childHandle = child->getHandle();
5470
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005471 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005472
5473 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005474 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005475 mCapture->expectChildColor(0, 0);
5476 mCapture->expectChildColor(9, 9);
5477}
5478
5479TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005480 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5481 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005482 fillSurfaceRGBA8(child, 200, 200, 200);
5483 auto childHandle = child->getHandle();
5484
Vishnu Nair88a11f22018-11-28 18:30:57 -08005485 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5486 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005487 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5488
5489 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005490 .show(child)
5491 .setPosition(grandchild, 5, 5)
5492 .show(grandchild)
5493 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005494
5495 auto grandchildHandle = grandchild->getHandle();
5496
5497 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005498 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005499 mCapture->checkPixel(0, 0, 50, 50, 50);
5500 mCapture->checkPixel(4, 4, 50, 50, 50);
5501}
5502
chaviw7206d492017-11-10 16:16:12 -08005503TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005504 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005505 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5506 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005507
Marissa Wall61c58622018-07-18 10:12:20 -07005508 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005510
5511 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005512 .setLayer(redLayer, INT32_MAX - 1)
5513 .show(redLayer)
5514 .show(blueLayer)
5515 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005516
5517 auto redLayerHandle = redLayer->getHandle();
5518
5519 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005520 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5521 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5522 // red area below the blue area
5523 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5524 // red area to the right of the blue area
5525 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005526
Marissa Wall861616d2018-10-22 12:52:23 -07005527 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005528 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005529 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5530 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005531 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005532 mCapture->checkPixel(30, 30, 0, 0, 0);
5533}
5534
5535TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005536 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005537 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5538 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005539
Marissa Wall61c58622018-07-18 10:12:20 -07005540 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5541 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005542
5543 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005544 .setLayer(redLayer, INT32_MAX - 1)
5545 .show(redLayer)
5546 .show(blueLayer)
5547 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005548
5549 auto redLayerHandle = redLayer->getHandle();
5550
5551 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005552 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5553 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5554 // red area below the blue area
5555 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5556 // red area to the right of the blue area
5557 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005558
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005559 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005560 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005561 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5562 // red area below the blue area
5563 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5564 // red area to the right of the blue area
5565 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005566 mCapture->checkPixel(30, 30, 0, 0, 0);
5567}
5568
5569TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005570 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005571
Marissa Wall61c58622018-07-18 10:12:20 -07005572 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005573
5574 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005575 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005576 SurfaceComposerClient::Transaction().apply(true);
5577
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005578 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005579
5580 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005581 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5582 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005583}
5584
chaviw8e3fe5d2018-02-22 10:55:42 -08005585
5586class DereferenceSurfaceControlTest : public LayerTransactionTest {
5587protected:
5588 void SetUp() override {
5589 LayerTransactionTest::SetUp();
5590 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005591 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005592 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005593 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005594 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5595 {
5596 SCOPED_TRACE("before anything");
5597 auto shot = screenshot();
5598 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5599 }
5600 }
5601 void TearDown() override {
5602 LayerTransactionTest::TearDown();
5603 bgLayer = 0;
5604 fgLayer = 0;
5605 }
5606
5607 sp<SurfaceControl> bgLayer;
5608 sp<SurfaceControl> fgLayer;
5609};
5610
5611TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5612 fgLayer = nullptr;
5613 {
5614 SCOPED_TRACE("after setting null");
5615 auto shot = screenshot();
5616 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5617 }
5618}
5619
5620TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5621 auto transaction = Transaction().show(fgLayer);
5622 fgLayer = nullptr;
5623 {
5624 SCOPED_TRACE("after setting null");
5625 auto shot = screenshot();
5626 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5627 }
5628}
5629
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005630class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5631protected:
5632 virtual void SetUp() {
5633 LayerTransactionTest::SetUp();
5634 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5635
5636 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5637 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5638
5639 sp<IGraphicBufferConsumer> consumer;
5640 BufferQueue::createBufferQueue(&mProducer, &consumer);
5641 consumer->setConsumerName(String8("Virtual disp consumer"));
5642 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5643 }
5644
5645 virtual void TearDown() {
5646 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5647 LayerTransactionTest::TearDown();
5648 mColorLayer = 0;
5649 }
5650
5651 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5652 mVirtualDisplay =
5653 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5654 asTransaction([&](Transaction& t) {
5655 t.setDisplaySurface(mVirtualDisplay, mProducer);
5656 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5657 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5658 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5659 });
5660 }
5661
5662 void createColorLayer(uint32_t layerStack) {
5663 mColorLayer =
5664 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5665 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5666 ASSERT_TRUE(mColorLayer != nullptr);
5667 ASSERT_TRUE(mColorLayer->isValid());
5668 asTransaction([&](Transaction& t) {
5669 t.setLayerStack(mColorLayer, layerStack);
5670 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5671 t.setLayer(mColorLayer, INT32_MAX - 2);
5672 t.setColor(mColorLayer,
5673 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5674 mExpectedColor.b / 255.0f});
5675 t.show(mColorLayer);
5676 });
5677 }
5678
5679 DisplayInfo mMainDisplayInfo;
5680 sp<IBinder> mMainDisplay;
5681 sp<IBinder> mVirtualDisplay;
5682 sp<IGraphicBufferProducer> mProducer;
5683 sp<SurfaceControl> mColorLayer;
5684 Color mExpectedColor = {63, 63, 195, 255};
5685};
5686
5687TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5688 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5689 createColorLayer(1 /* layerStack */);
5690
5691 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5692
5693 // Verify color layer does not render on main display.
5694 std::unique_ptr<ScreenCapture> sc;
5695 ScreenCapture::captureScreen(&sc, mMainDisplay);
5696 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5697 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5698
5699 // Verify color layer renders correctly on virtual display.
5700 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5701 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5702 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5703}
5704
5705TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5706 // Create a display and set its layer stack to the main display's layer stack so
5707 // the contents of the main display are mirrored on to the virtual display.
5708
5709 // Assumption here is that the new mirrored display has the same viewport as the
5710 // primary display that it is mirroring.
5711 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5712 createColorLayer(0 /* layerStack */);
5713
5714 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5715
5716 // Verify color layer renders correctly on main display and it is mirrored on the
5717 // virtual display.
5718 std::unique_ptr<ScreenCapture> sc;
5719 ScreenCapture::captureScreen(&sc, mMainDisplay);
5720 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5721 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5722
5723 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5724 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5725 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5726}
5727
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005728class DisplayActiveConfigTest : public ::testing::Test {
5729protected:
5730 void SetUp() override {
5731 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5732 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5733 EXPECT_GT(mDisplayconfigs.size(), 0);
5734
5735 // set display power to on to make sure config can be changed
5736 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5737 }
5738
5739 sp<IBinder> mDisplayToken;
5740 Vector<DisplayInfo> mDisplayconfigs;
5741};
5742
5743TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5744 std::vector<int32_t> allowedConfigs;
5745
5746 // Add all configs to the allowed configs
5747 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5748 allowedConfigs.push_back(i);
5749 }
5750
5751 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5752 EXPECT_EQ(res, NO_ERROR);
5753
5754 std::vector<int32_t> outConfigs;
5755 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5756 EXPECT_EQ(res, NO_ERROR);
5757 EXPECT_EQ(allowedConfigs, outConfigs);
5758}
5759
5760TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5761 // we need at least 2 configs available for this test
5762 if (mDisplayconfigs.size() <= 1) return;
5763
5764 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5765
5766 // We want to set the allowed config to everything but the active config
5767 std::vector<int32_t> allowedConfigs;
5768 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5769 if (i != activeConfig) {
5770 allowedConfigs.push_back(i);
5771 }
5772 }
5773
5774 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5775 EXPECT_EQ(res, NO_ERROR);
5776
5777 // Allow some time for the config change
5778 std::this_thread::sleep_for(200ms);
5779
5780 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5781 EXPECT_NE(activeConfig, newActiveConfig);
5782
5783 // Make sure the new config is part of allowed config
5784 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5785 allowedConfigs.end());
5786}
5787
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005788} // namespace android