blob: 62db5ece3803c9c88cec30006f27fb16e647b5ee [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
chaviw32377582019-05-13 11:15:19 -07001059TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) {
1060 sp<SurfaceControl> parent =
1061 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
1062 ISurfaceComposerClient::eFXSurfaceColor);
1063
1064 sp<SurfaceControl> childLayer;
1065 ASSERT_NO_FATAL_FAILURE(
1066 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
1067 0 /* buffer height */,
1068 ISurfaceComposerClient::eFXSurfaceColor,
1069 parent.get()));
1070 Transaction()
1071 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
1072 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
1073 .show(childLayer)
1074 .show(parent)
1075 .setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight))
1076 .setCrop_legacy(childLayer, Rect(0, 0, 20, 30))
1077 .apply();
1078
1079 Transaction()
1080 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1081 .setLayer(childLayer, 1)
1082 .apply();
1083
1084 {
1085 SCOPED_TRACE("setLayer above");
1086 // Set layer should get applied and place the child above.
1087 std::unique_ptr<ScreenCapture> screenshot;
1088 ScreenCapture::captureScreen(&screenshot);
1089 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
1090 }
1091
1092 Transaction()
1093 .setLayer(childLayer, 1)
1094 .setRelativeLayer(childLayer, parent->getHandle(), -1)
1095 .apply();
1096
1097 {
1098 SCOPED_TRACE("setRelative below");
1099 // Set relative layer should get applied and place the child below.
1100 std::unique_ptr<ScreenCapture> screenshot;
1101 ScreenCapture::captureScreen(&screenshot);
1102 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
1103 }
1104}
1105
Alec Mouri80863a62019-01-17 15:19:35 -08001106void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001107 sp<SurfaceControl> layerR;
1108 sp<SurfaceControl> layerG;
1109 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001110 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1111 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1112 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1113 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1114 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1115 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001116
1117 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001118 switch (layerType) {
1119 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1120 Transaction()
1121 .setPosition(layerG, 8, 8)
1122 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1123 .setPosition(layerB, 16, 16)
1124 .setLayer(layerB, mLayerZBase + 2)
1125 .apply();
1126 break;
1127 case ISurfaceComposerClient::eFXSurfaceBufferState:
1128 Transaction()
1129 .setFrame(layerR, Rect(0, 0, 32, 32))
1130 .setFrame(layerG, Rect(8, 8, 40, 40))
1131 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1132 .setFrame(layerB, Rect(16, 16, 48, 48))
1133 .setLayer(layerB, mLayerZBase + 2)
1134 .apply();
1135 break;
1136 default:
1137 ASSERT_FALSE(true) << "Unsupported layer type";
1138 }
1139
Chia-I Wu49313302017-10-31 10:14:40 -07001140 {
1141 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001142 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001143 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1144 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1145 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1146 }
1147
1148 // layerR = 4, layerG = layerR + 3, layerB = 2
1149 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1150 {
1151 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001152 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001153 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1154 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1155 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1156 }
1157
1158 // layerR = 4, layerG = layerR - 3, layerB = 2
1159 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1160 {
1161 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001162 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001163 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1164 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1165 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1166 }
1167
1168 // restore to absolute z
1169 // layerR = 4, layerG = 0, layerB = 2
1170 Transaction().setLayer(layerG, mLayerZBase).apply();
1171 {
1172 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001173 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001174 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1175 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1176 }
1177
1178 // layerR should not affect layerG anymore
1179 // layerR = 1, layerG = 0, layerB = 2
1180 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1181 {
1182 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001183 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001184 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1185 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1186 }
1187}
1188
Alec Mouri80863a62019-01-17 15:19:35 -08001189TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001190 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1191}
1192
Alec Mouri80863a62019-01-17 15:19:35 -08001193TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001194 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1195}
1196
Alec Mouri80863a62019-01-17 15:19:35 -08001197TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001198 sp<SurfaceControl> layerR;
1199 sp<SurfaceControl> layerG;
1200
1201 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001202 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001203 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001204 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001205
1206 Transaction()
1207 .setPosition(layerG, 16, 16)
1208 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1209 .apply();
1210
Robert Carr87246532019-02-04 15:20:26 -08001211 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001212 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001213 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001214}
1215
Alec Mouri80863a62019-01-17 15:19:35 -08001216TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001217 sp<SurfaceControl> layer;
1218 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001219 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001220
1221 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1222 {
1223 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001224 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001225 }
1226
1227 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1228 {
1229 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001230 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001231 }
1232}
1233
Alec Mouri80863a62019-01-17 15:19:35 -08001234TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001235 const Color translucentRed = {100, 0, 0, 100};
1236 sp<SurfaceControl> layerR;
1237 sp<SurfaceControl> layerG;
1238 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001239 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001240 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001241 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001242
1243 Transaction()
1244 .setLayer(layerR, mLayerZBase + 1)
1245 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1246 .apply();
1247 {
1248 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001249 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001250 }
1251
1252 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1253 {
1254 SCOPED_TRACE("layerR translucent");
1255 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001256 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001257 }
1258}
1259
Marissa Wall61c58622018-07-18 10:12:20 -07001260TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001261 sp<SurfaceControl> layer;
1262 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001263 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001264
1265 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001266 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001267 Transaction()
1268 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1269 .apply(true);
1270 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001271 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001272
1273 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1274 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001275 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001276}
1277
Robert Carrfa8855f2019-02-19 10:05:00 -08001278/** RAII Wrapper around get/seteuid */
1279class UIDFaker {
1280 uid_t oldId;
1281public:
1282 UIDFaker(uid_t uid) {
1283 oldId = geteuid();
1284 seteuid(uid);
1285 }
1286 ~UIDFaker() {
1287 seteuid(oldId);
1288 }
1289};
1290
1291TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1292 sp<SurfaceControl> layer;
1293 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1294 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1295
1296 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1297 sp<GraphicBuffer> outBuffer;
1298 Transaction()
1299 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1300 .apply(true);
1301 ASSERT_EQ(PERMISSION_DENIED,
1302 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1303
1304 UIDFaker f(AID_SYSTEM);
1305
1306 // By default the system can capture screenshots with secure layers but they
1307 // will be blacked out
1308 ASSERT_EQ(NO_ERROR,
1309 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1310
1311 {
1312 SCOPED_TRACE("as system");
1313 auto shot = screenshot();
1314 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1315 }
1316
1317 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1318 // to receive them...we are expected to take care with the results.
Robert Carr108b2c72019-04-02 16:32:58 -07001319 bool outCapturedSecureLayers;
Robert Carrfa8855f2019-02-19 10:05:00 -08001320 ASSERT_EQ(NO_ERROR,
Robert Carr108b2c72019-04-02 16:32:58 -07001321 composer->captureScreen(mDisplay, &outBuffer, outCapturedSecureLayers,
1322 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, Rect(), 0,
1323 0, false, ISurfaceComposer::eRotateNone, true));
1324 ASSERT_EQ(true, outCapturedSecureLayers);
Robert Carrfa8855f2019-02-19 10:05:00 -08001325 ScreenCapture sc(outBuffer);
1326 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1327}
1328
Alec Mouri80863a62019-01-17 15:19:35 -08001329TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001330 const Rect top(0, 0, 32, 16);
1331 const Rect bottom(0, 16, 32, 32);
1332 sp<SurfaceControl> layer;
1333 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1334
1335 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001336 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1337 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1338 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001339 // setTransparentRegionHint always applies to the following buffer
1340 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001341 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001342 {
1343 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001344 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001345 shot->expectColor(top, Color::BLACK);
1346 shot->expectColor(bottom, Color::RED);
1347 }
1348
1349 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1350 {
1351 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001352 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001353 shot->expectColor(top, Color::BLACK);
1354 shot->expectColor(bottom, Color::RED);
1355 }
1356
Marissa Wall61c58622018-07-18 10:12:20 -07001357 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1358 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1359 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1360 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001361 {
1362 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001363 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001364 shot->expectColor(top, Color::RED);
1365 shot->expectColor(bottom, Color::BLACK);
1366 }
1367}
1368
Alec Mouri80863a62019-01-17 15:19:35 -08001369TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001370 const Rect top(0, 0, 32, 16);
1371 const Rect bottom(0, 16, 32, 32);
1372 sp<SurfaceControl> layer;
1373 ASSERT_NO_FATAL_FAILURE(
1374 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1375
1376 sp<GraphicBuffer> buffer =
1377 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1378 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1379 BufferUsage::COMPOSER_OVERLAY,
1380 "test");
1381
1382 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1383 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1384 Transaction()
1385 .setTransparentRegionHint(layer, Region(top))
1386 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001387 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001388 .apply();
1389 {
1390 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001391 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001392 shot->expectColor(top, Color::BLACK);
1393 shot->expectColor(bottom, Color::RED);
1394 }
1395
1396 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1397 {
1398 SCOPED_TRACE("transparent region hint intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001399 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001400 shot->expectColor(top, Color::BLACK);
1401 shot->expectColor(bottom, Color::BLACK);
1402 }
1403
1404 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1405 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1406 BufferUsage::COMPOSER_OVERLAY,
1407 "test");
1408
1409 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1410 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001411 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001412 {
1413 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001414 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001415 shot->expectColor(top, Color::RED);
1416 shot->expectColor(bottom, Color::BLACK);
1417 }
1418}
1419
Alec Mouri80863a62019-01-17 15:19:35 -08001420TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001421 sp<SurfaceControl> layerTransparent;
1422 sp<SurfaceControl> layerR;
1423 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1424 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1425
1426 // check that transparent region hint is bound by the layer size
1427 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001428 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001429 .setPosition(layerR, 16, 16)
1430 .setLayer(layerR, mLayerZBase + 1)
1431 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001432 ASSERT_NO_FATAL_FAILURE(
1433 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1434 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001435 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001436}
1437
Alec Mouri80863a62019-01-17 15:19:35 -08001438TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001439 sp<SurfaceControl> layerTransparent;
1440 sp<SurfaceControl> layerR;
1441 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1442 ASSERT_NO_FATAL_FAILURE(
1443 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1444
1445 // check that transparent region hint is bound by the layer size
1446 Transaction()
1447 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1448 .setFrame(layerR, Rect(16, 16, 48, 48))
1449 .setLayer(layerR, mLayerZBase + 1)
1450 .apply();
1451 ASSERT_NO_FATAL_FAILURE(
1452 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1453 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001454 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001455}
1456
Alec Mouri80863a62019-01-17 15:19:35 -08001457void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001458 sp<SurfaceControl> layer1;
1459 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001460 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1461 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1462 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1463 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001464
Marissa Wall861616d2018-10-22 12:52:23 -07001465 switch (layerType) {
1466 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1467 Transaction()
1468 .setAlpha(layer1, 0.25f)
1469 .setAlpha(layer2, 0.75f)
1470 .setPosition(layer2, 16, 0)
1471 .setLayer(layer2, mLayerZBase + 1)
1472 .apply();
1473 break;
1474 case ISurfaceComposerClient::eFXSurfaceBufferState:
1475 Transaction()
1476 .setAlpha(layer1, 0.25f)
1477 .setAlpha(layer2, 0.75f)
1478 .setFrame(layer1, Rect(0, 0, 32, 32))
1479 .setFrame(layer2, Rect(16, 0, 48, 32))
1480 .setLayer(layer2, mLayerZBase + 1)
1481 .apply();
1482 break;
1483 default:
1484 ASSERT_FALSE(true) << "Unsupported layer type";
1485 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001486 {
Alec Mouri80863a62019-01-17 15:19:35 -08001487 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001488 uint8_t r = 16; // 64 * 0.25f
1489 uint8_t g = 48; // 64 * 0.75f
1490 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1491 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1492
1493 r /= 4; // r * (1.0f - 0.75f)
1494 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1495 }
1496}
1497
Alec Mouri80863a62019-01-17 15:19:35 -08001498TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001499 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1500}
1501
Alec Mouri80863a62019-01-17 15:19:35 -08001502TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001503 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1504}
1505
Alec Mouri80863a62019-01-17 15:19:35 -08001506TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001507 const Color color = {64, 0, 0, 255};
1508 sp<SurfaceControl> layer;
1509 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001510 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001511
1512 Transaction().setAlpha(layer, 2.0f).apply();
1513 {
1514 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001515 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001516 }
1517
1518 Transaction().setAlpha(layer, -1.0f).apply();
1519 {
1520 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001521 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001522 }
1523}
1524
Alec Mouri80863a62019-01-17 15:19:35 -08001525TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001526 sp<SurfaceControl> layer;
1527 const uint8_t size = 64;
1528 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001529 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001530 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1531 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1532
1533 Transaction()
1534 .setCornerRadius(layer, cornerRadius)
1535 .apply();
1536 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001537 const uint8_t bottom = size - 1;
1538 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001539 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001540 // Transparent corners
1541 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001542 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1543 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1544 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1545 }
1546}
1547
Alec Mouri80863a62019-01-17 15:19:35 -08001548TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001549 sp<SurfaceControl> parent;
1550 sp<SurfaceControl> child;
1551 const uint8_t size = 64;
1552 const uint8_t testArea = 4;
1553 const float cornerRadius = 20.0f;
1554 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1555 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1556 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1557 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1558
1559 Transaction()
1560 .setCornerRadius(parent, cornerRadius)
1561 .reparent(child, parent->getHandle())
1562 .setPosition(child, 0, size / 2)
1563 .apply();
1564 {
1565 const uint8_t bottom = size - 1;
1566 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001567 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001568 // Top edge of child should not have rounded corners because it's translated in the parent
1569 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1570 Color::GREEN);
1571 // But bottom edges should have been clipped according to parent bounds
1572 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1573 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001574 }
1575}
1576
Alec Mouri80863a62019-01-17 15:19:35 -08001577TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001578 sp<SurfaceControl> bufferLayer;
1579 sp<SurfaceControl> colorLayer;
1580 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001581 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001582 ASSERT_NO_FATAL_FAILURE(colorLayer =
1583 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1584 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001585
Vishnu Nair88a11f22018-11-28 18:30:57 -08001586 Transaction()
1587 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1588 .setLayer(colorLayer, mLayerZBase + 1)
1589 .apply();
1590
Chia-I Wue4ef6102017-11-01 15:16:35 -07001591 {
1592 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001593 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001594 }
1595
1596 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1597 const Color expected = {15, 51, 85, 255};
1598 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1599 // channel) should be less than one
1600 const uint8_t tolerance = 1;
1601 Transaction().setColor(colorLayer, color).apply();
1602 {
1603 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001604 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001605 }
1606}
1607
Valerie Haudd0b7572019-01-29 14:59:27 -08001608// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1609// BLUE: prior background color
1610// GREEN: final background color
1611// BLACK: no color or fill
1612void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1613 bool bufferFill, float alpha,
1614 Color finalColor) {
1615 sp<SurfaceControl> layer;
1616 int32_t width = 500;
1617 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001618
Valerie Haudd0b7572019-01-29 14:59:27 -08001619 Color fillColor = Color::RED;
1620 Color priorBgColor = Color::BLUE;
1621 Color expectedColor = Color::BLACK;
1622 switch (layerType) {
1623 case ISurfaceComposerClient::eFXSurfaceColor:
1624 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1625 Transaction()
1626 .setCrop_legacy(layer, Rect(0, 0, width, height))
1627 .setColor(layer, half3(1.0f, 0, 0))
1628 .apply();
1629 expectedColor = fillColor;
1630 break;
1631 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1632 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1633 if (bufferFill) {
1634 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1635 expectedColor = fillColor;
1636 }
1637 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1638 break;
1639 case ISurfaceComposerClient::eFXSurfaceBufferState:
1640 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1641 if (bufferFill) {
1642 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1643 expectedColor = fillColor;
1644 }
1645 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1646 break;
1647 default:
1648 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1649 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001650 }
1651
Valerie Haudd0b7572019-01-29 14:59:27 -08001652 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1653 Transaction()
1654 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1655 .apply();
1656 if (!bufferFill) {
1657 expectedColor = priorBgColor;
1658 }
1659 }
1660
1661 {
1662 SCOPED_TRACE("default before setting background color layer");
1663 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1664 }
Valerie Haua72e2812019-01-23 13:40:39 -08001665 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001666 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001667 .apply();
1668
1669 {
Valerie Haua72e2812019-01-23 13:40:39 -08001670 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001671 shot->expectColor(Rect(0, 0, width, height), finalColor);
1672 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001673 }
1674}
1675
Valerie Haudd0b7572019-01-29 14:59:27 -08001676TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1677 bool priorColor = false;
1678 bool bufferFill = false;
1679 float alpha = 1.0f;
1680 Color finalColor = Color::RED;
1681 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1682 priorColor, bufferFill, alpha, finalColor));
1683}
Valerie Haua72e2812019-01-23 13:40:39 -08001684
Valerie Haudd0b7572019-01-29 14:59:27 -08001685TEST_P(LayerRenderTypeTransactionTest,
1686 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1687 bool priorColor = false;
1688 bool bufferFill = true;
1689 float alpha = 1.0f;
1690 Color finalColor = Color::RED;
1691 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1692 priorColor, bufferFill, alpha, finalColor));
1693}
Valerie Haua72e2812019-01-23 13:40:39 -08001694
Valerie Haudd0b7572019-01-29 14:59:27 -08001695TEST_P(LayerRenderTypeTransactionTest,
1696 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1697 bool priorColor = false;
1698 bool bufferFill = false;
1699 float alpha = 1.0f;
1700 Color finalColor = Color::GREEN;
1701 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1702 priorColor, bufferFill, alpha, finalColor));
1703}
Valerie Haua72e2812019-01-23 13:40:39 -08001704
Valerie Haudd0b7572019-01-29 14:59:27 -08001705TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1706 bool priorColor = true;
1707 bool bufferFill = true;
1708 float alpha = 1.0f;
1709 Color finalColor = Color::RED;
1710 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1711 priorColor, bufferFill, alpha, finalColor));
1712}
1713
1714TEST_P(LayerRenderTypeTransactionTest,
1715 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1716 bool priorColor = true;
1717 bool bufferFill = false;
1718 float alpha = 1.0f;
1719 Color finalColor = Color::GREEN;
1720 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1721 priorColor, bufferFill, alpha, finalColor));
1722}
1723TEST_P(LayerRenderTypeTransactionTest,
1724 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1725 bool priorColor = false;
1726 bool bufferFill = false;
1727 float alpha = 0;
1728 Color finalColor = Color::BLACK;
1729 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1730 priorColor, bufferFill, alpha, finalColor));
1731}
1732
1733TEST_P(LayerRenderTypeTransactionTest,
1734 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1735 bool priorColor = true;
1736 bool bufferFill = false;
1737 float alpha = 0;
1738 Color finalColor = Color::BLACK;
1739 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1740 priorColor, bufferFill, alpha, finalColor));
1741}
1742
1743TEST_P(LayerRenderTypeTransactionTest,
1744 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1745 bool priorColor = false;
1746 bool bufferFill = true;
1747 float alpha = 1.0f;
1748 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001749 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001750 priorColor, bufferFill, alpha, finalColor));
1751}
1752
1753TEST_P(LayerRenderTypeTransactionTest,
1754 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1755 bool priorColor = false;
1756 bool bufferFill = false;
1757 float alpha = 1.0f;
1758 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001759 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001760 priorColor, bufferFill, alpha, finalColor));
1761}
1762
1763TEST_P(LayerRenderTypeTransactionTest,
1764 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1765 bool priorColor = true;
1766 bool bufferFill = false;
1767 float alpha = 1.0f;
1768 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001769 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001770 priorColor, bufferFill, alpha, finalColor));
1771}
1772
1773TEST_P(LayerRenderTypeTransactionTest,
1774 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1775 bool priorColor = false;
1776 bool bufferFill = false;
1777 float alpha = 0;
1778 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001779 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001780 priorColor, bufferFill, alpha, finalColor));
1781}
1782
1783TEST_P(LayerRenderTypeTransactionTest,
1784 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1785 bool priorColor = true;
1786 bool bufferFill = false;
1787 float alpha = 0;
1788 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001789 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001790 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001791}
1792
Alec Mouri80863a62019-01-17 15:19:35 -08001793TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001794 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001795 ASSERT_NO_FATAL_FAILURE(colorLayer =
1796 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1797 ISurfaceComposerClient::eFXSurfaceColor));
1798 Transaction()
1799 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1800 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1801 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001802
Alec Mouri80863a62019-01-17 15:19:35 -08001803 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001804}
1805
Alec Mouri80863a62019-01-17 15:19:35 -08001806TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001807 sp<SurfaceControl> bufferLayer;
1808 sp<SurfaceControl> colorLayer;
1809 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001810 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001811 ASSERT_NO_FATAL_FAILURE(colorLayer =
1812 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1813 ISurfaceComposerClient::eFXSurfaceColor));
1814 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001815
1816 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1817 const float alpha = 0.25f;
1818 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1819 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1820 // channel) should be less than one
1821 const uint8_t tolerance = 1;
1822 Transaction()
1823 .setColor(colorLayer, color)
1824 .setAlpha(colorLayer, alpha)
1825 .setLayer(colorLayer, mLayerZBase + 1)
1826 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001827 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1828 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001829}
1830
Alec Mouri80863a62019-01-17 15:19:35 -08001831TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001832 sp<SurfaceControl> bufferLayer;
1833 sp<SurfaceControl> parentLayer;
1834 sp<SurfaceControl> colorLayer;
1835 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1836 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001837 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001838 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1839 0 /* buffer height */,
1840 ISurfaceComposerClient::eFXSurfaceColor));
1841 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001842 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1843 const float alpha = 0.25f;
1844 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1845 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1846 // channel) should be less than one
1847 const uint8_t tolerance = 1;
1848 Transaction()
1849 .reparent(colorLayer, parentLayer->getHandle())
1850 .setColor(colorLayer, color)
1851 .setAlpha(parentLayer, alpha)
1852 .setLayer(parentLayer, mLayerZBase + 1)
1853 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001854 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1855 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001856}
1857
Alec Mouri80863a62019-01-17 15:19:35 -08001858TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001859 sp<SurfaceControl> bufferLayer;
1860 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001861 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001862
1863 // color is ignored
1864 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001865 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001866}
1867
Alec Mouri80863a62019-01-17 15:19:35 -08001868TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001869 sp<SurfaceControl> layer;
1870 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001871 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001872
1873 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1874 {
1875 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001876 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001877 }
1878
1879 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1880 {
1881 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001882 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001883 }
1884}
1885
Alec Mouri80863a62019-01-17 15:19:35 -08001886TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001887 sp<SurfaceControl> layer;
1888 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001889 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1890 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001891
1892 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1893 {
1894 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001895 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1896 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001897 }
1898
1899 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1900 {
1901 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001902 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1903 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001904 }
1905
1906 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1907 {
1908 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001909 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1910 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001911 }
1912
1913 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1914 {
1915 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001916 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1917 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001918 }
1919
1920 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1921 {
1922 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001923 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1924 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001925 }
1926}
1927
Alec Mouri80863a62019-01-17 15:19:35 -08001928TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001929 sp<SurfaceControl> layer;
1930 ASSERT_NO_FATAL_FAILURE(
1931 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1932 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1933 Color::BLUE, Color::WHITE));
1934
1935 Transaction()
1936 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1937 .setFrame(layer, Rect(0, 0, 32, 32))
1938 .apply();
1939 {
1940 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001941 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1942 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001943 }
1944
1945 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1946 {
1947 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001948 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1949 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001950 }
1951
1952 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1953 {
1954 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001955 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1956 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001957 }
1958
1959 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1960 {
1961 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001962 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1963 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001964 }
1965
1966 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1967 {
1968 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001969 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1970 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001971 }
1972}
1973
Alec Mouri80863a62019-01-17 15:19:35 -08001974TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001975 sp<SurfaceControl> layer;
1976 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001977 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1978 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001979
1980 const float rot = M_SQRT1_2; // 45 degrees
1981 const float trans = M_SQRT2 * 16.0f;
1982 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1983
Alec Mouri80863a62019-01-17 15:19:35 -08001984 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001985 // check a 8x8 region inside each color
1986 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1987 const int32_t halfL = 4;
1988 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1989 };
1990 const int32_t unit = int32_t(trans / 2);
1991 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1992 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1993 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1994 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1995}
1996
Alec Mouri80863a62019-01-17 15:19:35 -08001997TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001998 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001999 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2000 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002001
2002 // setMatrix is applied after any pending resize, unlike setPosition
2003 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
2004 {
2005 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002006 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002007 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07002008 shot->expectColor(rect, Color::RED);
2009 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002010 }
2011
Marissa Wall861616d2018-10-22 12:52:23 -07002012 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002013 {
2014 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07002015 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08002016 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002017 }
2018}
2019
Alec Mouri80863a62019-01-17 15:19:35 -08002020TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07002021 sp<SurfaceControl> layer;
2022 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002023 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07002024
2025 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
2026 Transaction()
2027 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
2028 .setSize(layer, 64, 64)
2029 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2030 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002031 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07002032}
2033
Alec Mouri80863a62019-01-17 15:19:35 -08002034TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07002035 sp<SurfaceControl> layer;
2036 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07002037 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2038 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07002039
2040 // XXX SCALE_CROP is not respected; calling setSize and
2041 // setOverrideScalingMode in separate transactions does not work
2042 // (b/69315456)
2043 Transaction()
2044 .setSize(layer, 64, 16)
2045 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2046 .apply();
2047 {
2048 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002049 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2050 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002051 }
2052}
2053
Dan Stoza000dd012018-08-01 13:31:52 -07002054TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2055 sp<SurfaceControl> layer;
2056 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2057
2058 sp<IBinder> handle = layer->getHandle();
2059 ASSERT_TRUE(handle != nullptr);
2060
2061 FrameStats frameStats;
2062 mClient->getLayerFrameStats(handle, &frameStats);
2063
2064 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2065}
2066
Alec Mouri80863a62019-01-17 15:19:35 -08002067TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002068 sp<SurfaceControl> layer;
2069 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002070 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002071 const Rect crop(8, 8, 24, 24);
2072
Marissa Wallf58c14b2018-07-24 10:50:43 -07002073 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002074 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002075 shot->expectColor(crop, Color::RED);
2076 shot->expectBorder(crop, Color::BLACK);
2077}
2078
Alec Mouri80863a62019-01-17 15:19:35 -08002079TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002080 sp<SurfaceControl> layer;
2081 ASSERT_NO_FATAL_FAILURE(
2082 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2083 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2084 const Rect crop(8, 8, 24, 24);
2085
2086 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002087 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002088 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2089 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002090}
2091
Alec Mouri80863a62019-01-17 15:19:35 -08002092TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002093 sp<SurfaceControl> layer;
2094 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002095 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002096
2097 {
2098 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002099 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002100 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002101 }
2102
2103 {
2104 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002105 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002106 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002107 }
2108}
2109
Alec Mouri80863a62019-01-17 15:19:35 -08002110TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002111 sp<SurfaceControl> layer;
2112 ASSERT_NO_FATAL_FAILURE(
2113 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2114 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2115
2116 {
2117 SCOPED_TRACE("empty rect");
2118 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002119 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002120 }
2121
2122 {
2123 SCOPED_TRACE("negative rect");
2124 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002125 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002126 }
2127}
2128
Alec Mouri80863a62019-01-17 15:19:35 -08002129TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002130 sp<SurfaceControl> layer;
2131 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002132 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002133
Marissa Wallf58c14b2018-07-24 10:50:43 -07002134 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002135 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002136 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2137 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2138}
2139
Alec Mouri80863a62019-01-17 15:19:35 -08002140TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002141 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002142 ASSERT_NO_FATAL_FAILURE(
2143 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002144 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002145 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002146 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2147 BufferUsage::COMPOSER_OVERLAY,
2148 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002149 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2150 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2151
2152 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002153
2154 Transaction().setBuffer(layer, buffer).apply();
2155
2156 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002157 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002158 {
2159 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002160 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002161 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2162 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002163 }
2164
2165 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002166 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002167 {
2168 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002169 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002170 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2171 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002172 }
2173
2174 // Fully out of buffer space bounds
2175 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2176 {
2177 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002178 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002179 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2180 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2181 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002182 }
2183}
2184
Alec Mouri80863a62019-01-17 15:19:35 -08002185TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002186 sp<SurfaceControl> layer;
2187 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002188 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002189
2190 const Point position(32, 32);
2191 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002192 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002193 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002194 shot->expectColor(crop + position, Color::RED);
2195 shot->expectBorder(crop + position, Color::BLACK);
2196}
2197
Alec Mouri80863a62019-01-17 15:19:35 -08002198TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002199 sp<SurfaceControl> layer;
2200 ASSERT_NO_FATAL_FAILURE(
2201 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2202 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2203
Marissa Wall861616d2018-10-22 12:52:23 -07002204 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002205 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002206 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002207 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002208 shot->expectColor(frame, Color::RED);
2209 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002210}
2211
Alec Mouri80863a62019-01-17 15:19:35 -08002212TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002213 sp<SurfaceControl> layer;
2214 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002215 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002216
Marissa Wall861616d2018-10-22 12:52:23 -07002217 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002218 Transaction()
2219 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002220 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002221 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002222 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002223 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2224 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2225}
2226
Alec Mouri80863a62019-01-17 15:19:35 -08002227TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002228 sp<SurfaceControl> layer;
2229 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002230 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002231
Marissa Wallf58c14b2018-07-24 10:50:43 -07002232 // setCrop_legacy is applied immediately by default, with or without resize pending
2233 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002234 {
2235 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002236 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002237 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2238 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2239 }
2240
Marissa Wall61c58622018-07-18 10:12:20 -07002241 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002242 {
2243 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002244 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002245 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2246 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2247 }
2248}
2249
Alec Mouri80863a62019-01-17 15:19:35 -08002250TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002251 sp<SurfaceControl> layer;
2252 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002253 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002254
Marissa Wallf58c14b2018-07-24 10:50:43 -07002255 // request setCrop_legacy to be applied with the next resize
2256 Transaction()
2257 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2258 .setGeometryAppliesWithResize(layer)
2259 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002260 {
2261 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002262 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002263 }
2264
Marissa Wallf58c14b2018-07-24 10:50:43 -07002265 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002266 {
2267 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002268 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002269 }
2270
2271 Transaction().setSize(layer, 16, 16).apply();
2272 {
2273 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002274 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002275 }
2276
2277 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002278 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002279 {
2280 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002281 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002282 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2283 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2284 }
2285}
2286
Alec Mouri80863a62019-01-17 15:19:35 -08002287TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002288 sp<SurfaceControl> layer;
2289 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002290 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002291
Marissa Wallf58c14b2018-07-24 10:50:43 -07002292 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002293 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002294 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002295 .setSize(layer, 16, 16)
2296 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2297 .setGeometryAppliesWithResize(layer)
2298 .apply();
2299 {
2300 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002301 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002302 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2303 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2304 }
2305
2306 // XXX crop is never latched without other geometry change (b/69315677)
2307 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002308 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002309 Transaction().setPosition(layer, 0, 0).apply();
2310 {
2311 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002312 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002313 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2314 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2315 }
2316}
2317
Alec Mouri80863a62019-01-17 15:19:35 -08002318TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002319 sp<SurfaceControl> layer;
2320 ASSERT_NO_FATAL_FAILURE(
2321 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2322 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2323 const Rect frame(8, 8, 24, 24);
2324
2325 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002326 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002327 shot->expectColor(frame, Color::RED);
2328 shot->expectBorder(frame, Color::BLACK);
2329}
2330
Alec Mouri80863a62019-01-17 15:19:35 -08002331TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002332 sp<SurfaceControl> layer;
2333 ASSERT_NO_FATAL_FAILURE(
2334 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2335 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2336
Marissa Wall61c58622018-07-18 10:12:20 -07002337 {
Marissa Wall861616d2018-10-22 12:52:23 -07002338 SCOPED_TRACE("empty rect");
2339 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002340 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002341 }
2342
Marissa Wall61c58622018-07-18 10:12:20 -07002343 {
Marissa Wall861616d2018-10-22 12:52:23 -07002344 SCOPED_TRACE("negative rect");
2345 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002346 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002347 }
2348}
2349
Alec Mouri80863a62019-01-17 15:19:35 -08002350TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_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, 10, 10));
2355
2356 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002357 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002358 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2359 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002360}
2361
Alec Mouri80863a62019-01-17 15:19:35 -08002362TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002363 sp<SurfaceControl> parent, child;
2364 ASSERT_NO_FATAL_FAILURE(
2365 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2366 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2367 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2368
2369 ASSERT_NO_FATAL_FAILURE(
2370 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2371 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2372
2373 Transaction().reparent(child, parent->getHandle()).apply();
2374
2375 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002376 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002377 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2378 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2379}
2380
Alec Mouri80863a62019-01-17 15:19:35 -08002381TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002382 sp<SurfaceControl> parent, child;
2383 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2384 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2385
2386 ASSERT_NO_FATAL_FAILURE(
2387 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2388 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2389
2390 Transaction().reparent(child, parent->getHandle()).apply();
2391
2392 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002393 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002394 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2395 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2396}
2397
Alec Mouri80863a62019-01-17 15:19:35 -08002398TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002399 sp<SurfaceControl> layer;
2400 ASSERT_NO_FATAL_FAILURE(
2401 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2402 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2403 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2404
2405 std::this_thread::sleep_for(500ms);
2406
2407 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2408
Alec Mouri80863a62019-01-17 15:19:35 -08002409 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002410 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2411 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2412}
2413
Alec Mouri80863a62019-01-17 15:19:35 -08002414TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002415 sp<SurfaceControl> parent, child;
2416 ASSERT_NO_FATAL_FAILURE(
2417 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2418 ASSERT_NO_FATAL_FAILURE(
2419 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2420 Transaction().reparent(child, parent->getHandle()).apply();
2421
2422 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2423 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2424
2425 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2426 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2427
Alec Mouri80863a62019-01-17 15:19:35 -08002428 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002429 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2430 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2431 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2432}
2433
Alec Mouri80863a62019-01-17 15:19:35 -08002434TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002435 sp<SurfaceControl> layer;
2436 ASSERT_NO_FATAL_FAILURE(
2437 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2438
2439 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2440
Alec Mouri80863a62019-01-17 15:19:35 -08002441 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002442 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2443 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002444}
2445
Alec Mouri80863a62019-01-17 15:19:35 -08002446TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002447 sp<SurfaceControl> layer;
2448 ASSERT_NO_FATAL_FAILURE(
2449 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2450
2451 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2452
2453 {
2454 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002455 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002456 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2457 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002458 }
2459
2460 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2461
2462 {
2463 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002464 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002465 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2466 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002467 }
2468
2469 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2470
2471 {
2472 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002473 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002474 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2475 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002476 }
2477}
2478
Alec Mouri80863a62019-01-17 15:19:35 -08002479TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002480 sp<SurfaceControl> layer1;
2481 ASSERT_NO_FATAL_FAILURE(
2482 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2483
2484 sp<SurfaceControl> layer2;
2485 ASSERT_NO_FATAL_FAILURE(
2486 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2487
2488 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2489
Marissa Wall861616d2018-10-22 12:52:23 -07002490 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002491 {
2492 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002493 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002494 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2495 }
2496
2497 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2498
Marissa Wall861616d2018-10-22 12:52:23 -07002499 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002500 {
2501 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002502 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002503 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2504 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2505 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2506 }
2507
2508 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2509 {
2510 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002511 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002512 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2513 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2514 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2515 }
2516
2517 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2518
2519 {
2520 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002521 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002522 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2523 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2524 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2525 }
2526}
2527
Valerie Haua6b15a12019-02-05 14:16:30 -08002528TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002529 sp<SurfaceControl> layer;
2530 ASSERT_NO_FATAL_FAILURE(
2531 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2532
2533 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2534
2535 std::array<sp<GraphicBuffer>, 10> buffers;
2536
2537 size_t idx = 0;
2538 for (auto& buffer : buffers) {
2539 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2540 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2541 BufferUsage::COMPOSER_OVERLAY,
2542 "test");
2543 Color color = colors[idx % colors.size()];
2544 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2545 idx++;
2546 }
2547
2548 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2549 // cache is working.
2550 idx = 0;
2551 for (auto& buffer : buffers) {
2552 for (int i = 0; i < 2; i++) {
2553 Transaction().setBuffer(layer, buffer).apply();
2554
2555 Color color = colors[idx % colors.size()];
2556 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002557 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2558 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002559 }
2560 idx++;
2561 }
2562}
2563
Valerie Haua6b15a12019-02-05 14:16:30 -08002564TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002565 sp<SurfaceControl> layer;
2566 ASSERT_NO_FATAL_FAILURE(
2567 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2568
2569 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2570
2571 std::array<sp<GraphicBuffer>, 70> buffers;
2572
2573 size_t idx = 0;
2574 for (auto& buffer : buffers) {
2575 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2576 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2577 BufferUsage::COMPOSER_OVERLAY,
2578 "test");
2579 Color color = colors[idx % colors.size()];
2580 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2581 idx++;
2582 }
2583
2584 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2585 // cache is working.
2586 idx = 0;
2587 for (auto& buffer : buffers) {
2588 for (int i = 0; i < 2; i++) {
2589 Transaction().setBuffer(layer, buffer).apply();
2590
2591 Color color = colors[idx % colors.size()];
2592 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002593 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2594 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002595 }
2596 idx++;
2597 }
2598}
2599
Valerie Haua6b15a12019-02-05 14:16:30 -08002600TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002601 sp<SurfaceControl> layer;
2602 ASSERT_NO_FATAL_FAILURE(
2603 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2604
2605 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2606
2607 std::array<sp<GraphicBuffer>, 65> buffers;
2608
2609 size_t idx = 0;
2610 for (auto& buffer : buffers) {
2611 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2612 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2613 BufferUsage::COMPOSER_OVERLAY,
2614 "test");
2615 Color color = colors[idx % colors.size()];
2616 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2617 idx++;
2618 }
2619
2620 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2621 // cache is working.
2622 idx = 0;
2623 for (auto& buffer : buffers) {
2624 for (int i = 0; i < 2; i++) {
2625 Transaction().setBuffer(layer, buffer).apply();
2626
2627 Color color = colors[idx % colors.size()];
2628 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002629 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2630 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002631 }
2632 if (idx == 0) {
2633 buffers[0].clear();
2634 }
2635 idx++;
2636 }
2637}
2638
Alec Mouri80863a62019-01-17 15:19:35 -08002639TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002640 sp<SurfaceControl> layer;
2641 ASSERT_NO_FATAL_FAILURE(
2642 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2643
2644 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2645 Color::BLUE, Color::WHITE));
2646
Marissa Wall861616d2018-10-22 12:52:23 -07002647 Transaction()
2648 .setFrame(layer, Rect(0, 0, 32, 32))
2649 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2650 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002651
Alec Mouri80863a62019-01-17 15:19:35 -08002652 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2653 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002654}
2655
Alec Mouri80863a62019-01-17 15:19:35 -08002656TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002657 sp<SurfaceControl> layer;
2658 ASSERT_NO_FATAL_FAILURE(
2659 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2660
2661 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2662 Color::BLUE, Color::WHITE));
2663
Marissa Wall861616d2018-10-22 12:52:23 -07002664 Transaction()
2665 .setFrame(layer, Rect(0, 0, 32, 32))
2666 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2667 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002668
Alec Mouri80863a62019-01-17 15:19:35 -08002669 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2670 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002671}
2672
Alec Mouri80863a62019-01-17 15:19:35 -08002673TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002674 sp<SurfaceControl> layer;
2675 ASSERT_NO_FATAL_FAILURE(
2676 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2677
2678 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2679 Color::BLUE, Color::WHITE));
2680
Marissa Wall861616d2018-10-22 12:52:23 -07002681 Transaction()
2682 .setFrame(layer, Rect(0, 0, 32, 32))
2683 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2684 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002685
Alec Mouri80863a62019-01-17 15:19:35 -08002686 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2687 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002688}
2689
2690TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2691 sp<SurfaceControl> layer;
2692 ASSERT_NO_FATAL_FAILURE(
2693 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2694
2695 Transaction().setTransformToDisplayInverse(layer, false).apply();
2696
2697 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2698
2699 Transaction().setTransformToDisplayInverse(layer, true).apply();
2700}
2701
Alec Mouri80863a62019-01-17 15:19:35 -08002702TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002703 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002704 Transaction transaction;
2705 ASSERT_NO_FATAL_FAILURE(
2706 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2707
2708 sp<GraphicBuffer> buffer =
2709 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2710 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2711 BufferUsage::COMPOSER_OVERLAY,
2712 "test");
2713 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2714
2715 sp<Fence> fence;
2716 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2717 GTEST_SUCCEED() << "test not supported";
2718 return;
2719 }
2720
2721 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2722
2723 status_t status = fence->wait(1000);
2724 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2725 std::this_thread::sleep_for(200ms);
2726
Alec Mouri80863a62019-01-17 15:19:35 -08002727 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002728 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2729 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002730}
2731
Alec Mouri80863a62019-01-17 15:19:35 -08002732TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002733 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002734 ASSERT_NO_FATAL_FAILURE(
2735 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2736
2737 sp<GraphicBuffer> buffer =
2738 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2739 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2740 BufferUsage::COMPOSER_OVERLAY,
2741 "test");
2742 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2743
Marissa Wallfda30bb2018-10-12 11:34:28 -07002744 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002745
2746 Transaction()
2747 .setBuffer(layer, buffer)
2748 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002749 .apply();
2750
Alec Mouri80863a62019-01-17 15:19:35 -08002751 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002752 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2753 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002754}
2755
Alec Mouri80863a62019-01-17 15:19:35 -08002756TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002757 sp<SurfaceControl> layer;
2758 ASSERT_NO_FATAL_FAILURE(
2759 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2760
2761 sp<GraphicBuffer> buffer =
2762 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2763 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2764 BufferUsage::COMPOSER_OVERLAY,
2765 "test");
2766 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2767
2768 Transaction()
2769 .setBuffer(layer, buffer)
2770 .setDataspace(layer, ui::Dataspace::UNKNOWN)
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, SetHdrMetadataBasic_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 HdrMetadata hdrMetadata;
2791 hdrMetadata.validTypes = 0;
2792 Transaction()
2793 .setBuffer(layer, buffer)
2794 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002795 .apply();
2796
Alec Mouri80863a62019-01-17 15:19:35 -08002797 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002798 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2799 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002800}
2801
Alec Mouri80863a62019-01-17 15:19:35 -08002802TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002803 sp<SurfaceControl> layer;
2804 ASSERT_NO_FATAL_FAILURE(
2805 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2806
2807 sp<GraphicBuffer> buffer =
2808 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2809 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2810 BufferUsage::COMPOSER_OVERLAY,
2811 "test");
2812 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2813
2814 Region region;
2815 region.set(32, 32);
2816 Transaction()
2817 .setBuffer(layer, buffer)
2818 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002819 .apply();
2820
Alec Mouri80863a62019-01-17 15:19:35 -08002821 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002822 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2823 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002824}
2825
Alec Mouri80863a62019-01-17 15:19:35 -08002826TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002827 sp<SurfaceControl> layer;
2828 ASSERT_NO_FATAL_FAILURE(
2829 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2830
2831 sp<GraphicBuffer> buffer =
2832 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2833 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2834 BufferUsage::COMPOSER_OVERLAY,
2835 "test");
2836 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2837
2838 Transaction()
2839 .setBuffer(layer, buffer)
2840 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002841 .apply();
2842
Alec Mouri80863a62019-01-17 15:19:35 -08002843 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002844 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2845 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002846}
2847
2848TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2849 sp<SurfaceControl> layer;
2850 ASSERT_NO_FATAL_FAILURE(
2851 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2852
2853 // verify this doesn't cause a crash
2854 Transaction().setSidebandStream(layer, nullptr).apply();
2855}
2856
Robert Carr54cf5b12019-01-25 14:02:28 -08002857TEST_F(LayerTransactionTest, ReparentToSelf) {
2858 sp<SurfaceControl> layer;
2859 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2860 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2861 Transaction().reparent(layer, layer->getHandle()).apply();
2862
2863 {
2864 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2865 // to still be functioning.
2866 SCOPED_TRACE("after reparent to self");
2867 const Rect rect(0, 0, 32, 32);
2868 auto shot = screenshot();
2869 shot->expectColor(rect, Color::RED);
2870 shot->expectBorder(rect, Color::BLACK);
2871 }
2872}
2873
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002874class ColorTransformHelper {
2875public:
2876 static void DegammaColorSingle(half& s) {
2877 if (s <= 0.03928f)
2878 s = s / 12.92f;
2879 else
2880 s = pow((s + 0.055f) / 1.055f, 2.4f);
2881 }
2882
2883 static void DegammaColor(half3& color) {
2884 DegammaColorSingle(color.r);
2885 DegammaColorSingle(color.g);
2886 DegammaColorSingle(color.b);
2887 }
2888
2889 static void GammaColorSingle(half& s) {
2890 if (s <= 0.0031308f) {
2891 s = s * 12.92f;
2892 } else {
2893 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2894 }
2895 }
2896
2897 static void GammaColor(half3& color) {
2898 GammaColorSingle(color.r);
2899 GammaColorSingle(color.g);
2900 GammaColorSingle(color.b);
2901 }
2902
2903 static void applyMatrix(half3& color, const mat3& mat) {
2904 half3 ret = half3(0);
2905
2906 for (int i = 0; i < 3; i++) {
2907 for (int j = 0; j < 3; j++) {
2908 ret[i] = ret[i] + color[j] * mat[j][i];
2909 }
2910 }
2911 color = ret;
2912 }
2913};
2914
Alec Mouri80863a62019-01-17 15:19:35 -08002915TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002916 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002917 ASSERT_NO_FATAL_FAILURE(colorLayer =
2918 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2919 ISurfaceComposerClient::eFXSurfaceColor));
2920 Transaction()
2921 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2922 .setLayer(colorLayer, mLayerZBase + 1)
2923 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002924 {
2925 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002926 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002927 }
2928
2929 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002930 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002931 mat3 matrix;
2932 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2933 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2934 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002935
2936 // degamma before applying the matrix
2937 if (mColorManagementUsed) {
2938 ColorTransformHelper::DegammaColor(expected);
2939 }
2940
2941 ColorTransformHelper::applyMatrix(expected, matrix);
2942
2943 if (mColorManagementUsed) {
2944 ColorTransformHelper::GammaColor(expected);
2945 }
2946
2947 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2948 uint8_t(expected.b * 255), 255};
2949
2950 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2951 // channel) should be less than one
2952 const uint8_t tolerance = 1;
2953
Peiyong Lind3788632018-09-18 16:01:31 -07002954 Transaction().setColor(colorLayer, color)
2955 .setColorTransform(colorLayer, matrix, vec3()).apply();
2956 {
2957 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002958 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002959 }
2960}
2961
Alec Mouri80863a62019-01-17 15:19:35 -08002962TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002963 sp<SurfaceControl> parentLayer;
2964 sp<SurfaceControl> colorLayer;
2965 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2966 0 /* buffer height */,
2967 ISurfaceComposerClient::eFXSurfaceContainer));
2968 ASSERT_NO_FATAL_FAILURE(
2969 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2970 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2971
2972 Transaction()
2973 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2974 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2975 .setLayer(parentLayer, mLayerZBase + 1)
2976 .apply();
2977 {
2978 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002979 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002980 }
2981
2982 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2983 half3 expected = color;
2984 mat3 matrix;
2985 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2986 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2987 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2988
2989 // degamma before applying the matrix
2990 if (mColorManagementUsed) {
2991 ColorTransformHelper::DegammaColor(expected);
2992 }
2993
2994 ColorTransformHelper::applyMatrix(expected, matrix);
2995
2996 if (mColorManagementUsed) {
2997 ColorTransformHelper::GammaColor(expected);
2998 }
2999
3000 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3001 uint8_t(expected.b * 255), 255};
3002
3003 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3004 // channel) should be less than one
3005 const uint8_t tolerance = 1;
3006
3007 Transaction()
3008 .setColor(colorLayer, color)
3009 .setColorTransform(parentLayer, matrix, vec3())
3010 .apply();
3011 {
3012 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003013 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003014 }
3015}
3016
Alec Mouri80863a62019-01-17 15:19:35 -08003017TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08003018 sp<SurfaceControl> parentLayer;
3019 sp<SurfaceControl> colorLayer;
3020 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
3021 0 /* buffer height */,
3022 ISurfaceComposerClient::eFXSurfaceContainer));
3023 ASSERT_NO_FATAL_FAILURE(
3024 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
3025 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
3026
3027 Transaction()
3028 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
3029 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
3030 .setLayer(parentLayer, mLayerZBase + 1)
3031 .apply();
3032 {
3033 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08003034 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08003035 }
3036
3037 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
3038 half3 expected = color;
3039 mat3 matrixChild;
3040 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
3041 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
3042 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
3043 mat3 matrixParent;
3044 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
3045 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
3046 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3047
3048 // degamma before applying the matrix
3049 if (mColorManagementUsed) {
3050 ColorTransformHelper::DegammaColor(expected);
3051 }
3052
3053 ColorTransformHelper::applyMatrix(expected, matrixChild);
3054 ColorTransformHelper::applyMatrix(expected, matrixParent);
3055
3056 if (mColorManagementUsed) {
3057 ColorTransformHelper::GammaColor(expected);
3058 }
3059
3060 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3061 uint8_t(expected.b * 255), 255};
3062
3063 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3064 // channel) should be less than one
3065 const uint8_t tolerance = 1;
3066
3067 Transaction()
3068 .setColor(colorLayer, color)
3069 .setColorTransform(parentLayer, matrixParent, vec3())
3070 .setColorTransform(colorLayer, matrixChild, vec3())
3071 .apply();
3072 {
3073 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003074 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003075 }
3076}
3077
Marissa Wall80d94ad2019-01-18 16:04:36 -08003078struct CallbackData {
3079 CallbackData() = default;
3080 CallbackData(nsecs_t time, const sp<Fence>& fence,
3081 const std::vector<SurfaceControlStats>& stats)
3082 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3083
3084 nsecs_t latchTime;
3085 sp<Fence> presentFence;
3086 std::vector<SurfaceControlStats> surfaceControlStats;
3087};
3088
Marissa Wallfda30bb2018-10-12 11:34:28 -07003089class ExpectedResult {
3090public:
3091 enum Transaction {
3092 NOT_PRESENTED = 0,
3093 PRESENTED,
3094 };
3095
3096 enum Buffer {
3097 NOT_ACQUIRED = 0,
3098 ACQUIRED,
3099 };
3100
3101 enum PreviousBuffer {
3102 NOT_RELEASED = 0,
3103 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003104 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003105 };
3106
3107 void reset() {
3108 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3109 mExpectedSurfaceResults.clear();
3110 }
3111
3112 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003113 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003114 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3115 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003116 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003117 std::forward_as_tuple(bufferResult, previousBufferResult));
3118 }
3119
3120 void addSurfaces(ExpectedResult::Transaction transactionResult,
3121 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003122 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003123 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3124 for (const auto& layer : layers) {
3125 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3126 }
3127 }
3128
Marissa Wall17b4e452018-12-26 16:32:34 -08003129 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3130 mExpectedPresentTime = expectedPresentTime;
3131 }
3132
Marissa Wall80d94ad2019-01-18 16:04:36 -08003133 void verifyCallbackData(const CallbackData& callbackData) const {
3134 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003135 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3136 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003137 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003138 if (mExpectedPresentTime >= 0) {
3139 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3140 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3141 // if the panel is running at 30 hz, at the worst case, our expected time just
3142 // misses vsync and we have to wait another 33.3ms
3143 ASSERT_LE(presentFence->getSignalTime(),
3144 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3145 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003146 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003147 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003148 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3149 }
3150
Marissa Wall80d94ad2019-01-18 16:04:36 -08003151 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003152 << "wrong number of surfaces";
3153
Marissa Wall80d94ad2019-01-18 16:04:36 -08003154 for (const auto& stats : surfaceControlStats) {
3155 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3156
Marissa Wallfda30bb2018-10-12 11:34:28 -07003157 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3158 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3159 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003160 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003161 }
3162 }
3163
3164private:
3165 class ExpectedSurfaceResult {
3166 public:
3167 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3168 ExpectedResult::PreviousBuffer previousBufferResult)
3169 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3170
Marissa Wall80d94ad2019-01-18 16:04:36 -08003171 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3172 nsecs_t latchTime) const {
3173 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003174
3175 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3176 << "bad acquire time";
3177 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003178
3179 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3180 ASSERT_NE(previousReleaseFence, nullptr)
3181 << "failed to set release prev buffer fence";
3182 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3183 ASSERT_EQ(previousReleaseFence, nullptr)
3184 << "should not have set released prev buffer fence";
3185 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003186 }
3187
3188 private:
3189 ExpectedResult::Buffer mBufferResult;
3190 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3191 };
3192
Marissa Wall80d94ad2019-01-18 16:04:36 -08003193 struct SCHash {
3194 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3195 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003196 }
3197 };
3198 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003199 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003200 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003201};
3202
3203class CallbackHelper {
3204public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003205 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3206 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003207 if (!callbackContext) {
3208 ALOGE("failed to get callback context");
3209 }
3210 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3211 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003212 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003213 helper->mConditionVariable.notify_all();
3214 }
3215
Marissa Wall80d94ad2019-01-18 16:04:36 -08003216 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003217 std::unique_lock lock(mMutex);
3218
Marissa Wall80d94ad2019-01-18 16:04:36 -08003219 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003220 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3221 std::cv_status::timeout)
3222 << "did not receive callback";
3223 }
3224
Marissa Wall80d94ad2019-01-18 16:04:36 -08003225 *outData = std::move(mCallbackDataQueue.front());
3226 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003227 }
3228
3229 void verifyFinalState() {
3230 // Wait to see if there are extra callbacks
3231 std::this_thread::sleep_for(500ms);
3232
3233 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003234 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3235 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003236 }
3237
3238 void* getContext() { return static_cast<void*>(this); }
3239
3240 std::mutex mMutex;
3241 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003242 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003243};
3244
3245class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003246public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003247 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003248 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003249 }
3250
Marissa Wall713b63f2018-10-17 15:42:43 -07003251 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003252 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3253 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003254 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003255 sp<GraphicBuffer> buffer;
3256 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003257 if (setBuffer) {
3258 int err = getBuffer(&buffer, &fence);
3259 if (err != NO_ERROR) {
3260 return err;
3261 }
3262
3263 transaction.setBuffer(layer, buffer);
3264 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003265 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003266
Valerie Hauaa194562019-02-05 16:21:38 -08003267 if (setBackgroundColor) {
3268 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3269 ui::Dataspace::UNKNOWN);
3270 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003271 }
3272
3273 transaction.addTransactionCompletedCallback(callbackHelper->function,
3274 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003275 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003276 }
3277
Marissa Wall861616d2018-10-22 12:52:23 -07003278 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3279 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003280 CallbackData callbackData;
3281 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3282 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003283
3284 if (finalState) {
3285 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3286 }
3287 }
3288
Marissa Wall861616d2018-10-22 12:52:23 -07003289 static void waitForCallbacks(CallbackHelper& helper,
3290 const std::vector<ExpectedResult>& expectedResults,
3291 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003292 for (const auto& expectedResult : expectedResults) {
3293 waitForCallback(helper, expectedResult);
3294 }
3295 if (finalState) {
3296 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3297 }
3298 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003299};
3300
Valerie Hauaa194562019-02-05 16:21:38 -08003301TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003302 sp<SurfaceControl> layer;
3303 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3304
3305 Transaction transaction;
3306 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003307 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003308 if (err) {
3309 GTEST_SUCCEED() << "test not supported";
3310 return;
3311 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003312
3313 transaction.apply();
3314
3315 ExpectedResult expected;
3316 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3317 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3318}
3319
Valerie Hauaa194562019-02-05 16:21:38 -08003320TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003321 sp<SurfaceControl> layer;
3322 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3323
3324 Transaction transaction;
3325 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003326 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003327 if (err) {
3328 GTEST_SUCCEED() << "test not supported";
3329 return;
3330 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003331
Marissa Wall861616d2018-10-22 12:52:23 -07003332 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003333
3334 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003335 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3336 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003337 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3338}
3339
Valerie Hauaa194562019-02-05 16:21:38 -08003340TEST_F(LayerCallbackTest, BufferNoColor) {
3341 sp<SurfaceControl> layer;
3342 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3343
3344 Transaction transaction;
3345 CallbackHelper callback;
3346 int err = fillTransaction(transaction, &callback, layer, true, false);
3347 if (err) {
3348 GTEST_SUCCEED() << "test not supported";
3349 return;
3350 }
3351
3352 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3353
3354 ExpectedResult expected;
3355 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3356 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3357}
3358
3359TEST_F(LayerCallbackTest, NoBufferColor) {
3360 sp<SurfaceControl> layer;
3361 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3362
3363 Transaction transaction;
3364 CallbackHelper callback;
3365 int err = fillTransaction(transaction, &callback, layer, false, true);
3366 if (err) {
3367 GTEST_SUCCEED() << "test not supported";
3368 return;
3369 }
3370
3371 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3372
3373 ExpectedResult expected;
3374 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3375 ExpectedResult::Buffer::NOT_ACQUIRED);
3376 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3377}
3378
Marissa Wallfda30bb2018-10-12 11:34:28 -07003379TEST_F(LayerCallbackTest, NoStateChange) {
3380 Transaction transaction;
3381 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003382 int err = fillTransaction(transaction, &callback);
3383 if (err) {
3384 GTEST_SUCCEED() << "test not supported";
3385 return;
3386 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003387
3388 transaction.apply();
3389
3390 ExpectedResult expected;
3391 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3392}
3393
3394TEST_F(LayerCallbackTest, OffScreen) {
3395 sp<SurfaceControl> layer;
3396 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3397
3398 Transaction transaction;
3399 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003400 int err = fillTransaction(transaction, &callback, layer);
3401 if (err) {
3402 GTEST_SUCCEED() << "test not supported";
3403 return;
3404 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003405
Marissa Wall861616d2018-10-22 12:52:23 -07003406 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003407
3408 ExpectedResult expected;
3409 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3410 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3411}
3412
Valerie Hauaa194562019-02-05 16:21:38 -08003413TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003414 sp<SurfaceControl> layer1, layer2;
3415 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3416 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3417
3418 Transaction transaction1, transaction2;
3419 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003420 int err = fillTransaction(transaction1, &callback1, layer1);
3421 if (err) {
3422 GTEST_SUCCEED() << "test not supported";
3423 return;
3424 }
3425 err = fillTransaction(transaction2, &callback2, layer2);
3426 if (err) {
3427 GTEST_SUCCEED() << "test not supported";
3428 return;
3429 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003430
Marissa Wall861616d2018-10-22 12:52:23 -07003431 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3432 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003433
3434 ExpectedResult expected;
3435 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3436 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3437 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3438}
3439
Valerie Hauaa194562019-02-05 16:21:38 -08003440TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3441 sp<SurfaceControl> layer1, layer2;
3442 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3443 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3444
3445 Transaction transaction1, transaction2;
3446 CallbackHelper callback1, callback2;
3447 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3448 if (err) {
3449 GTEST_SUCCEED() << "test not supported";
3450 return;
3451 }
3452 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3453 if (err) {
3454 GTEST_SUCCEED() << "test not supported";
3455 return;
3456 }
3457
3458 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3459 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3460
3461 ExpectedResult expected;
3462 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3463 ExpectedResult::Buffer::NOT_ACQUIRED);
3464 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3465 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3466}
3467
3468TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3469 sp<SurfaceControl> layer1, layer2;
3470 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3471 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3472
3473 Transaction transaction1, transaction2;
3474 CallbackHelper callback1, callback2;
3475 int err = fillTransaction(transaction1, &callback1, layer1);
3476 if (err) {
3477 GTEST_SUCCEED() << "test not supported";
3478 return;
3479 }
3480 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3481 if (err) {
3482 GTEST_SUCCEED() << "test not supported";
3483 return;
3484 }
3485
3486 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3487 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3488
3489 ExpectedResult expected;
3490 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3491 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3492 ExpectedResult::Buffer::NOT_ACQUIRED);
3493 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3494 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3495}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003496TEST_F(LayerCallbackTest, Merge_SameCallback) {
3497 sp<SurfaceControl> layer1, layer2;
3498 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3499 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3500
3501 Transaction transaction1, transaction2;
3502 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003503 int err = fillTransaction(transaction1, &callback, layer1);
3504 if (err) {
3505 GTEST_SUCCEED() << "test not supported";
3506 return;
3507 }
3508 err = fillTransaction(transaction2, &callback, layer2);
3509 if (err) {
3510 GTEST_SUCCEED() << "test not supported";
3511 return;
3512 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003513
3514 transaction2.merge(std::move(transaction1)).apply();
3515
3516 ExpectedResult expected;
3517 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3518 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3519 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3520}
3521
3522TEST_F(LayerCallbackTest, Merge_SameLayer) {
3523 sp<SurfaceControl> layer;
3524 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3525
3526 Transaction transaction1, transaction2;
3527 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003528 int err = fillTransaction(transaction1, &callback1, layer);
3529 if (err) {
3530 GTEST_SUCCEED() << "test not supported";
3531 return;
3532 }
3533 err = fillTransaction(transaction2, &callback2, layer);
3534 if (err) {
3535 GTEST_SUCCEED() << "test not supported";
3536 return;
3537 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003538
3539 transaction2.merge(std::move(transaction1)).apply();
3540
3541 ExpectedResult expected;
3542 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3543 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3544 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3545}
3546
Marissa Wallfda30bb2018-10-12 11:34:28 -07003547TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3548 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3549 client2(new SurfaceComposerClient);
3550
3551 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3552 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3553
3554 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003555 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003556 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003557 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003558 ISurfaceComposerClient::eFXSurfaceBufferState));
3559
3560 Transaction transaction1, transaction2;
3561 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003562 int err = fillTransaction(transaction1, &callback1, layer1);
3563 if (err) {
3564 GTEST_SUCCEED() << "test not supported";
3565 return;
3566 }
3567 err = fillTransaction(transaction2, &callback2, layer2);
3568 if (err) {
3569 GTEST_SUCCEED() << "test not supported";
3570 return;
3571 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003572
Marissa Wall861616d2018-10-22 12:52:23 -07003573 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3574 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003575
3576 ExpectedResult expected;
3577 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3578 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3579 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3580}
3581
3582TEST_F(LayerCallbackTest, MultipleTransactions) {
3583 sp<SurfaceControl> layer;
3584 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3585
3586 Transaction transaction;
3587 CallbackHelper callback;
3588 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003589 int err = fillTransaction(transaction, &callback, layer);
3590 if (err) {
3591 GTEST_SUCCEED() << "test not supported";
3592 return;
3593 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003594
3595 transaction.apply();
3596
3597 ExpectedResult expected;
3598 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003599 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003600 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3601 : ExpectedResult::PreviousBuffer::RELEASED);
3602 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3603 }
3604 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3605}
3606
3607TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3608 sp<SurfaceControl> layer;
3609 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3610
3611 Transaction transaction;
3612 CallbackHelper callback;
3613 for (size_t i = 0; i < 10; i++) {
3614 ExpectedResult expected;
3615
3616 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003617 int err = fillTransaction(transaction, &callback, layer);
3618 if (err) {
3619 GTEST_SUCCEED() << "test not supported";
3620 return;
3621 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003622 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3623 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003624 int err = fillTransaction(transaction, &callback);
3625 if (err) {
3626 GTEST_SUCCEED() << "test not supported";
3627 return;
3628 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003629 }
3630
3631 transaction.apply();
3632
3633 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3634 }
3635 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3636}
3637
3638TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3639 sp<SurfaceControl> layer;
3640 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3641
3642 Transaction transaction;
3643 CallbackHelper callback;
3644 for (size_t i = 0; i < 10; i++) {
3645 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003646 int err = fillTransaction(transaction, &callback, layer);
3647 if (err) {
3648 GTEST_SUCCEED() << "test not supported";
3649 return;
3650 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003651 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003652 int err = fillTransaction(transaction, &callback);
3653 if (err) {
3654 GTEST_SUCCEED() << "test not supported";
3655 return;
3656 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003657 }
3658
Marissa Wall861616d2018-10-22 12:52:23 -07003659 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003660
3661 ExpectedResult expected;
3662 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3663 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003664 layer,
3665 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3666 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003667 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3668 }
3669 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3670}
3671
3672TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3673 sp<SurfaceControl> layer1, layer2;
3674 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3675 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3676
3677 Transaction transaction1, transaction2;
3678 CallbackHelper callback1, callback2;
3679 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003680 int err = fillTransaction(transaction1, &callback1, layer1);
3681 if (err) {
3682 GTEST_SUCCEED() << "test not supported";
3683 return;
3684 }
3685 err = fillTransaction(transaction2, &callback2, layer2);
3686 if (err) {
3687 GTEST_SUCCEED() << "test not supported";
3688 return;
3689 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003690
Marissa Wall861616d2018-10-22 12:52:23 -07003691 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3692 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003693
3694 ExpectedResult expected;
3695 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003696 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003697 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3698 : ExpectedResult::PreviousBuffer::RELEASED);
3699 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3700 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3701 }
3702 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3703 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3704}
3705
3706TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3707 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3708 client2(new SurfaceComposerClient);
3709 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3710 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3711
3712 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003713 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003714 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003715 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003716 ISurfaceComposerClient::eFXSurfaceBufferState));
3717
3718 Transaction transaction1, transaction2;
3719 CallbackHelper callback1, callback2;
3720 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003721 int err = fillTransaction(transaction1, &callback1, layer1);
3722 if (err) {
3723 GTEST_SUCCEED() << "test not supported";
3724 return;
3725 }
3726 err = fillTransaction(transaction2, &callback2, layer2);
3727 if (err) {
3728 GTEST_SUCCEED() << "test not supported";
3729 return;
3730 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003731
Marissa Wall861616d2018-10-22 12:52:23 -07003732 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3733 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003734
3735 ExpectedResult expected;
3736 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003737 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003738 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3739 : ExpectedResult::PreviousBuffer::RELEASED);
3740 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3741 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3742 }
3743 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3744 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3745}
3746
3747TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3748 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3749 client2(new SurfaceComposerClient);
3750 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3751 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3752
3753 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003754 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003755 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003756 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003757 ISurfaceComposerClient::eFXSurfaceBufferState));
3758
3759 Transaction transaction1, transaction2;
3760 CallbackHelper callback1, callback2;
3761
3762 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003763 int err = fillTransaction(transaction1, &callback1, layer1);
3764 if (err) {
3765 GTEST_SUCCEED() << "test not supported";
3766 return;
3767 }
3768 err = fillTransaction(transaction2, &callback2, layer2);
3769 if (err) {
3770 GTEST_SUCCEED() << "test not supported";
3771 return;
3772 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003773
Marissa Wall861616d2018-10-22 12:52:23 -07003774 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3775 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003776
3777 ExpectedResult expected;
3778 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3779 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3780 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3781 expected.reset();
3782
3783 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003784 err = fillTransaction(transaction1, &callback1);
3785 if (err) {
3786 GTEST_SUCCEED() << "test not supported";
3787 return;
3788 }
3789 err = fillTransaction(transaction2, &callback2);
3790 if (err) {
3791 GTEST_SUCCEED() << "test not supported";
3792 return;
3793 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003794
3795 transaction2.merge(std::move(transaction1)).apply();
3796
3797 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3798 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3799}
3800
3801TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3802 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3803 client2(new SurfaceComposerClient);
3804
3805 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3806 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3807
3808 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003809 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003810 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003811 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003812 ISurfaceComposerClient::eFXSurfaceBufferState));
3813
3814 Transaction transaction1, transaction2;
3815 CallbackHelper callback1, callback2;
3816
3817 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003818 int err = fillTransaction(transaction1, &callback1, layer1);
3819 if (err) {
3820 GTEST_SUCCEED() << "test not supported";
3821 return;
3822 }
3823 err = fillTransaction(transaction2, &callback2, layer2);
3824 if (err) {
3825 GTEST_SUCCEED() << "test not supported";
3826 return;
3827 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003828
Marissa Wall861616d2018-10-22 12:52:23 -07003829 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3830 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003831
3832 ExpectedResult expected;
3833 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3834 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3835 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3836 expected.reset();
3837
3838 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003839 err = fillTransaction(transaction1, &callback1);
3840 if (err) {
3841 GTEST_SUCCEED() << "test not supported";
3842 return;
3843 }
3844 err = fillTransaction(transaction2, &callback2);
3845 if (err) {
3846 GTEST_SUCCEED() << "test not supported";
3847 return;
3848 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003849
Marissa Wall861616d2018-10-22 12:52:23 -07003850 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003851
Marissa Wall713b63f2018-10-17 15:42:43 -07003852 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3853 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003854 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3855 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3856}
3857
3858TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3859 sp<SurfaceControl> layer;
3860 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3861
3862 Transaction transaction;
3863 CallbackHelper callback;
3864 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003865 for (auto& expected : expectedResults) {
3866 expected.reset();
3867 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003868 ExpectedResult::Buffer::ACQUIRED,
3869 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003870
Marissa Wall713b63f2018-10-17 15:42:43 -07003871 int err = fillTransaction(transaction, &callback, layer);
3872 if (err) {
3873 GTEST_SUCCEED() << "test not supported";
3874 return;
3875 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003876
3877 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003878 }
3879 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3880}
3881
3882TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3883 sp<SurfaceControl> layer;
3884 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3885
Marissa Wall713b63f2018-10-17 15:42:43 -07003886 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003887 Transaction transaction;
3888 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003889 int err = fillTransaction(transaction, &callback, layer);
3890 if (err) {
3891 GTEST_SUCCEED() << "test not supported";
3892 return;
3893 }
3894
3895 transaction.apply();
3896
3897 ExpectedResult expected;
3898 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3899 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3900
3901 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003902 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003903 for (auto& expected : expectedResults) {
3904 expected.reset();
3905
Marissa Wall713b63f2018-10-17 15:42:43 -07003906 err = fillTransaction(transaction, &callback);
3907 if (err) {
3908 GTEST_SUCCEED() << "test not supported";
3909 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003910 }
3911
3912 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003913 }
3914 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3915}
3916
3917TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3918 sp<SurfaceControl> layer;
3919 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3920
3921 // Normal call to set up test
3922 Transaction transaction;
3923 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003924 int err = fillTransaction(transaction, &callback, layer);
3925 if (err) {
3926 GTEST_SUCCEED() << "test not supported";
3927 return;
3928 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003929
Marissa Wall861616d2018-10-22 12:52:23 -07003930 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003931
3932 ExpectedResult expectedResult;
3933 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3934 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3935
3936 // Test
3937 std::vector<ExpectedResult> expectedResults(50);
3938 for (auto& expected : expectedResults) {
3939 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003940 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3941 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003942
Marissa Wall713b63f2018-10-17 15:42:43 -07003943 err = fillTransaction(transaction, &callback);
3944 if (err) {
3945 GTEST_SUCCEED() << "test not supported";
3946 return;
3947 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003948
Marissa Wall861616d2018-10-22 12:52:23 -07003949 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003950 }
3951 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3952}
3953
Marissa Wall17b4e452018-12-26 16:32:34 -08003954TEST_F(LayerCallbackTest, DesiredPresentTime) {
3955 sp<SurfaceControl> layer;
3956 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3957
3958 Transaction transaction;
3959 CallbackHelper callback;
3960 int err = fillTransaction(transaction, &callback, layer);
3961 if (err) {
3962 GTEST_SUCCEED() << "test not supported";
3963 return;
3964 }
3965
3966 // Try to present 100ms in the future
3967 nsecs_t time = systemTime() + (100 * 1e6);
3968
3969 transaction.setDesiredPresentTime(time);
3970 transaction.apply();
3971
3972 ExpectedResult expected;
3973 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3974 expected.addExpectedPresentTime(time);
3975 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3976}
3977
3978TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3979 sp<SurfaceControl> layer;
3980 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3981
3982 Transaction transaction;
3983 CallbackHelper callback1;
3984 int err = fillTransaction(transaction, &callback1, layer);
3985 if (err) {
3986 GTEST_SUCCEED() << "test not supported";
3987 return;
3988 }
3989
3990 // Try to present 100ms in the future
3991 nsecs_t time = systemTime() + (100 * 1e6);
3992
3993 transaction.setDesiredPresentTime(time);
3994 transaction.apply();
3995
3996 ExpectedResult expected1;
3997 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3998 expected1.addExpectedPresentTime(time);
3999
4000 CallbackHelper callback2;
4001 err = fillTransaction(transaction, &callback2, layer);
4002 if (err) {
4003 GTEST_SUCCEED() << "test not supported";
4004 return;
4005 }
4006
4007 // Try to present 33ms after the first frame
4008 time += (33.3 * 1e6);
4009
4010 transaction.setDesiredPresentTime(time);
4011 transaction.apply();
4012
4013 ExpectedResult expected2;
4014 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4015 ExpectedResult::Buffer::ACQUIRED,
4016 ExpectedResult::PreviousBuffer::RELEASED);
4017 expected2.addExpectedPresentTime(time);
4018
4019 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4020 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4021}
4022
4023TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
4024 sp<SurfaceControl> layer;
4025 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4026
4027 Transaction transaction;
4028 CallbackHelper callback1;
4029 int err = fillTransaction(transaction, &callback1, layer);
4030 if (err) {
4031 GTEST_SUCCEED() << "test not supported";
4032 return;
4033 }
4034
4035 // Try to present 100ms in the future
4036 nsecs_t time = systemTime() + (100 * 1e6);
4037
4038 transaction.setDesiredPresentTime(time);
4039 transaction.apply();
4040
4041 ExpectedResult expected1;
4042 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4043 expected1.addExpectedPresentTime(time);
4044
4045 CallbackHelper callback2;
4046 err = fillTransaction(transaction, &callback2, layer);
4047 if (err) {
4048 GTEST_SUCCEED() << "test not supported";
4049 return;
4050 }
4051
4052 // Try to present 33ms before the previous frame
4053 time -= (33.3 * 1e6);
4054
4055 transaction.setDesiredPresentTime(time);
4056 transaction.apply();
4057
4058 ExpectedResult expected2;
4059 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4060 ExpectedResult::Buffer::ACQUIRED,
4061 ExpectedResult::PreviousBuffer::RELEASED);
4062
4063 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4064 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4065}
4066
4067TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4068 sp<SurfaceControl> layer;
4069 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4070
4071 Transaction transaction;
4072 CallbackHelper callback;
4073 int err = fillTransaction(transaction, &callback, layer);
4074 if (err) {
4075 GTEST_SUCCEED() << "test not supported";
4076 return;
4077 }
4078
4079 // Try to present 100ms in the past
4080 nsecs_t time = systemTime() - (100 * 1e6);
4081
4082 transaction.setDesiredPresentTime(time);
4083 transaction.apply();
4084
4085 ExpectedResult expected;
4086 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4087 expected.addExpectedPresentTime(systemTime());
4088 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4089}
4090
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004091class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004092protected:
4093 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004094 LayerTransactionTest::SetUp();
4095 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004096
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004097 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4098 ASSERT_FALSE(display == nullptr);
4099
Mathias Agopianc666cae2012-07-25 18:56:13 -07004100 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004101 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004102
4103 ssize_t displayWidth = info.w;
4104 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004105
4106 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004107 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4108 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004109 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004110 ASSERT_TRUE(mBGSurfaceControl->isValid());
4111 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4112
4113 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004114 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4115
Peiyong Lin566a3b42018-01-09 18:22:43 -08004116 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004117 ASSERT_TRUE(mFGSurfaceControl->isValid());
4118
4119 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4120
4121 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004122 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004123 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004124 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4125
4126 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4127
Robert Carr4cdc58f2017-08-23 14:22:20 -07004128 asTransaction([&](Transaction& t) {
4129 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004130
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004131 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004132
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004133 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4134 .setPosition(mFGSurfaceControl, 64, 64)
4135 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004136
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004137 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4138 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4139 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004140 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004141 }
4142
4143 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004144 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004145 mBGSurfaceControl = 0;
4146 mFGSurfaceControl = 0;
4147 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004148 }
4149
4150 void waitForPostedBuffers() {
4151 // Since the sync surface is in synchronous mode (i.e. double buffered)
4152 // posting three buffers to it should ensure that at least two
4153 // SurfaceFlinger::handlePageFlip calls have been made, which should
4154 // guaranteed that a buffer posted to another Surface has been retired.
4155 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4156 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4157 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4158 }
4159
Robert Carr4cdc58f2017-08-23 14:22:20 -07004160
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004161 sp<SurfaceControl> mBGSurfaceControl;
4162 sp<SurfaceControl> mFGSurfaceControl;
4163
4164 // This surface is used to ensure that the buffers posted to
4165 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4166 sp<SurfaceControl> mSyncSurfaceControl;
4167};
4168
Robert Carr7f619b22017-11-06 12:56:35 -08004169TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004170
chaviw0e3479f2018-09-10 16:49:30 -07004171 std::unique_ptr<ScreenCapture> sc;
4172
4173 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004174 fillSurfaceRGBA8(relative, 10, 10, 10);
4175 waitForPostedBuffers();
4176
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004177 Transaction{}
4178 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004179 .setPosition(relative, 64, 64)
4180 .apply();
4181
4182 {
4183 // The relative should be on top of the FG control.
4184 ScreenCapture::captureScreen(&sc);
4185 sc->checkPixel(64, 64, 10, 10, 10);
4186 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004187 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004188
4189 {
4190 // Nothing should change at this point.
4191 ScreenCapture::captureScreen(&sc);
4192 sc->checkPixel(64, 64, 10, 10, 10);
4193 }
4194
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004195 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004196
4197 {
4198 // Ensure that the relative was actually hidden, rather than
4199 // being left in the detached but visible state.
4200 ScreenCapture::captureScreen(&sc);
4201 sc->expectFGColor(64, 64);
4202 }
4203}
4204
Robert Carr8d5227b2017-03-16 15:41:03 -07004205class GeometryLatchingTest : public LayerUpdateTest {
4206protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004207 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004208 SCOPED_TRACE(trace);
4209 ScreenCapture::captureScreen(&sc);
4210 // We find the leading edge of the FG surface.
4211 sc->expectFGColor(127, 127);
4212 sc->expectBGColor(128, 128);
4213 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004214
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004215 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004216
4217 void unlockFGBuffer() {
4218 sp<Surface> s = mFGSurfaceControl->getSurface();
4219 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4220 waitForPostedBuffers();
4221 }
4222
Robert Carr8d5227b2017-03-16 15:41:03 -07004223 void completeFGResize() {
4224 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4225 waitForPostedBuffers();
4226 }
4227 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004228 asTransaction([&](Transaction& t) {
4229 t.setSize(mFGSurfaceControl, 64, 64);
4230 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004231 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004232 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004233
4234 EXPECT_INITIAL_STATE("After restoring initial state");
4235 }
chaviw0e3479f2018-09-10 16:49:30 -07004236 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004237};
4238
Robert Carr8d5227b2017-03-16 15:41:03 -07004239class CropLatchingTest : public GeometryLatchingTest {
4240protected:
4241 void EXPECT_CROPPED_STATE(const char* trace) {
4242 SCOPED_TRACE(trace);
4243 ScreenCapture::captureScreen(&sc);
4244 // The edge should be moved back one pixel by our crop.
4245 sc->expectFGColor(126, 126);
4246 sc->expectBGColor(127, 127);
4247 sc->expectBGColor(128, 128);
4248 }
chaviw59f5c562017-06-28 16:39:06 -07004249
4250 void EXPECT_RESIZE_STATE(const char* trace) {
4251 SCOPED_TRACE(trace);
4252 ScreenCapture::captureScreen(&sc);
4253 // The FG is now resized too 128,128 at 64,64
4254 sc->expectFGColor(64, 64);
4255 sc->expectFGColor(191, 191);
4256 sc->expectBGColor(192, 192);
4257 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004258};
4259
Pablo Ceballos05289c22016-04-14 15:49:55 -07004260TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004261 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004262 {
4263 SCOPED_TRACE("before anything");
4264 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004265 sc->expectBGColor(32, 32);
4266 sc->expectFGColor(96, 96);
4267 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004268 }
4269
4270 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004271 asTransaction([&](Transaction& t) {
4272 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004273 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4274 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004275 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004276
Robert Carr4cdc58f2017-08-23 14:22:20 -07004277 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004278 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004279 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4280 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004281 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004282
4283 {
4284 SCOPED_TRACE("before any trigger");
4285 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004286 sc->expectBGColor(32, 32);
4287 sc->expectFGColor(96, 96);
4288 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004289 }
4290
4291 // should trigger the first deferred transaction, but not the second one
4292 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4293 {
4294 SCOPED_TRACE("after first trigger");
4295 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004296 sc->expectBGColor(32, 32);
4297 sc->checkPixel(96, 96, 162, 63, 96);
4298 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004299 }
4300
4301 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004302 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004303
4304 // trigger the second deferred transaction
4305 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4306 {
4307 SCOPED_TRACE("after second trigger");
4308 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004309 sc->expectBGColor(32, 32);
4310 sc->expectBGColor(96, 96);
4311 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004312 }
4313}
4314
Robert Carre392b552017-09-19 12:16:05 -07004315TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004316 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004317
4318 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004319 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4320 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4321 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4322 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004323 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004324 SurfaceComposerClient::Transaction{}
4325 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4326 .show(childNoBuffer)
4327 .show(childBuffer)
4328 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004329 {
4330 ScreenCapture::captureScreen(&sc);
4331 sc->expectChildColor(73, 73);
4332 sc->expectFGColor(74, 74);
4333 }
Vishnu Nair60356342018-11-13 13:00:45 -08004334 SurfaceComposerClient::Transaction{}
4335 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4336 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004337 {
4338 ScreenCapture::captureScreen(&sc);
4339 sc->expectChildColor(73, 73);
4340 sc->expectChildColor(74, 74);
4341 }
4342}
4343
Robert Carr2c5f6d22017-09-26 12:30:35 -07004344TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004345 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004346 {
4347 SCOPED_TRACE("before move");
4348 ScreenCapture::captureScreen(&sc);
4349 sc->expectBGColor(0, 12);
4350 sc->expectFGColor(75, 75);
4351 sc->expectBGColor(145, 145);
4352 }
4353
4354 Transaction t1, t2;
4355 t1.setPosition(mFGSurfaceControl, 128, 128);
4356 t2.setPosition(mFGSurfaceControl, 0, 0);
4357 // We expect that the position update from t2 now
4358 // overwrites the position update from t1.
4359 t1.merge(std::move(t2));
4360 t1.apply();
4361
4362 {
4363 ScreenCapture::captureScreen(&sc);
4364 sc->expectFGColor(1, 1);
4365 }
4366}
4367
Robert Carr1f0a16a2016-10-24 16:27:39 -07004368class ChildLayerTest : public LayerUpdateTest {
4369protected:
4370 void SetUp() override {
4371 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004372 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004373 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004374 fillSurfaceRGBA8(mChild, 200, 200, 200);
4375
4376 {
4377 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004378 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004379 mCapture->expectChildColor(64, 64);
4380 }
4381 }
4382 void TearDown() override {
4383 LayerUpdateTest::TearDown();
4384 mChild = 0;
4385 }
4386
4387 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004388 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004389};
4390
4391TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004392 asTransaction([&](Transaction& t) {
4393 t.show(mChild);
4394 t.setPosition(mChild, 10, 10);
4395 t.setPosition(mFGSurfaceControl, 64, 64);
4396 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004397
4398 {
chaviw0e3479f2018-09-10 16:49:30 -07004399 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004400 // Top left of foreground must now be visible
4401 mCapture->expectFGColor(64, 64);
4402 // But 10 pixels in we should see the child surface
4403 mCapture->expectChildColor(74, 74);
4404 // And 10 more pixels we should be back to the foreground surface
4405 mCapture->expectFGColor(84, 84);
4406 }
4407
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 {
chaviw0e3479f2018-09-10 16:49:30 -07004411 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004412 // Top left of foreground should now be at 0, 0
4413 mCapture->expectFGColor(0, 0);
4414 // But 10 pixels in we should see the child surface
4415 mCapture->expectChildColor(10, 10);
4416 // And 10 more pixels we should be back to the foreground surface
4417 mCapture->expectFGColor(20, 20);
4418 }
4419}
4420
Robert Carr41b08b52017-06-01 16:11:34 -07004421TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004422 asTransaction([&](Transaction& t) {
4423 t.show(mChild);
4424 t.setPosition(mChild, 0, 0);
4425 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004426 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004427 });
Robert Carr41b08b52017-06-01 16:11:34 -07004428
4429 {
chaviw0e3479f2018-09-10 16:49:30 -07004430 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004431 mCapture->expectChildColor(0, 0);
4432 mCapture->expectChildColor(4, 4);
4433 mCapture->expectBGColor(5, 5);
4434 }
4435}
4436
Robert Carr1f0a16a2016-10-24 16:27:39 -07004437TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004438 asTransaction([&](Transaction& t) {
4439 t.show(mChild);
4440 t.setPosition(mFGSurfaceControl, 0, 0);
4441 t.setPosition(mChild, 63, 63);
4442 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004443
4444 {
chaviw0e3479f2018-09-10 16:49:30 -07004445 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004446 mCapture->expectFGColor(0, 0);
4447 // Last pixel in foreground should now be the child.
4448 mCapture->expectChildColor(63, 63);
4449 // But the child should be constrained and the next pixel
4450 // must be the background
4451 mCapture->expectBGColor(64, 64);
4452 }
4453}
4454
4455TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004456 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004457
4458 // Find the boundary between the parent and child
4459 {
chaviw0e3479f2018-09-10 16:49:30 -07004460 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004461 mCapture->expectChildColor(9, 9);
4462 mCapture->expectFGColor(10, 10);
4463 }
4464
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004465 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004466
4467 // The boundary should be twice as far from the origin now.
4468 // The pixels from the last test should all be child now
4469 {
chaviw0e3479f2018-09-10 16:49:30 -07004470 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004471 mCapture->expectChildColor(9, 9);
4472 mCapture->expectChildColor(10, 10);
4473 mCapture->expectChildColor(19, 19);
4474 mCapture->expectFGColor(20, 20);
4475 }
4476}
Robert Carr9524cb32017-02-13 11:32:32 -08004477
Vishnu Nairc652ff82019-03-15 12:48:54 -07004478// A child with a scale transform should be cropped by its parent bounds.
4479TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4480 asTransaction([&](Transaction& t) {
4481 t.setPosition(mFGSurfaceControl, 0, 0);
4482 t.setPosition(mChild, 0, 0);
4483 });
4484
4485 // Find the boundary between the parent and child.
4486 {
4487 mCapture = screenshot();
4488 mCapture->expectChildColor(0, 0);
4489 mCapture->expectChildColor(9, 9);
4490 mCapture->expectFGColor(10, 10);
4491 }
4492
4493 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4494
4495 // The child should fill its parent bounds and be cropped by it.
4496 {
4497 mCapture = screenshot();
4498 mCapture->expectChildColor(0, 0);
4499 mCapture->expectChildColor(63, 63);
4500 mCapture->expectBGColor(64, 64);
4501 }
4502}
4503
Robert Carr6452f122017-03-21 10:41:29 -07004504TEST_F(ChildLayerTest, ChildLayerAlpha) {
4505 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4506 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4507 fillSurfaceRGBA8(mChild, 0, 254, 0);
4508 waitForPostedBuffers();
4509
Robert Carr4cdc58f2017-08-23 14:22:20 -07004510 asTransaction([&](Transaction& t) {
4511 t.show(mChild);
4512 t.setPosition(mChild, 0, 0);
4513 t.setPosition(mFGSurfaceControl, 0, 0);
4514 });
Robert Carr6452f122017-03-21 10:41:29 -07004515
4516 {
chaviw0e3479f2018-09-10 16:49:30 -07004517 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004518 // Unblended child color
4519 mCapture->checkPixel(0, 0, 0, 254, 0);
4520 }
4521
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004522 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004523
4524 {
chaviw0e3479f2018-09-10 16:49:30 -07004525 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004526 // Child and BG blended.
4527 mCapture->checkPixel(0, 0, 127, 127, 0);
4528 }
4529
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004530 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004531
4532 {
chaviw0e3479f2018-09-10 16:49:30 -07004533 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004534 // Child and BG blended.
4535 mCapture->checkPixel(0, 0, 95, 64, 95);
4536 }
4537}
4538
Robert Carr9524cb32017-02-13 11:32:32 -08004539TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004540 asTransaction([&](Transaction& t) {
4541 t.show(mChild);
4542 t.setPosition(mChild, 10, 10);
4543 t.setPosition(mFGSurfaceControl, 64, 64);
4544 });
Robert Carr9524cb32017-02-13 11:32:32 -08004545
4546 {
chaviw0e3479f2018-09-10 16:49:30 -07004547 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004548 // Top left of foreground must now be visible
4549 mCapture->expectFGColor(64, 64);
4550 // But 10 pixels in we should see the child surface
4551 mCapture->expectChildColor(74, 74);
4552 // And 10 more pixels we should be back to the foreground surface
4553 mCapture->expectFGColor(84, 84);
4554 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004555
4556 asTransaction([&](Transaction& t) {
4557 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4558 });
4559
Robert Carr9524cb32017-02-13 11:32:32 -08004560 {
chaviw0e3479f2018-09-10 16:49:30 -07004561 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004562 mCapture->expectFGColor(64, 64);
4563 // In reparenting we should have exposed the entire foreground surface.
4564 mCapture->expectFGColor(74, 74);
4565 // And the child layer should now begin at 10, 10 (since the BG
4566 // layer is at (0, 0)).
4567 mCapture->expectBGColor(9, 9);
4568 mCapture->expectChildColor(10, 10);
4569 }
4570}
4571
Robert Carr2e102c92018-10-23 12:11:15 -07004572TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4573 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004574 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004575 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4576
4577 {
4578 SCOPED_TRACE("Grandchild visible");
4579 ScreenCapture::captureScreen(&mCapture);
4580 mCapture->checkPixel(64, 64, 111, 111, 111);
4581 }
4582
Robert Carr87246532019-02-04 15:20:26 -08004583 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004584
4585 {
4586 SCOPED_TRACE("After destroying child");
4587 ScreenCapture::captureScreen(&mCapture);
4588 mCapture->expectFGColor(64, 64);
4589 }
4590
4591 asTransaction([&](Transaction& t) {
4592 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4593 });
4594
4595 {
4596 SCOPED_TRACE("After reparenting grandchild");
4597 ScreenCapture::captureScreen(&mCapture);
4598 mCapture->checkPixel(64, 64, 111, 111, 111);
4599 }
4600}
4601
chaviw161410b02017-07-27 10:46:08 -07004602TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004603 asTransaction([&](Transaction& t) {
4604 t.show(mChild);
4605 t.setPosition(mChild, 10, 10);
4606 t.setPosition(mFGSurfaceControl, 64, 64);
4607 });
Robert Carr9524cb32017-02-13 11:32:32 -08004608
4609 {
chaviw0e3479f2018-09-10 16:49:30 -07004610 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004611 // Top left of foreground must now be visible
4612 mCapture->expectFGColor(64, 64);
4613 // But 10 pixels in we should see the child surface
4614 mCapture->expectChildColor(74, 74);
4615 // And 10 more pixels we should be back to the foreground surface
4616 mCapture->expectFGColor(84, 84);
4617 }
4618
chaviw0e3479f2018-09-10 16:49:30 -07004619
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004620 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004621
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004622 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004623
chaviw161410b02017-07-27 10:46:08 -07004624 // Since the child has the same client as the parent, it will not get
4625 // detached and will be hidden.
4626 {
chaviw0e3479f2018-09-10 16:49:30 -07004627 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004628 mCapture->expectFGColor(64, 64);
4629 mCapture->expectFGColor(74, 74);
4630 mCapture->expectFGColor(84, 84);
4631 }
4632}
4633
4634TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4635 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004636 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004637 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4638 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004639
chaviw161410b02017-07-27 10:46:08 -07004640 ASSERT_TRUE(mChildNewClient->isValid());
4641
4642 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4643
Robert Carr4cdc58f2017-08-23 14:22:20 -07004644 asTransaction([&](Transaction& t) {
4645 t.hide(mChild);
4646 t.show(mChildNewClient);
4647 t.setPosition(mChildNewClient, 10, 10);
4648 t.setPosition(mFGSurfaceControl, 64, 64);
4649 });
chaviw161410b02017-07-27 10:46:08 -07004650
4651 {
chaviw0e3479f2018-09-10 16:49:30 -07004652 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004653 // Top left of foreground must now be visible
4654 mCapture->expectFGColor(64, 64);
4655 // But 10 pixels in we should see the child surface
4656 mCapture->expectChildColor(74, 74);
4657 // And 10 more pixels we should be back to the foreground surface
4658 mCapture->expectFGColor(84, 84);
4659 }
4660
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004661 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004662
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004663 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004664
Robert Carr9524cb32017-02-13 11:32:32 -08004665 // Nothing should have changed.
4666 {
chaviw0e3479f2018-09-10 16:49:30 -07004667 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004668 mCapture->expectFGColor(64, 64);
4669 mCapture->expectChildColor(74, 74);
4670 mCapture->expectFGColor(84, 84);
4671 }
4672}
4673
chaviw5aedec92018-10-22 10:40:38 -07004674TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4675 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4676 sp<SurfaceControl> childNewClient =
4677 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4678 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4679
4680 ASSERT_TRUE(childNewClient != nullptr);
4681 ASSERT_TRUE(childNewClient->isValid());
4682
4683 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4684
4685 Transaction()
4686 .hide(mChild)
4687 .show(childNewClient)
4688 .setPosition(childNewClient, 10, 10)
4689 .setPosition(mFGSurfaceControl, 64, 64)
4690 .apply();
4691
4692 {
4693 mCapture = screenshot();
4694 // Top left of foreground must now be visible
4695 mCapture->expectFGColor(64, 64);
4696 // But 10 pixels in we should see the child surface
4697 mCapture->expectChildColor(74, 74);
4698 // And 10 more pixels we should be back to the foreground surface
4699 mCapture->expectFGColor(84, 84);
4700 }
4701
4702 Transaction().detachChildren(mFGSurfaceControl).apply();
4703 Transaction().hide(childNewClient).apply();
4704
4705 // Nothing should have changed.
4706 {
4707 mCapture = screenshot();
4708 mCapture->expectFGColor(64, 64);
4709 mCapture->expectChildColor(74, 74);
4710 mCapture->expectFGColor(84, 84);
4711 }
4712
4713 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4714 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4715 32);
4716 Transaction()
4717 .setLayer(newParentSurface, INT32_MAX - 1)
4718 .show(newParentSurface)
4719 .setPosition(newParentSurface, 20, 20)
4720 .reparent(childNewClient, newParentSurface->getHandle())
4721 .apply();
4722 {
4723 mCapture = screenshot();
4724 // Child is now hidden.
4725 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4726 }
4727}
chaviw43cb3cb2019-05-31 15:23:41 -07004728TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
4729 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4730 sp<SurfaceControl> childNewClient =
4731 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4732 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4733
4734 ASSERT_TRUE(childNewClient != nullptr);
4735 ASSERT_TRUE(childNewClient->isValid());
4736
4737 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4738
4739 Transaction()
4740 .hide(mChild)
4741 .show(childNewClient)
4742 .setPosition(childNewClient, 10, 10)
4743 .setPosition(mFGSurfaceControl, 64, 64)
4744 .apply();
4745
4746 {
4747 mCapture = screenshot();
4748 Rect rect = Rect(74, 74, 84, 84);
4749 mCapture->expectBorder(rect, Color{195, 63, 63, 255});
4750 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4751 }
4752
4753 Transaction()
4754 .deferTransactionUntil_legacy(childNewClient, mFGSurfaceControl->getHandle(),
4755 mFGSurfaceControl->getSurface()->getNextFrameNumber())
4756 .apply();
4757 Transaction().detachChildren(mFGSurfaceControl).apply();
4758 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(mFGSurfaceControl, Color::RED, 32, 32));
4759
4760 // BufferLayer can still dequeue buffers even though there's a detached layer with a
4761 // deferred transaction.
4762 {
4763 SCOPED_TRACE("new buffer");
4764 mCapture = screenshot();
4765 Rect rect = Rect(74, 74, 84, 84);
4766 mCapture->expectBorder(rect, Color::RED);
4767 mCapture->expectColor(rect, Color{200, 200, 200, 255});
4768 }
4769}
chaviw5aedec92018-10-22 10:40:38 -07004770
Robert Carr9b429f42017-04-17 14:56:57 -07004771TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004772 asTransaction([&](Transaction& t) {
4773 t.show(mChild);
4774 t.setPosition(mChild, 0, 0);
4775 t.setPosition(mFGSurfaceControl, 0, 0);
4776 });
Robert Carr9b429f42017-04-17 14:56:57 -07004777
4778 {
chaviw0e3479f2018-09-10 16:49:30 -07004779 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004780 // We've positioned the child in the top left.
4781 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004782 // But it's only 10x15.
4783 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004784 }
4785
Robert Carr4cdc58f2017-08-23 14:22:20 -07004786 asTransaction([&](Transaction& t) {
4787 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4788 // We cause scaling by 2.
4789 t.setSize(mFGSurfaceControl, 128, 128);
4790 });
Robert Carr9b429f42017-04-17 14:56:57 -07004791
4792 {
chaviw0e3479f2018-09-10 16:49:30 -07004793 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004794 // We've positioned the child in the top left.
4795 mCapture->expectChildColor(0, 0);
4796 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004797 mCapture->expectChildColor(19, 29);
4798 // And now it should be scaled all the way to 20x30
4799 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004800 }
4801}
4802
Robert Carr1725eee2017-04-26 18:32:15 -07004803// Regression test for b/37673612
4804TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004805 asTransaction([&](Transaction& t) {
4806 t.show(mChild);
4807 t.setPosition(mChild, 0, 0);
4808 t.setPosition(mFGSurfaceControl, 0, 0);
4809 });
Robert Carr1725eee2017-04-26 18:32:15 -07004810
4811 {
chaviw0e3479f2018-09-10 16:49:30 -07004812 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004813 // We've positioned the child in the top left.
4814 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004815 mCapture->expectChildColor(9, 14);
4816 // But it's only 10x15.
4817 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004818 }
Robert Carr1725eee2017-04-26 18:32:15 -07004819 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4820 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004821 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004822 sp<Surface> s = mFGSurfaceControl->getSurface();
4823 auto anw = static_cast<ANativeWindow*>(s.get());
4824 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4825 native_window_set_buffers_dimensions(anw, 64, 128);
4826 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4827 waitForPostedBuffers();
4828
4829 {
4830 // The child should still be in the same place and not have any strange scaling as in
4831 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004832 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004833 mCapture->expectChildColor(0, 0);
4834 mCapture->expectFGColor(10, 10);
4835 }
4836}
4837
Vishnu Nairc652ff82019-03-15 12:48:54 -07004838// A child with a buffer transform from its parents should be cropped by its parent bounds.
4839TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4840 asTransaction([&](Transaction& t) {
4841 t.show(mChild);
4842 t.setPosition(mChild, 0, 0);
4843 t.setPosition(mFGSurfaceControl, 0, 0);
4844 t.setSize(mChild, 100, 100);
4845 });
4846 fillSurfaceRGBA8(mChild, 200, 200, 200);
4847
4848 {
4849 mCapture = screenshot();
4850
4851 mCapture->expectChildColor(0, 0);
4852 mCapture->expectChildColor(63, 63);
4853 mCapture->expectBGColor(64, 64);
4854 }
4855
4856 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4857 sp<Surface> s = mFGSurfaceControl->getSurface();
4858 auto anw = static_cast<ANativeWindow*>(s.get());
4859 // Apply a 90 transform on the buffer.
4860 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4861 native_window_set_buffers_dimensions(anw, 64, 128);
4862 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4863 waitForPostedBuffers();
4864
4865 // The child should be cropped by the new parent bounds.
4866 {
4867 mCapture = screenshot();
4868 mCapture->expectChildColor(0, 0);
4869 mCapture->expectChildColor(99, 63);
4870 mCapture->expectFGColor(100, 63);
4871 mCapture->expectBGColor(128, 64);
4872 }
4873}
4874
4875// A child with a scale transform from its parents should be cropped by its parent bounds.
4876TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4877 asTransaction([&](Transaction& t) {
4878 t.show(mChild);
4879 t.setPosition(mChild, 0, 0);
4880 t.setPosition(mFGSurfaceControl, 0, 0);
4881 t.setSize(mChild, 200, 200);
4882 });
4883 fillSurfaceRGBA8(mChild, 200, 200, 200);
4884
4885 {
4886 mCapture = screenshot();
4887
4888 mCapture->expectChildColor(0, 0);
4889 mCapture->expectChildColor(63, 63);
4890 mCapture->expectBGColor(64, 64);
4891 }
4892
4893 asTransaction([&](Transaction& t) {
4894 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4895 // Set a scaling by 2.
4896 t.setSize(mFGSurfaceControl, 128, 128);
4897 });
4898
4899 // Child should inherit its parents scale but should be cropped by its parent bounds.
4900 {
4901 mCapture = screenshot();
4902 mCapture->expectChildColor(0, 0);
4903 mCapture->expectChildColor(127, 127);
4904 mCapture->expectBGColor(128, 128);
4905 }
4906}
4907
4908// Regression test for b/127368943
4909// Child should ignore the buffer transform but apply parent scale transform.
4910TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
4911 asTransaction([&](Transaction& t) {
4912 t.show(mChild);
4913 t.setPosition(mChild, 0, 0);
4914 t.setPosition(mFGSurfaceControl, 0, 0);
4915 });
4916
4917 {
4918 mCapture = screenshot();
4919 mCapture->expectChildColor(0, 0);
4920 mCapture->expectChildColor(9, 14);
4921 mCapture->expectFGColor(10, 15);
4922 }
4923
4924 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
4925 asTransaction([&](Transaction& t) {
4926 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4927 t.setSize(mFGSurfaceControl, 128, 64);
4928 });
4929 sp<Surface> s = mFGSurfaceControl->getSurface();
4930 auto anw = static_cast<ANativeWindow*>(s.get());
4931 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
4932 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
4933 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4934 native_window_set_buffers_dimensions(anw, 32, 64);
4935 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4936 waitForPostedBuffers();
4937
4938 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
4939 {
4940 mCapture = screenshot();
4941 mCapture->expectChildColor(0, 0);
4942 mCapture->expectChildColor(19, 29);
4943 mCapture->expectFGColor(20, 30);
4944 }
4945}
4946
Dan Stoza412903f2017-04-27 13:42:17 -07004947TEST_F(ChildLayerTest, Bug36858924) {
4948 // Destroy the child layer
4949 mChild.clear();
4950
4951 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004952 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4953 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004954
4955 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004956 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004957 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4958 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004959 t.show(mChild);
4960 });
Dan Stoza412903f2017-04-27 13:42:17 -07004961
4962 // Render the foreground surface a few times
4963 //
4964 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4965 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4966 // never acquire/release the first buffer
4967 ALOGI("Filling 1");
4968 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4969 ALOGI("Filling 2");
4970 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4971 ALOGI("Filling 3");
4972 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4973 ALOGI("Filling 4");
4974 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4975}
4976
chaviwf1961f72017-09-18 16:41:07 -07004977TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004978 asTransaction([&](Transaction& t) {
4979 t.show(mChild);
4980 t.setPosition(mChild, 10, 10);
4981 t.setPosition(mFGSurfaceControl, 64, 64);
4982 });
chaviw06178942017-07-27 10:25:59 -07004983
4984 {
chaviw0e3479f2018-09-10 16:49:30 -07004985 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004986 // Top left of foreground must now be visible
4987 mCapture->expectFGColor(64, 64);
4988 // But 10 pixels in we should see the child surface
4989 mCapture->expectChildColor(74, 74);
4990 // And 10 more pixels we should be back to the foreground surface
4991 mCapture->expectFGColor(84, 84);
4992 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004993
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004994 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004995
chaviw06178942017-07-27 10:25:59 -07004996 {
chaviw0e3479f2018-09-10 16:49:30 -07004997 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004998 mCapture->expectFGColor(64, 64);
4999 // In reparenting we should have exposed the entire foreground surface.
5000 mCapture->expectFGColor(74, 74);
5001 // And the child layer should now begin at 10, 10 (since the BG
5002 // layer is at (0, 0)).
5003 mCapture->expectBGColor(9, 9);
5004 mCapture->expectChildColor(10, 10);
5005 }
5006}
5007
chaviwf1961f72017-09-18 16:41:07 -07005008TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07005009 asTransaction([&](Transaction& t) {
5010 t.show(mChild);
5011 t.setPosition(mChild, 10, 10);
5012 t.setPosition(mFGSurfaceControl, 64, 64);
5013 });
chaviwf1961f72017-09-18 16:41:07 -07005014
5015 {
chaviw0e3479f2018-09-10 16:49:30 -07005016 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005017 // Top left of foreground must now be visible
5018 mCapture->expectFGColor(64, 64);
5019 // But 10 pixels in we should see the child surface
5020 mCapture->expectChildColor(74, 74);
5021 // And 10 more pixels we should be back to the foreground surface
5022 mCapture->expectFGColor(84, 84);
5023 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005024 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07005025 {
chaviw0e3479f2018-09-10 16:49:30 -07005026 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005027 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07005028 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08005029 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07005030 mCapture->expectFGColor(84, 84);
5031 }
5032}
5033
5034TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07005035 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08005036 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07005037 ASSERT_TRUE(newSurface->isValid());
5038
5039 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005040 asTransaction([&](Transaction& t) {
5041 t.hide(mChild);
5042 t.show(newSurface);
5043 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005044 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07005045 t.setPosition(mFGSurfaceControl, 64, 64);
5046 });
chaviwf1961f72017-09-18 16:41:07 -07005047
5048 {
chaviw0e3479f2018-09-10 16:49:30 -07005049 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005050 // Top left of foreground must now be visible
5051 mCapture->expectFGColor(64, 64);
5052 // At 10, 10 we should see the new surface
5053 mCapture->checkPixel(10, 10, 63, 195, 63);
5054 }
5055
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005056 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07005057
5058 {
chaviw0e3479f2018-09-10 16:49:30 -07005059 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07005060 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
5061 // mFGSurface, putting it at 74, 74.
5062 mCapture->expectFGColor(64, 64);
5063 mCapture->checkPixel(74, 74, 63, 195, 63);
5064 mCapture->expectFGColor(84, 84);
5065 }
5066}
5067
chaviwc9674332017-08-28 12:32:18 -07005068TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005069 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
5070 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07005071 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5072
5073 {
chaviw0e3479f2018-09-10 16:49:30 -07005074 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07005075 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
5076 // which begins at 64, 64
5077 mCapture->checkPixel(64, 64, 50, 50, 50);
5078 }
5079}
5080
Robert Carr503c7042017-09-27 15:06:08 -07005081TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005082 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07005083 fillSurfaceRGBA8(relative, 255, 255, 255);
5084
5085 Transaction t;
5086 t.setLayer(relative, INT32_MAX)
5087 .setRelativeLayer(mChild, relative->getHandle(), 1)
5088 .setPosition(mFGSurfaceControl, 0, 0)
5089 .apply(true);
5090
5091 // We expect that the child should have been elevated above our
5092 // INT_MAX layer even though it's not a child of it.
5093 {
chaviw0e3479f2018-09-10 16:49:30 -07005094 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005095 mCapture->expectChildColor(0, 0);
5096 mCapture->expectChildColor(9, 9);
5097 mCapture->checkPixel(10, 10, 255, 255, 255);
5098 }
5099}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005100
Vishnu Nair60356342018-11-13 13:00:45 -08005101class BoundlessLayerTest : public LayerUpdateTest {
5102protected:
5103 std::unique_ptr<ScreenCapture> mCapture;
5104};
5105
5106// Verify setting a size on a buffer layer has no effect.
5107TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5108 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005109 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5110 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005111 ASSERT_TRUE(bufferLayer->isValid());
5112 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5113 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5114 {
5115 mCapture = screenshot();
5116 // Top left of background must now be visible
5117 mCapture->expectBGColor(0, 0);
5118 // Foreground Surface bounds must be color layer
5119 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5120 // Buffer layer should not extend past buffer bounds
5121 mCapture->expectFGColor(95, 95);
5122 }
5123}
5124
5125// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5126// which will crop the color layer.
5127TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5128 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005129 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5130 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005131 ASSERT_TRUE(colorLayer->isValid());
5132 asTransaction([&](Transaction& t) {
5133 t.setColor(colorLayer, half3{0, 0, 0});
5134 t.show(colorLayer);
5135 });
5136 {
5137 mCapture = screenshot();
5138 // Top left of background must now be visible
5139 mCapture->expectBGColor(0, 0);
5140 // Foreground Surface bounds must be color layer
5141 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5142 // Color layer should not extend past foreground bounds
5143 mCapture->expectBGColor(129, 129);
5144 }
5145}
5146
5147// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5148// a crop which will be used to crop the color layer.
5149TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005150 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5151 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005152 ASSERT_TRUE(cropLayer->isValid());
5153 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005154 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5155 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005156 ASSERT_TRUE(colorLayer->isValid());
5157 asTransaction([&](Transaction& t) {
5158 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5159 t.setColor(colorLayer, half3{0, 0, 0});
5160 t.show(cropLayer);
5161 t.show(colorLayer);
5162 });
5163 {
5164 mCapture = screenshot();
5165 // Top left of background must now be visible
5166 mCapture->expectBGColor(0, 0);
5167 // Top left of foreground must now be visible
5168 mCapture->expectFGColor(64, 64);
5169 // 5 pixels from the foreground we should see the child surface
5170 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5171 // 10 pixels from the foreground we should be back to the foreground surface
5172 mCapture->expectFGColor(74, 74);
5173 }
5174}
5175
5176// Verify for boundless layer with no children, their transforms have no effect.
5177TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5178 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005179 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5180 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005181 ASSERT_TRUE(colorLayer->isValid());
5182 asTransaction([&](Transaction& t) {
5183 t.setPosition(colorLayer, 320, 320);
5184 t.setMatrix(colorLayer, 2, 0, 0, 2);
5185 t.setColor(colorLayer, half3{0, 0, 0});
5186 t.show(colorLayer);
5187 });
5188 {
5189 mCapture = screenshot();
5190 // Top left of background must now be visible
5191 mCapture->expectBGColor(0, 0);
5192 // Foreground Surface bounds must be color layer
5193 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5194 // Color layer should not extend past foreground bounds
5195 mCapture->expectBGColor(129, 129);
5196 }
5197}
5198
5199// Verify for boundless layer with children, their transforms have an effect.
5200TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5201 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005202 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5203 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005204 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5205 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005206 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5207 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005208 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5209 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005210 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5211 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005212 ASSERT_TRUE(colorLayer->isValid());
5213 asTransaction([&](Transaction& t) {
5214 t.setPosition(boundlessLayerRightShift, 32, 0);
5215 t.show(boundlessLayerRightShift);
5216 t.setPosition(boundlessLayerDownShift, 0, 32);
5217 t.show(boundlessLayerDownShift);
5218 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5219 t.setColor(colorLayer, half3{0, 0, 0});
5220 t.show(colorLayer);
5221 });
5222 {
5223 mCapture = screenshot();
5224 // Top left of background must now be visible
5225 mCapture->expectBGColor(0, 0);
5226 // Top left of foreground must now be visible
5227 mCapture->expectFGColor(64, 64);
5228 // Foreground Surface bounds must be color layer
5229 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5230 // Color layer should not extend past foreground bounds
5231 mCapture->expectBGColor(129, 129);
5232 }
5233}
5234
5235// Verify child layers do not get clipped if they temporarily move into the negative
5236// coordinate space as the result of an intermediate transformation.
5237TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5238 sp<SurfaceControl> boundlessLayer =
5239 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5240 0 /* flags */, mFGSurfaceControl.get());
5241 ASSERT_TRUE(boundlessLayer != nullptr);
5242 ASSERT_TRUE(boundlessLayer->isValid());
5243 sp<SurfaceControl> colorLayer =
5244 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5245 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5246 ASSERT_TRUE(colorLayer != nullptr);
5247 ASSERT_TRUE(colorLayer->isValid());
5248 asTransaction([&](Transaction& t) {
5249 // shift child layer off bounds. If this layer was not boundless, we will
5250 // expect the child layer to be cropped.
5251 t.setPosition(boundlessLayer, 32, 32);
5252 t.show(boundlessLayer);
5253 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5254 // undo shift by parent
5255 t.setPosition(colorLayer, -32, -32);
5256 t.setColor(colorLayer, half3{0, 0, 0});
5257 t.show(colorLayer);
5258 });
5259 {
5260 mCapture = screenshot();
5261 // Top left of background must now be visible
5262 mCapture->expectBGColor(0, 0);
5263 // Foreground Surface bounds must be color layer
5264 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5265 // Color layer should not extend past foreground bounds
5266 mCapture->expectBGColor(129, 129);
5267 }
5268}
5269
5270// Verify for boundless root layers with children, their transforms have an effect.
5271TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005272 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5273 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005274 ASSERT_TRUE(rootBoundlessLayer->isValid());
5275 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005276 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5277 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5278
Vishnu Nair60356342018-11-13 13:00:45 -08005279 ASSERT_TRUE(colorLayer->isValid());
5280 asTransaction([&](Transaction& t) {
5281 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5282 t.setPosition(rootBoundlessLayer, 32, 32);
5283 t.show(rootBoundlessLayer);
5284 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5285 t.setColor(colorLayer, half3{0, 0, 0});
5286 t.show(colorLayer);
5287 t.hide(mFGSurfaceControl);
5288 });
5289 {
5290 mCapture = screenshot();
5291 // Top left of background must now be visible
5292 mCapture->expectBGColor(0, 0);
5293 // Top left of foreground must now be visible
5294 mCapture->expectBGColor(31, 31);
5295 // Foreground Surface bounds must be color layer
5296 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5297 // Color layer should not extend past foreground bounds
5298 mCapture->expectBGColor(97, 97);
5299 }
5300}
Robert Carr503c7042017-09-27 15:06:08 -07005301
chaviwa76b2712017-09-20 12:02:26 -07005302class ScreenCaptureTest : public LayerUpdateTest {
5303protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005304 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005305};
5306
5307TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5308 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005309 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005310 mCapture->expectBGColor(0, 0);
5311 // Doesn't capture FG layer which is at 64, 64
5312 mCapture->expectBGColor(64, 64);
5313}
5314
5315TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5316 auto fgHandle = mFGSurfaceControl->getHandle();
5317
Vishnu Nair88a11f22018-11-28 18:30:57 -08005318 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5319 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005320 fillSurfaceRGBA8(child, 200, 200, 200);
5321
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005322 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005323
5324 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005325 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005326 mCapture->expectFGColor(10, 10);
5327 mCapture->expectChildColor(0, 0);
5328}
5329
Robert Carr578038f2018-03-09 12:25:24 -08005330TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5331 auto fgHandle = mFGSurfaceControl->getHandle();
5332
Vishnu Nair88a11f22018-11-28 18:30:57 -08005333 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5334 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005335 fillSurfaceRGBA8(child, 200, 200, 200);
5336
5337 SurfaceComposerClient::Transaction().show(child).apply(true);
5338
5339 // Captures mFGSurfaceControl's child
5340 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5341 mCapture->checkPixel(10, 10, 0, 0, 0);
5342 mCapture->expectChildColor(0, 0);
5343}
5344
Robert Carr866455f2019-04-02 16:28:26 -07005345TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5346 auto fgHandle = mFGSurfaceControl->getHandle();
5347
5348 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5349 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5350 fillSurfaceRGBA8(child, 200, 200, 200);
5351 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5352 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5353 fillSurfaceRGBA8(child2, 200, 0, 200);
5354
5355 SurfaceComposerClient::Transaction()
5356 .show(child)
5357 .show(child2)
5358 .setLayer(child, 1)
5359 .setLayer(child2, 2)
5360 .apply(true);
5361
5362 // Child2 would be visible but its excluded, so we should see child1 color instead.
5363 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5364 mCapture->checkPixel(10, 10, 0, 0, 0);
5365 mCapture->checkPixel(0, 0, 200, 200, 200);
5366}
5367
5368// Like the last test but verifies that children are also exclude.
5369TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5370 auto fgHandle = mFGSurfaceControl->getHandle();
5371
5372 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5373 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5374 fillSurfaceRGBA8(child, 200, 200, 200);
5375 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5376 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5377 fillSurfaceRGBA8(child2, 200, 0, 200);
5378 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5379 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5380 fillSurfaceRGBA8(child2, 200, 0, 200);
5381
5382 SurfaceComposerClient::Transaction()
5383 .show(child)
5384 .show(child2)
5385 .show(child3)
5386 .setLayer(child, 1)
5387 .setLayer(child2, 2)
5388 .apply(true);
5389
5390 // Child2 would be visible but its excluded, so we should see child1 color instead.
5391 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5392 mCapture->checkPixel(10, 10, 0, 0, 0);
5393 mCapture->checkPixel(0, 0, 200, 200, 200);
5394}
5395
chaviw50da5042018-04-09 13:49:37 -07005396TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005397 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5398 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005399
5400 fillSurfaceRGBA8(child, 200, 200, 200);
5401
5402 SurfaceComposerClient::Transaction().show(child).apply(true);
5403
5404 auto childHandle = child->getHandle();
5405
5406 // Captures child
5407 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5408 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5409 // Area outside of child's bounds is transparent.
5410 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5411}
5412
chaviw4b129c22018-04-09 16:19:43 -07005413TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5414 auto fgHandle = mFGSurfaceControl->getHandle();
5415
Vishnu Nair88a11f22018-11-28 18:30:57 -08005416 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5417 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5418 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005419 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005420 fillSurfaceRGBA8(child, 200, 200, 200);
5421 fillSurfaceRGBA8(relative, 100, 100, 100);
5422
5423 SurfaceComposerClient::Transaction()
5424 .show(child)
5425 // Set relative layer above fg layer so should be shown above when computing all layers.
5426 .setRelativeLayer(relative, fgHandle, 1)
5427 .show(relative)
5428 .apply(true);
5429
5430 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5431 ScreenCapture::captureLayers(&mCapture, fgHandle);
5432 mCapture->expectFGColor(10, 10);
5433 mCapture->expectChildColor(0, 0);
5434}
5435
5436TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5437 auto fgHandle = mFGSurfaceControl->getHandle();
5438
Vishnu Nair88a11f22018-11-28 18:30:57 -08005439 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5440 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5441 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5442 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005443 fillSurfaceRGBA8(child, 200, 200, 200);
5444 fillSurfaceRGBA8(relative, 100, 100, 100);
5445
5446 SurfaceComposerClient::Transaction()
5447 .show(child)
5448 // Set relative layer below fg layer but relative to child layer so it should be shown
5449 // above child layer.
5450 .setLayer(relative, -1)
5451 .setRelativeLayer(relative, child->getHandle(), 1)
5452 .show(relative)
5453 .apply(true);
5454
5455 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5456 // relative value should be taken into account, placing it above child layer.
5457 ScreenCapture::captureLayers(&mCapture, fgHandle);
5458 mCapture->expectFGColor(10, 10);
5459 // Relative layer is showing on top of child layer
5460 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5461}
Robert Carr578038f2018-03-09 12:25:24 -08005462
5463// In the following tests we verify successful skipping of a parent layer,
5464// so we use the same verification logic and only change how we mutate
5465// the parent layer to verify that various properties are ignored.
5466class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5467public:
5468 void SetUp() override {
5469 LayerUpdateTest::SetUp();
5470
Vishnu Nair88a11f22018-11-28 18:30:57 -08005471 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5472 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005473 fillSurfaceRGBA8(mChild, 200, 200, 200);
5474
5475 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5476 }
5477
Vishnu Nair333a9572019-02-15 16:05:56 -08005478 void verify(std::function<void()> verifyStartingState) {
5479 // Verify starting state before a screenshot is taken.
5480 verifyStartingState();
5481
5482 // Verify child layer does not inherit any of the properties of its
5483 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005484 auto fgHandle = mFGSurfaceControl->getHandle();
5485 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5486 mCapture->checkPixel(10, 10, 0, 0, 0);
5487 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005488
5489 // Verify all assumptions are still true after the screenshot is taken.
5490 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005491 }
5492
5493 std::unique_ptr<ScreenCapture> mCapture;
5494 sp<SurfaceControl> mChild;
5495};
5496
Vishnu Nair333a9572019-02-15 16:05:56 -08005497// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005498TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5499
5500 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5501
5502 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005503
5504 // Before and after reparenting, verify child is properly hidden
5505 // when rendering full-screen.
5506 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005507}
5508
5509TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005510 SurfaceComposerClient::Transaction()
5511 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5512 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005513
5514 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005515
5516 // Before and after reparenting, verify child is cropped by parent.
5517 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005518}
5519
Vishnu Nair333a9572019-02-15 16:05:56 -08005520// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005521TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005522 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005523
5524 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005525
Vishnu Nair333a9572019-02-15 16:05:56 -08005526 // Before and after reparenting, verify child is properly scaled.
5527 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005528}
5529
5530
chaviwa76b2712017-09-20 12:02:26 -07005531TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5532 auto fgHandle = mFGSurfaceControl->getHandle();
5533
Vishnu Nair88a11f22018-11-28 18:30:57 -08005534 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5535 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005536 fillSurfaceRGBA8(child, 200, 200, 200);
5537
Vishnu Nair88a11f22018-11-28 18:30:57 -08005538 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5539 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005540
5541 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5542 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005543 .show(child)
5544 .setPosition(grandchild, 5, 5)
5545 .show(grandchild)
5546 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005547
5548 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005549 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005550 mCapture->expectFGColor(10, 10);
5551 mCapture->expectChildColor(0, 0);
5552 mCapture->checkPixel(5, 5, 50, 50, 50);
5553}
5554
5555TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005556 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5557 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005558 fillSurfaceRGBA8(child, 200, 200, 200);
5559 auto childHandle = child->getHandle();
5560
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005561 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005562
5563 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005564 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005565 mCapture->expectChildColor(0, 0);
5566 mCapture->expectChildColor(9, 9);
5567}
5568
5569TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005570 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5571 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005572 fillSurfaceRGBA8(child, 200, 200, 200);
5573 auto childHandle = child->getHandle();
5574
Vishnu Nair88a11f22018-11-28 18:30:57 -08005575 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5576 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005577 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5578
5579 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005580 .show(child)
5581 .setPosition(grandchild, 5, 5)
5582 .show(grandchild)
5583 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005584
5585 auto grandchildHandle = grandchild->getHandle();
5586
5587 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005588 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005589 mCapture->checkPixel(0, 0, 50, 50, 50);
5590 mCapture->checkPixel(4, 4, 50, 50, 50);
5591}
5592
chaviw7206d492017-11-10 16:16:12 -08005593TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005594 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005595 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5596 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005597
Marissa Wall61c58622018-07-18 10:12:20 -07005598 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5599 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005600
5601 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005602 .setLayer(redLayer, INT32_MAX - 1)
5603 .show(redLayer)
5604 .show(blueLayer)
5605 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005606
5607 auto redLayerHandle = redLayer->getHandle();
5608
5609 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005610 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5611 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5612 // red area below the blue area
5613 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5614 // red area to the right of the blue area
5615 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005616
Marissa Wall861616d2018-10-22 12:52:23 -07005617 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005618 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005619 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5620 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005621 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005622 mCapture->checkPixel(30, 30, 0, 0, 0);
5623}
5624
5625TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005626 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005627 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5628 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005629
Marissa Wall61c58622018-07-18 10:12:20 -07005630 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5631 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005632
5633 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005634 .setLayer(redLayer, INT32_MAX - 1)
5635 .show(redLayer)
5636 .show(blueLayer)
5637 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005638
5639 auto redLayerHandle = redLayer->getHandle();
5640
5641 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005642 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5643 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5644 // red area below the blue area
5645 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5646 // red area to the right of the blue area
5647 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005648
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005649 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005650 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005651 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5652 // red area below the blue area
5653 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5654 // red area to the right of the blue area
5655 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005656 mCapture->checkPixel(30, 30, 0, 0, 0);
5657}
5658
5659TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005660 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005661
Marissa Wall61c58622018-07-18 10:12:20 -07005662 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005663
5664 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005665 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005666 SurfaceComposerClient::Transaction().apply(true);
5667
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005668 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005669
5670 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005671 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5672 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005673}
5674
chaviw8e3fe5d2018-02-22 10:55:42 -08005675
5676class DereferenceSurfaceControlTest : public LayerTransactionTest {
5677protected:
5678 void SetUp() override {
5679 LayerTransactionTest::SetUp();
5680 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005681 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005682 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005683 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005684 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5685 {
5686 SCOPED_TRACE("before anything");
5687 auto shot = screenshot();
5688 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5689 }
5690 }
5691 void TearDown() override {
5692 LayerTransactionTest::TearDown();
5693 bgLayer = 0;
5694 fgLayer = 0;
5695 }
5696
5697 sp<SurfaceControl> bgLayer;
5698 sp<SurfaceControl> fgLayer;
5699};
5700
5701TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5702 fgLayer = nullptr;
5703 {
5704 SCOPED_TRACE("after setting null");
5705 auto shot = screenshot();
5706 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5707 }
5708}
5709
5710TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5711 auto transaction = Transaction().show(fgLayer);
5712 fgLayer = nullptr;
5713 {
5714 SCOPED_TRACE("after setting null");
5715 auto shot = screenshot();
5716 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5717 }
5718}
5719
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005720class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5721protected:
5722 virtual void SetUp() {
5723 LayerTransactionTest::SetUp();
5724 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5725
5726 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5727 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5728
5729 sp<IGraphicBufferConsumer> consumer;
5730 BufferQueue::createBufferQueue(&mProducer, &consumer);
5731 consumer->setConsumerName(String8("Virtual disp consumer"));
5732 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5733 }
5734
5735 virtual void TearDown() {
5736 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5737 LayerTransactionTest::TearDown();
5738 mColorLayer = 0;
5739 }
5740
5741 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5742 mVirtualDisplay =
5743 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5744 asTransaction([&](Transaction& t) {
5745 t.setDisplaySurface(mVirtualDisplay, mProducer);
5746 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5747 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5748 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5749 });
5750 }
5751
5752 void createColorLayer(uint32_t layerStack) {
5753 mColorLayer =
5754 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5755 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5756 ASSERT_TRUE(mColorLayer != nullptr);
5757 ASSERT_TRUE(mColorLayer->isValid());
5758 asTransaction([&](Transaction& t) {
5759 t.setLayerStack(mColorLayer, layerStack);
5760 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5761 t.setLayer(mColorLayer, INT32_MAX - 2);
5762 t.setColor(mColorLayer,
5763 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5764 mExpectedColor.b / 255.0f});
5765 t.show(mColorLayer);
5766 });
5767 }
5768
5769 DisplayInfo mMainDisplayInfo;
5770 sp<IBinder> mMainDisplay;
5771 sp<IBinder> mVirtualDisplay;
5772 sp<IGraphicBufferProducer> mProducer;
5773 sp<SurfaceControl> mColorLayer;
5774 Color mExpectedColor = {63, 63, 195, 255};
5775};
5776
5777TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5778 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5779 createColorLayer(1 /* layerStack */);
5780
5781 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5782
5783 // Verify color layer does not render on main display.
5784 std::unique_ptr<ScreenCapture> sc;
5785 ScreenCapture::captureScreen(&sc, mMainDisplay);
5786 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5787 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5788
5789 // Verify color layer renders correctly on virtual display.
5790 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5791 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5792 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5793}
5794
5795TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5796 // Create a display and set its layer stack to the main display's layer stack so
5797 // the contents of the main display are mirrored on to the virtual display.
5798
5799 // Assumption here is that the new mirrored display has the same viewport as the
5800 // primary display that it is mirroring.
5801 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5802 createColorLayer(0 /* layerStack */);
5803
5804 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5805
5806 // Verify color layer renders correctly on main display and it is mirrored on the
5807 // virtual display.
5808 std::unique_ptr<ScreenCapture> sc;
5809 ScreenCapture::captureScreen(&sc, mMainDisplay);
5810 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5811 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5812
5813 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5814 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5815 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5816}
5817
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005818class DisplayActiveConfigTest : public ::testing::Test {
5819protected:
5820 void SetUp() override {
5821 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5822 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5823 EXPECT_GT(mDisplayconfigs.size(), 0);
5824
5825 // set display power to on to make sure config can be changed
5826 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5827 }
5828
5829 sp<IBinder> mDisplayToken;
5830 Vector<DisplayInfo> mDisplayconfigs;
5831};
5832
5833TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5834 std::vector<int32_t> allowedConfigs;
5835
5836 // Add all configs to the allowed configs
5837 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5838 allowedConfigs.push_back(i);
5839 }
5840
5841 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5842 EXPECT_EQ(res, NO_ERROR);
5843
5844 std::vector<int32_t> outConfigs;
5845 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5846 EXPECT_EQ(res, NO_ERROR);
5847 EXPECT_EQ(allowedConfigs, outConfigs);
5848}
5849
5850TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5851 // we need at least 2 configs available for this test
5852 if (mDisplayconfigs.size() <= 1) return;
5853
5854 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5855
5856 // We want to set the allowed config to everything but the active config
5857 std::vector<int32_t> allowedConfigs;
5858 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5859 if (i != activeConfig) {
5860 allowedConfigs.push_back(i);
5861 }
5862 }
5863
5864 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5865 EXPECT_EQ(res, NO_ERROR);
5866
5867 // Allow some time for the config change
5868 std::this_thread::sleep_for(200ms);
5869
5870 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5871 EXPECT_NE(activeConfig, newActiveConfig);
5872
5873 // Make sure the new config is part of allowed config
5874 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5875 allowedConfigs.end());
5876}
5877
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005878} // namespace android