blob: d03c25df7097322507cd2b2c4cd33419fe200048 [file] [log] [blame]
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Chia-I Wu718daf82017-10-20 11:57:17 -070017#include <algorithm>
Marissa Wallfda30bb2018-10-12 11:34:28 -070018#include <chrono>
19#include <cinttypes>
Chia-I Wu718daf82017-10-20 11:57:17 -070020#include <functional>
21#include <limits>
22#include <ostream>
Marissa Wallfda30bb2018-10-12 11:34:28 -070023#include <thread>
Chia-I Wu718daf82017-10-20 11:57:17 -070024
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070025#include <gtest/gtest.h>
26
Michael Lentine5a16a622015-05-21 13:48:24 -070027#include <android/native_window.h>
28
Alec Mouri80863a62019-01-17 15:19:35 -080029#include <binder/ProcessState.h>
30#include <gui/BufferItemConsumer.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080031#include <gui/ISurfaceComposer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070032#include <gui/LayerState.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080033#include <gui/Surface.h>
34#include <gui/SurfaceComposerClient.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070035#include <hardware/hwcomposer_defs.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080036#include <private/android_filesystem_config.h>
Ady Abrahamdf9df4a2019-03-12 17:32:05 -070037#include <private/gui/ComposerService.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080038
Ady Abraham2a6ab2a2018-10-26 14:25:30 -070039#include <ui/ColorSpace.h>
Mathias Agopianc666cae2012-07-25 18:56:13 -070040#include <ui/DisplayInfo.h>
Chia-I Wu718daf82017-10-20 11:57:17 -070041#include <ui/Rect.h>
Chia-I Wu1078bbb2017-10-20 11:29:02 -070042#include <utils/String8.h>
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070043
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070044#include <math.h>
chaviw13fdc492017-06-27 12:40:18 -070045#include <math/vec3.h>
Robert Carrfa8855f2019-02-19 10:05:00 -080046#include <sys/types.h>
47#include <unistd.h>
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -070048
Marissa Wall713b63f2018-10-17 15:42:43 -070049#include "BufferGenerator.h"
50
Jamie Gennis23c2c5d2011-10-11 19:22:19 -070051namespace android {
52
Chia-I Wu718daf82017-10-20 11:57:17 -070053namespace {
54
55struct Color {
56 uint8_t r;
57 uint8_t g;
58 uint8_t b;
59 uint8_t a;
60
61 static const Color RED;
Chia-I Wu0ea0f822017-10-31 10:14:40 -070062 static const Color GREEN;
Chia-I Wu49313302017-10-31 10:14:40 -070063 static const Color BLUE;
Chia-I Wu93853fe2017-11-02 08:30:27 -070064 static const Color WHITE;
Chia-I Wu718daf82017-10-20 11:57:17 -070065 static const Color BLACK;
Chia-I Wu2113bdd2017-11-01 15:16:35 -070066 static const Color TRANSPARENT;
Chia-I Wu718daf82017-10-20 11:57:17 -070067};
68
69const Color Color::RED{255, 0, 0, 255};
Chia-I Wu0ea0f822017-10-31 10:14:40 -070070const Color Color::GREEN{0, 255, 0, 255};
Chia-I Wu49313302017-10-31 10:14:40 -070071const Color Color::BLUE{0, 0, 255, 255};
Chia-I Wu93853fe2017-11-02 08:30:27 -070072const Color Color::WHITE{255, 255, 255, 255};
Chia-I Wu718daf82017-10-20 11:57:17 -070073const Color Color::BLACK{0, 0, 0, 255};
Chia-I Wu2113bdd2017-11-01 15:16:35 -070074const Color Color::TRANSPARENT{0, 0, 0, 0};
Chia-I Wu718daf82017-10-20 11:57:17 -070075
Marissa Wall61c58622018-07-18 10:12:20 -070076using android::hardware::graphics::common::V1_1::BufferUsage;
Marissa Wallfda30bb2018-10-12 11:34:28 -070077using namespace std::chrono_literals;
Marissa Wall61c58622018-07-18 10:12:20 -070078
Chia-I Wu718daf82017-10-20 11:57:17 -070079std::ostream& operator<<(std::ostream& os, const Color& color) {
80 os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
81 return os;
82}
83
84// Fill a region with the specified color.
Marissa Wall61c58622018-07-18 10:12:20 -070085void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
86 const Color& color) {
87 Rect r(0, 0, buffer.width, buffer.height);
88 if (!r.intersect(rect, &r)) {
89 return;
Chia-I Wu718daf82017-10-20 11:57:17 -070090 }
91
Marissa Wall61c58622018-07-18 10:12:20 -070092 int32_t width = r.right - r.left;
93 int32_t height = r.bottom - r.top;
94
95 for (int32_t row = 0; row < height; row++) {
96 uint8_t* dst =
97 static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
98 for (int32_t column = 0; column < width; column++) {
Chia-I Wu718daf82017-10-20 11:57:17 -070099 dst[0] = color.r;
100 dst[1] = color.g;
101 dst[2] = color.b;
102 dst[3] = color.a;
103 dst += 4;
104 }
105 }
106}
107
Marissa Wall61c58622018-07-18 10:12:20 -0700108// Fill a region with the specified color.
109void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
110 Rect r(0, 0, buffer->width, buffer->height);
111 if (!r.intersect(rect, &r)) {
112 return;
113 }
114
115 int32_t width = r.right - r.left;
116 int32_t height = r.bottom - r.top;
117
118 uint8_t* pixels;
119 buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
120 reinterpret_cast<void**>(&pixels));
121
122 for (int32_t row = 0; row < height; row++) {
123 uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
124 for (int32_t column = 0; column < width; column++) {
125 dst[0] = color.r;
126 dst[1] = color.g;
127 dst[2] = color.b;
128 dst[3] = color.a;
129 dst += 4;
130 }
131 }
132 buffer->unlock();
133}
134
Chia-I Wu718daf82017-10-20 11:57:17 -0700135// Check if a region has the specified color.
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000136void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
Chia-I Wu718daf82017-10-20 11:57:17 -0700137 const Color& color, uint8_t tolerance) {
138 int32_t x = rect.left;
139 int32_t y = rect.top;
140 int32_t width = rect.right - rect.left;
141 int32_t height = rect.bottom - rect.top;
142
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000143 int32_t bufferWidth = int32_t(outBuffer->getWidth());
144 int32_t bufferHeight = int32_t(outBuffer->getHeight());
145 if (x + width > bufferWidth) {
146 x = std::min(x, bufferWidth);
147 width = bufferWidth - x;
Chia-I Wu718daf82017-10-20 11:57:17 -0700148 }
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000149 if (y + height > bufferHeight) {
150 y = std::min(y, bufferHeight);
151 height = bufferHeight - y;
Chia-I Wu718daf82017-10-20 11:57:17 -0700152 }
153
154 auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
155 uint8_t tmp = a >= b ? a - b : b - a;
156 return tmp <= tolerance;
157 };
158 for (int32_t j = 0; j < height; j++) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000159 const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
Chia-I Wu718daf82017-10-20 11:57:17 -0700160 for (int32_t i = 0; i < width; i++) {
161 const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
162 EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
163 << "pixel @ (" << x + i << ", " << y + j << "): "
164 << "expected (" << color << "), "
165 << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
166 src += 4;
167 }
168 }
169}
170
171} // anonymous namespace
172
Robert Carr4cdc58f2017-08-23 14:22:20 -0700173using Transaction = SurfaceComposerClient::Transaction;
174
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700175// Fill an RGBA_8888 formatted surface with a single color.
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700176static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
177 bool unlock = true) {
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800178 ANativeWindow_Buffer outBuffer;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700179 sp<Surface> s = sc->getSurface();
Peiyong Lin566a3b42018-01-09 18:22:43 -0800180 ASSERT_TRUE(s != nullptr);
181 ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800182 uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700183 for (int y = 0; y < outBuffer.height; y++) {
184 for (int x = 0; x < outBuffer.width; x++) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700185 uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700186 pixel[0] = r;
187 pixel[1] = g;
188 pixel[2] = b;
189 pixel[3] = 255;
190 }
191 }
Robert Carr7bf247e2017-05-18 14:02:49 -0700192 if (unlock) {
193 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
194 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700195}
196
197// A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check
198// individual pixel values for testing purposes.
199class ScreenCapture : public RefBase {
200public:
chaviw0e3479f2018-09-10 16:49:30 -0700201 static void captureScreen(std::unique_ptr<ScreenCapture>* sc) {
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800202 captureScreen(sc, SurfaceComposerClient::getInternalDisplayToken());
203 }
204
205 static void captureScreen(std::unique_ptr<ScreenCapture>* sc, sp<IBinder> displayToken) {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800206 const auto sf = ComposerService::getComposerService();
Robert Carr4cdc58f2017-08-23 14:22:20 -0700207 SurfaceComposerClient::Transaction().apply(true);
208
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000209 sp<GraphicBuffer> outBuffer;
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800210 ASSERT_EQ(NO_ERROR, sf->captureScreen(displayToken, &outBuffer, Rect(), 0, 0, false));
chaviw0e3479f2018-09-10 16:49:30 -0700211 *sc = std::make_unique<ScreenCapture>(outBuffer);
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000212 }
213
214 static void captureLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
215 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
216 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
217 SurfaceComposerClient::Transaction().apply(true);
218
219 sp<GraphicBuffer> outBuffer;
220 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale));
221 *sc = std::make_unique<ScreenCapture>(outBuffer);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700222 }
223
Robert Carr578038f2018-03-09 12:25:24 -0800224 static void captureChildLayers(std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
225 Rect crop = Rect::EMPTY_RECT, float frameScale = 1.0) {
226 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
227 SurfaceComposerClient::Transaction().apply(true);
228
229 sp<GraphicBuffer> outBuffer;
230 ASSERT_EQ(NO_ERROR, sf->captureLayers(parentHandle, &outBuffer, crop, frameScale, true));
231 *sc = std::make_unique<ScreenCapture>(outBuffer);
232 }
233
Robert Carr866455f2019-04-02 16:28:26 -0700234 static void captureChildLayersExcluding(
235 std::unique_ptr<ScreenCapture>* sc, sp<IBinder>& parentHandle,
236 std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>> excludeLayers) {
237 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
238 SurfaceComposerClient::Transaction().apply(true);
239
240 sp<GraphicBuffer> outBuffer;
241 ASSERT_EQ(NO_ERROR,
242 sf->captureLayers(parentHandle, &outBuffer, ui::Dataspace::V0_SRGB,
243 ui::PixelFormat::RGBA_8888, Rect::EMPTY_RECT, excludeLayers,
244 1.0f, true));
245 *sc = std::make_unique<ScreenCapture>(outBuffer);
246 }
247
Chia-I Wu718daf82017-10-20 11:57:17 -0700248 void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000249 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
250 expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
Chia-I Wu718daf82017-10-20 11:57:17 -0700251 }
252
253 void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000254 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
Chia-I Wu718daf82017-10-20 11:57:17 -0700255 const bool leftBorder = rect.left > 0;
256 const bool topBorder = rect.top > 0;
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000257 const bool rightBorder = rect.right < int32_t(mOutBuffer->getWidth());
258 const bool bottomBorder = rect.bottom < int32_t(mOutBuffer->getHeight());
Chia-I Wu718daf82017-10-20 11:57:17 -0700259
260 if (topBorder) {
261 Rect top(rect.left, rect.top - 1, rect.right, rect.top);
262 if (leftBorder) {
263 top.left -= 1;
264 }
265 if (rightBorder) {
266 top.right += 1;
267 }
268 expectColor(top, color, tolerance);
269 }
270 if (leftBorder) {
271 Rect left(rect.left - 1, rect.top, rect.left, rect.bottom);
272 expectColor(left, color, tolerance);
273 }
274 if (rightBorder) {
275 Rect right(rect.right, rect.top, rect.right + 1, rect.bottom);
276 expectColor(right, color, tolerance);
277 }
278 if (bottomBorder) {
279 Rect bottom(rect.left, rect.bottom, rect.right, rect.bottom + 1);
280 if (leftBorder) {
281 bottom.left -= 1;
282 }
283 if (rightBorder) {
284 bottom.right += 1;
285 }
286 expectColor(bottom, color, tolerance);
287 }
288 }
289
Chia-I Wu93853fe2017-11-02 08:30:27 -0700290 void expectQuadrant(const Rect& rect, const Color& topLeft, const Color& topRight,
291 const Color& bottomLeft, const Color& bottomRight, bool filtered = false,
292 uint8_t tolerance = 0) {
293 ASSERT_TRUE((rect.right - rect.left) % 2 == 0 && (rect.bottom - rect.top) % 2 == 0);
294
295 const int32_t centerX = rect.left + (rect.right - rect.left) / 2;
296 const int32_t centerY = rect.top + (rect.bottom - rect.top) / 2;
297 // avoid checking borders due to unspecified filtering behavior
298 const int32_t offsetX = filtered ? 2 : 0;
299 const int32_t offsetY = filtered ? 2 : 0;
300 expectColor(Rect(rect.left, rect.top, centerX - offsetX, centerY - offsetY), topLeft,
301 tolerance);
302 expectColor(Rect(centerX + offsetX, rect.top, rect.right, centerY - offsetY), topRight,
303 tolerance);
304 expectColor(Rect(rect.left, centerY + offsetY, centerX - offsetX, rect.bottom), bottomLeft,
305 tolerance);
306 expectColor(Rect(centerX + offsetX, centerY + offsetY, rect.right, rect.bottom),
307 bottomRight, tolerance);
308 }
309
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700310 void checkPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000311 ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
312 const uint8_t* pixel = mPixels + (4 * (y * mOutBuffer->getStride() + x));
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700313 if (r != pixel[0] || g != pixel[1] || b != pixel[2]) {
314 String8 err(String8::format("pixel @ (%3d, %3d): "
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700315 "expected [%3d, %3d, %3d], got [%3d, %3d, %3d]",
316 x, y, r, g, b, pixel[0], pixel[1], pixel[2]));
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -0700317 EXPECT_EQ(String8(), err) << err.string();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700318 }
319 }
320
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700321 void expectFGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 195, 63, 63); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700322
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700323 void expectBGColor(uint32_t x, uint32_t y) { checkPixel(x, y, 63, 63, 195); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700324
Chia-I Wu1078bbb2017-10-20 11:29:02 -0700325 void expectChildColor(uint32_t x, uint32_t y) { checkPixel(x, y, 200, 200, 200); }
Robert Carr1f0a16a2016-10-24 16:27:39 -0700326
Chih-Hung Hsieh22749042018-12-20 15:50:39 -0800327 explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) {
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000328 mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels));
Michael Lentine5a16a622015-05-21 13:48:24 -0700329 }
Jamie Gennis23c2c5d2011-10-11 19:22:19 -0700330
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000331 ~ScreenCapture() { mOutBuffer->unlock(); }
chaviwa76b2712017-09-20 12:02:26 -0700332
333private:
Chavi Weingarten40482ff2017-11-30 01:51:40 +0000334 sp<GraphicBuffer> mOutBuffer;
Peiyong Lin566a3b42018-01-09 18:22:43 -0800335 uint8_t* mPixels = nullptr;
chaviwa76b2712017-09-20 12:02:26 -0700336};
337
Chia-I Wu718daf82017-10-20 11:57:17 -0700338class LayerTransactionTest : public ::testing::Test {
339protected:
340 void SetUp() override {
341 mClient = new SurfaceComposerClient;
342 ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
343
344 ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700345
346 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
Ady Abraham37965d42018-11-01 13:43:32 -0700347 ASSERT_NO_FATAL_FAILURE(sf->getColorManagement(&mColorManagementUsed));
Chia-I Wu718daf82017-10-20 11:57:17 -0700348 }
349
chaviw0e3479f2018-09-10 16:49:30 -0700350 virtual void TearDown() {
351 mBlackBgSurface = 0;
352 mClient->dispose();
353 mClient = 0;
354 }
355
Marissa Wallfda30bb2018-10-12 11:34:28 -0700356 virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
357 const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800358 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
359 auto layer =
360 createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent);
Chia-I Wu718daf82017-10-20 11:57:17 -0700361
Vishnu Nair60356342018-11-13 13:00:45 -0800362 Transaction t;
363 t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
Vishnu Nair60356342018-11-13 13:00:45 -0800364
365 status_t error = t.apply();
Chia-I Wu718daf82017-10-20 11:57:17 -0700366 if (error != NO_ERROR) {
367 ADD_FAILURE() << "failed to initialize SurfaceControl";
368 layer.clear();
369 }
370
371 return layer;
372 }
373
Vishnu Nair88a11f22018-11-28 18:30:57 -0800374 virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
375 const char* name, uint32_t width, uint32_t height,
376 PixelFormat format, uint32_t flags,
377 SurfaceControl* parent = nullptr) {
378 auto layer = client->createSurface(String8(name), width, height, format, flags, parent);
379 EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
380 return layer;
381 }
382
Marissa Wallfda30bb2018-10-12 11:34:28 -0700383 virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
chaviwf66724d2018-11-28 16:35:21 -0800384 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
385 return createLayer(mClient, name, width, height, flags, parent);
Marissa Wallfda30bb2018-10-12 11:34:28 -0700386 }
387
Marissa Wall61c58622018-07-18 10:12:20 -0700388 ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700389 // wait for previous transactions (such as setSize) to complete
390 Transaction().apply(true);
391
392 ANativeWindow_Buffer buffer = {};
393 EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
394
395 return buffer;
396 }
397
Marissa Wall61c58622018-07-18 10:12:20 -0700398 void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700399 ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
400
401 // wait for the newly posted buffer to be latched
402 waitForLayerBuffers();
403 }
404
Marissa Wall61c58622018-07-18 10:12:20 -0700405 virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
406 int32_t bufferWidth, int32_t bufferHeight) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700407 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700408 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
409 fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
410 postBufferQueueLayerBuffer(layer);
Chia-I Wu718daf82017-10-20 11:57:17 -0700411 }
412
Marissa Wall61c58622018-07-18 10:12:20 -0700413 virtual void fillBufferStateLayerColor(const sp<SurfaceControl>& layer, const Color& color,
414 int32_t bufferWidth, int32_t bufferHeight) {
415 sp<GraphicBuffer> buffer =
416 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
417 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
418 BufferUsage::COMPOSER_OVERLAY,
419 "test");
420 fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
Marissa Wall861616d2018-10-22 12:52:23 -0700421 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -0700422 }
423
424 void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
425 int32_t bufferWidth, int32_t bufferHeight) {
426 switch (mLayerType) {
427 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
428 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
429 break;
430 case ISurfaceComposerClient::eFXSurfaceBufferState:
431 fillBufferStateLayerColor(layer, color, bufferWidth, bufferHeight);
432 break;
433 default:
434 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
435 }
436 }
437
438 void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
439 int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
Chia-I Wu93853fe2017-11-02 08:30:27 -0700440 const Color& topRight, const Color& bottomLeft,
441 const Color& bottomRight) {
Marissa Wall61c58622018-07-18 10:12:20 -0700442 switch (mLayerType) {
443 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
444 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
445 bottomLeft, bottomRight);
446 break;
447 case ISurfaceComposerClient::eFXSurfaceBufferState:
448 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
449 bottomLeft, bottomRight);
450 break;
451 default:
452 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
453 }
454 }
455
456 virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
457 int32_t bufferHeight, const Color& topLeft,
458 const Color& topRight, const Color& bottomLeft,
459 const Color& bottomRight) {
Chia-I Wu93853fe2017-11-02 08:30:27 -0700460 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -0700461 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
462 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700463
Marissa Wall61c58622018-07-18 10:12:20 -0700464 const int32_t halfW = bufferWidth / 2;
465 const int32_t halfH = bufferHeight / 2;
466 fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
467 fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
468 fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
469 fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
470 bottomRight);
Chia-I Wu93853fe2017-11-02 08:30:27 -0700471
Marissa Wall61c58622018-07-18 10:12:20 -0700472 postBufferQueueLayerBuffer(layer);
473 }
474
475 virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
476 int32_t bufferHeight, const Color& topLeft,
477 const Color& topRight, const Color& bottomLeft,
478 const Color& bottomRight) {
479 sp<GraphicBuffer> buffer =
480 new GraphicBuffer(bufferWidth, bufferHeight, PIXEL_FORMAT_RGBA_8888, 1,
481 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
482 BufferUsage::COMPOSER_OVERLAY,
483 "test");
484
485 ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
486
487 const int32_t halfW = bufferWidth / 2;
488 const int32_t halfH = bufferHeight / 2;
489 fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
490 fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
491 fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
492 fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
493
494 Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
Chia-I Wu93853fe2017-11-02 08:30:27 -0700495 }
496
chaviw0e3479f2018-09-10 16:49:30 -0700497 std::unique_ptr<ScreenCapture> screenshot() {
498 std::unique_ptr<ScreenCapture> screenshot;
499 ScreenCapture::captureScreen(&screenshot);
Chia-I Wu718daf82017-10-20 11:57:17 -0700500 return screenshot;
501 }
502
Vishnu Nairb927e1f2019-02-19 13:36:15 -0800503 void asTransaction(const std::function<void(Transaction&)>& exec) {
504 Transaction t;
505 exec(t);
506 t.apply(true);
507 }
508
Marissa Wall713b63f2018-10-17 15:42:43 -0700509 static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
510 static BufferGenerator bufferGenerator;
511 return bufferGenerator.get(outBuffer, outFence);
512 }
513
Chia-I Wu718daf82017-10-20 11:57:17 -0700514 sp<SurfaceComposerClient> mClient;
515
516 sp<IBinder> mDisplay;
517 uint32_t mDisplayWidth;
518 uint32_t mDisplayHeight;
519 uint32_t mDisplayLayerStack;
Marissa Wall861616d2018-10-22 12:52:23 -0700520 Rect mDisplayRect = Rect::INVALID_RECT;
Chia-I Wu718daf82017-10-20 11:57:17 -0700521
522 // leave room for ~256 layers
523 const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
524
chaviw0e3479f2018-09-10 16:49:30 -0700525 sp<SurfaceControl> mBlackBgSurface;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700526 bool mColorManagementUsed;
527
Chia-I Wu718daf82017-10-20 11:57:17 -0700528private:
529 void SetUpDisplay() {
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800530 mDisplay = mClient->getInternalDisplayToken();
531 ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
Chia-I Wu718daf82017-10-20 11:57:17 -0700532
533 // get display width/height
534 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800535 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(mDisplay, &info));
Chia-I Wu718daf82017-10-20 11:57:17 -0700536 mDisplayWidth = info.w;
537 mDisplayHeight = info.h;
Marissa Wall861616d2018-10-22 12:52:23 -0700538 mDisplayRect =
539 Rect(static_cast<int32_t>(mDisplayWidth), static_cast<int32_t>(mDisplayHeight));
Chia-I Wu718daf82017-10-20 11:57:17 -0700540
541 // After a new buffer is queued, SurfaceFlinger is notified and will
542 // latch the new buffer on next vsync. Let's heuristically wait for 3
543 // vsyncs.
544 mBufferPostDelay = int32_t(1e6 / info.fps) * 3;
545
546 mDisplayLayerStack = 0;
chaviw0e3479f2018-09-10 16:49:30 -0700547
Vishnu Nair88a11f22018-11-28 18:30:57 -0800548 mBlackBgSurface =
549 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
550 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
chaviw0e3479f2018-09-10 16:49:30 -0700551
Chia-I Wu718daf82017-10-20 11:57:17 -0700552 // set layer stack (b/68888219)
553 Transaction t;
554 t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
Vishnu Nair60356342018-11-13 13:00:45 -0800555 t.setCrop_legacy(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
chaviw0e3479f2018-09-10 16:49:30 -0700556 t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
557 t.setColor(mBlackBgSurface, half3{0, 0, 0});
558 t.setLayer(mBlackBgSurface, mLayerZBase);
Chia-I Wu718daf82017-10-20 11:57:17 -0700559 t.apply();
560 }
561
chaviw0e3479f2018-09-10 16:49:30 -0700562 void waitForLayerBuffers() {
563 // Request an empty transaction to get applied synchronously to ensure the buffer is
564 // latched.
565 Transaction().apply(true);
566 usleep(mBufferPostDelay);
567 }
Chia-I Wu718daf82017-10-20 11:57:17 -0700568
569 int32_t mBufferPostDelay;
Alec Mouri80863a62019-01-17 15:19:35 -0800570
571 friend class LayerRenderPathTestHarness;
572};
573enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };
574
575class LayerRenderPathTestHarness {
576public:
577 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
578 : mDelegate(delegate), mRenderPath(renderPath) {}
579
580 std::unique_ptr<ScreenCapture> getScreenCapture() {
581 switch (mRenderPath) {
582 case RenderPath::SCREENSHOT:
583 return mDelegate->screenshot();
584 case RenderPath::VIRTUAL_DISPLAY:
585
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800586 const auto mainDisplay = SurfaceComposerClient::getInternalDisplayToken();
Alec Mouri80863a62019-01-17 15:19:35 -0800587 DisplayInfo mainDisplayInfo;
588 SurfaceComposerClient::getDisplayInfo(mainDisplay, &mainDisplayInfo);
589
590 sp<IBinder> vDisplay;
591 sp<IGraphicBufferProducer> producer;
592 sp<IGraphicBufferConsumer> consumer;
593 sp<BufferItemConsumer> itemConsumer;
594 BufferQueue::createBufferQueue(&producer, &consumer);
595
596 consumer->setConsumerName(String8("Virtual disp consumer"));
597 consumer->setDefaultBufferSize(mainDisplayInfo.w, mainDisplayInfo.h);
598
599 itemConsumer = new BufferItemConsumer(consumer,
600 // Sample usage bits from screenrecord
601 GRALLOC_USAGE_HW_VIDEO_ENCODER |
602 GRALLOC_USAGE_SW_READ_OFTEN);
603
604 vDisplay = SurfaceComposerClient::createDisplay(String8("VirtualDisplay"),
605 false /*secure*/);
606
607 SurfaceComposerClient::Transaction t;
608 t.setDisplaySurface(vDisplay, producer);
609 t.setDisplayLayerStack(vDisplay, 0);
610 t.setDisplayProjection(vDisplay, mainDisplayInfo.orientation,
611 Rect(mainDisplayInfo.viewportW, mainDisplayInfo.viewportH),
612 Rect(mainDisplayInfo.w, mainDisplayInfo.h));
613 t.apply();
614 SurfaceComposerClient::Transaction().apply(true);
615 BufferItem item;
616 itemConsumer->acquireBuffer(&item, 0, true);
617 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer);
618 itemConsumer->releaseBuffer(item);
619 SurfaceComposerClient::destroyDisplay(vDisplay);
620 return sc;
621 }
622 }
623
624protected:
625 LayerTransactionTest* mDelegate;
626 RenderPath mRenderPath;
Chia-I Wu718daf82017-10-20 11:57:17 -0700627};
628
Alec Mouri80863a62019-01-17 15:19:35 -0800629class LayerTypeTransactionHarness : public LayerTransactionTest {
Marissa Wall61c58622018-07-18 10:12:20 -0700630public:
Alec Mouri80863a62019-01-17 15:19:35 -0800631 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
Marissa Wall61c58622018-07-18 10:12:20 -0700632
633 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Alec Mouri80863a62019-01-17 15:19:35 -0800634 uint32_t flags = 0, SurfaceControl* parent = nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700635 // if the flags already have a layer type specified, return an error
636 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
637 return nullptr;
638 }
chaviwf66724d2018-11-28 16:35:21 -0800639 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent);
Marissa Wall61c58622018-07-18 10:12:20 -0700640 }
641
642 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth,
643 int32_t bufferHeight) {
644 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
645 bufferWidth, bufferHeight));
646 }
647
648 void fillLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
649 int32_t bufferHeight, const Color& topLeft, const Color& topRight,
650 const Color& bottomLeft, const Color& bottomRight) {
651 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
652 bufferWidth, bufferHeight,
653 topLeft, topRight,
654 bottomLeft, bottomRight));
655 }
656
657protected:
658 uint32_t mLayerType;
659};
660
Alec Mouri80863a62019-01-17 15:19:35 -0800661class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
662 public ::testing::WithParamInterface<uint32_t> {
663public:
664 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
665};
666
667class LayerTypeAndRenderTypeTransactionTest
668 : public LayerTypeTransactionHarness,
669 public ::testing::WithParamInterface<std::tuple<uint32_t, RenderPath>> {
670public:
671 LayerTypeAndRenderTypeTransactionTest()
672 : LayerTypeTransactionHarness(std::get<0>(GetParam())),
673 mRenderPathHarness(LayerRenderPathTestHarness(this, std::get<1>(GetParam()))) {}
674
675 std::unique_ptr<ScreenCapture> getScreenCapture() {
676 return mRenderPathHarness.getScreenCapture();
677 }
678
679protected:
680 LayerRenderPathTestHarness mRenderPathHarness;
681};
682
683// Environment for starting up binder threads. This is required for testing
684// virtual displays, as BufferQueue parameters may be queried over binder.
685class BinderEnvironment : public ::testing::Environment {
686public:
687 void SetUp() override { ProcessState::self()->startThreadPool(); }
688};
689
690::testing::Environment* const binderEnv =
691 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
692
693class LayerRenderTypeTransactionTest : public LayerTransactionTest,
694 public ::testing::WithParamInterface<RenderPath> {
695public:
696 LayerRenderTypeTransactionTest() : mHarness(LayerRenderPathTestHarness(this, GetParam())) {}
697
698 std::unique_ptr<ScreenCapture> getScreenCapture() { return mHarness.getScreenCapture(); }
699 void setRelativeZBasicHelper(uint32_t layerType);
700 void setRelativeZGroupHelper(uint32_t layerType);
701 void setAlphaBasicHelper(uint32_t layerType);
Valerie Haudd0b7572019-01-29 14:59:27 -0800702 void setBackgroundColorHelper(uint32_t layerType, bool priorColor, bool bufferFill, float alpha,
703 Color finalColor);
Alec Mouri80863a62019-01-17 15:19:35 -0800704
705protected:
706 LayerRenderPathTestHarness mHarness;
707};
708
709INSTANTIATE_TEST_CASE_P(
710 LayerTypeAndRenderTypeTransactionTests, LayerTypeAndRenderTypeTransactionTest,
711 ::testing::Combine(
712 ::testing::Values(
713 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
714 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)),
715 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT)));
716
717INSTANTIATE_TEST_CASE_P(LayerRenderTypeTransactionTests, LayerRenderTypeTransactionTest,
718 ::testing::Values(RenderPath::VIRTUAL_DISPLAY, RenderPath::SCREENSHOT));
719
Marissa Wall61c58622018-07-18 10:12:20 -0700720INSTANTIATE_TEST_CASE_P(
721 LayerTypeTransactionTests, LayerTypeTransactionTest,
722 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
723 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
724
Alec Mouri80863a62019-01-17 15:19:35 -0800725TEST_P(LayerRenderTypeTransactionTest, SetPositionBasic_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700726 sp<SurfaceControl> layer;
727 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700728 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700729
730 {
731 SCOPED_TRACE("default position");
Marissa Wall861616d2018-10-22 12:52:23 -0700732 const Rect rect(0, 0, 32, 32);
Alec Mouri80863a62019-01-17 15:19:35 -0800733 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700734 shot->expectColor(rect, Color::RED);
735 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700736 }
737
738 Transaction().setPosition(layer, 5, 10).apply();
739 {
740 SCOPED_TRACE("new position");
Marissa Wall861616d2018-10-22 12:52:23 -0700741 const Rect rect(5, 10, 37, 42);
Alec Mouri80863a62019-01-17 15:19:35 -0800742 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700743 shot->expectColor(rect, Color::RED);
744 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700745 }
746}
747
Alec Mouri80863a62019-01-17 15:19:35 -0800748TEST_P(LayerRenderTypeTransactionTest, SetPositionRounding_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700749 sp<SurfaceControl> layer;
750 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700751 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700752
753 // GLES requires only 4 bits of subpixel precision during rasterization
754 // XXX GLES composition does not match HWC composition due to precision
755 // loss (b/69315223)
756 const float epsilon = 1.0f / 16.0f;
757 Transaction().setPosition(layer, 0.5f - epsilon, 0.5f - epsilon).apply();
758 {
759 SCOPED_TRACE("rounding down");
Alec Mouri80863a62019-01-17 15:19:35 -0800760 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700761 }
762
763 Transaction().setPosition(layer, 0.5f + epsilon, 0.5f + epsilon).apply();
764 {
765 SCOPED_TRACE("rounding up");
Alec Mouri80863a62019-01-17 15:19:35 -0800766 getScreenCapture()->expectColor(Rect(1, 1, 33, 33), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700767 }
768}
769
Alec Mouri80863a62019-01-17 15:19:35 -0800770TEST_P(LayerRenderTypeTransactionTest, SetPositionOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700771 sp<SurfaceControl> layer;
772 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700773 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700774
775 Transaction().setPosition(layer, -32, -32).apply();
776 {
777 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800778 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700779 }
780
781 Transaction().setPosition(layer, mDisplayWidth, mDisplayHeight).apply();
782 {
783 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800784 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700785 }
786}
787
Alec Mouri80863a62019-01-17 15:19:35 -0800788TEST_P(LayerRenderTypeTransactionTest, SetPositionPartiallyOutOfBounds_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700789 sp<SurfaceControl> layer;
790 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700791 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700792
793 // partially out of bounds
794 Transaction().setPosition(layer, -30, -30).apply();
795 {
796 SCOPED_TRACE("negative coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800797 getScreenCapture()->expectColor(Rect(0, 0, 2, 2), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700798 }
799
800 Transaction().setPosition(layer, mDisplayWidth - 2, mDisplayHeight - 2).apply();
801 {
802 SCOPED_TRACE("positive coordinates");
Alec Mouri80863a62019-01-17 15:19:35 -0800803 getScreenCapture()->expectColor(Rect(mDisplayWidth - 2, mDisplayHeight - 2, mDisplayWidth,
804 mDisplayHeight),
805 Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700806 }
807}
808
Alec Mouri80863a62019-01-17 15:19:35 -0800809TEST_P(LayerRenderTypeTransactionTest, SetPositionWithResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700810 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700811 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
812 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700813
814 // setPosition is applied immediately by default, with or without resize
815 // pending
816 Transaction().setPosition(layer, 5, 10).setSize(layer, 64, 64).apply();
817 {
818 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800819 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700820 const Rect rect(5, 10, 37, 42);
Marissa Wall61c58622018-07-18 10:12:20 -0700821 shot->expectColor(rect, Color::RED);
822 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu718daf82017-10-20 11:57:17 -0700823 }
824
Marissa Wall861616d2018-10-22 12:52:23 -0700825 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700826 {
827 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800828 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700829 }
830}
831
Alec Mouri80863a62019-01-17 15:19:35 -0800832TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResize_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700833 sp<SurfaceControl> layer;
834 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700835 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700836
837 // request setPosition to be applied with the next resize
838 Transaction().setPosition(layer, 5, 10).setGeometryAppliesWithResize(layer).apply();
839 {
840 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800841 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700842 }
843
844 Transaction().setPosition(layer, 15, 20).apply();
845 {
846 SCOPED_TRACE("pending new position modified");
Alec Mouri80863a62019-01-17 15:19:35 -0800847 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700848 }
849
850 Transaction().setSize(layer, 64, 64).apply();
851 {
852 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800853 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700854 }
855
856 // finally resize and latch the buffer
Marissa Wall61c58622018-07-18 10:12:20 -0700857 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700858 {
859 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800860 getScreenCapture()->expectColor(Rect(15, 20, 79, 84), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700861 }
862}
863
Alec Mouri80863a62019-01-17 15:19:35 -0800864TEST_P(LayerRenderTypeTransactionTest, SetPositionWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu718daf82017-10-20 11:57:17 -0700865 sp<SurfaceControl> layer;
866 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700867 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu718daf82017-10-20 11:57:17 -0700868
869 // setPosition is not immediate even with SCALE_TO_WINDOW override
870 Transaction()
871 .setPosition(layer, 5, 10)
872 .setSize(layer, 64, 64)
873 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
874 .setGeometryAppliesWithResize(layer)
875 .apply();
876 {
877 SCOPED_TRACE("new position pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800878 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700879 }
880
Marissa Wall61c58622018-07-18 10:12:20 -0700881 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu718daf82017-10-20 11:57:17 -0700882 {
883 SCOPED_TRACE("new position applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800884 getScreenCapture()->expectColor(Rect(5, 10, 69, 74), Color::RED);
Chia-I Wu718daf82017-10-20 11:57:17 -0700885 }
886}
887
Alec Mouri80863a62019-01-17 15:19:35 -0800888TEST_P(LayerRenderTypeTransactionTest, SetSizeBasic_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700889 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -0700890 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
891 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700892
893 Transaction().setSize(layer, 64, 64).apply();
894 {
895 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -0800896 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700897 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -0700898 shot->expectColor(rect, Color::RED);
899 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700900 }
901
Marissa Wall861616d2018-10-22 12:52:23 -0700902 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700903 {
904 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -0800905 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -0700906 const Rect rect(0, 0, 64, 64);
907 shot->expectColor(rect, Color::RED);
908 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700909 }
910}
911
Alec Mouri80863a62019-01-17 15:19:35 -0800912TEST_P(LayerTypeAndRenderTypeTransactionTest, SetSizeInvalid) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700913 // cannot test robustness against invalid sizes (zero or really huge)
914}
915
Alec Mouri80863a62019-01-17 15:19:35 -0800916TEST_P(LayerRenderTypeTransactionTest, SetSizeWithScaleToWindow_BufferQueue) {
Chia-I Wu0eaea312017-10-31 10:14:40 -0700917 sp<SurfaceControl> layer;
918 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -0700919 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu0eaea312017-10-31 10:14:40 -0700920
921 // setSize is immediate with SCALE_TO_WINDOW, unlike setPosition
922 Transaction()
923 .setSize(layer, 64, 64)
924 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
925 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -0800926 getScreenCapture()->expectColor(Rect(0, 0, 64, 64), Color::RED);
Chia-I Wu0eaea312017-10-31 10:14:40 -0700927}
928
Alec Mouri80863a62019-01-17 15:19:35 -0800929TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZBasic) {
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700930 sp<SurfaceControl> layerR;
931 sp<SurfaceControl> layerG;
932 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700933 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700934 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700935 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700936
937 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
938 {
939 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800940 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700941 }
942
943 Transaction().setLayer(layerG, mLayerZBase + 2).apply();
944 {
945 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800946 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700947 }
948}
949
Alec Mouri80863a62019-01-17 15:19:35 -0800950TEST_P(LayerTypeAndRenderTypeTransactionTest, SetZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -0700951 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -0800952 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -0700953 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -0800954 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700955 sp<SurfaceControl> layerR;
956 sp<SurfaceControl> layerG;
957 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700958 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700959 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -0700960 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700961
chaviw0e3479f2018-09-10 16:49:30 -0700962 Transaction()
963 .reparent(layerR, parent->getHandle())
964 .reparent(layerG, parent->getHandle())
965 .apply();
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700966 Transaction().setLayer(layerR, -1).setLayer(layerG, -2).apply();
967 {
968 SCOPED_TRACE("layerR");
Alec Mouri80863a62019-01-17 15:19:35 -0800969 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700970 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700971 }
972
973 Transaction().setLayer(layerR, -3).apply();
974 {
975 SCOPED_TRACE("layerG");
Alec Mouri80863a62019-01-17 15:19:35 -0800976 auto shot = getScreenCapture();
chaviw0e3479f2018-09-10 16:49:30 -0700977 shot->expectColor(Rect(0, 0, 32, 32), Color::GREEN);
Chia-I Wu0ea0f822017-10-31 10:14:40 -0700978 }
979}
980
Alec Mouri80863a62019-01-17 15:19:35 -0800981void LayerRenderTypeTransactionTest::setRelativeZBasicHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -0700982 sp<SurfaceControl> layerR;
983 sp<SurfaceControl> layerG;
Marissa Wall861616d2018-10-22 12:52:23 -0700984 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32, layerType));
985 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
986 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32, layerType));
987 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -0700988
Marissa Wall861616d2018-10-22 12:52:23 -0700989 switch (layerType) {
990 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
991 Transaction()
992 .setPosition(layerG, 16, 16)
993 .setRelativeLayer(layerG, layerR->getHandle(), 1)
994 .apply();
995 break;
996 case ISurfaceComposerClient::eFXSurfaceBufferState:
997 Transaction()
998 .setFrame(layerR, Rect(0, 0, 32, 32))
999 .setFrame(layerG, Rect(16, 16, 48, 48))
1000 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1001 .apply();
1002 break;
1003 default:
1004 ASSERT_FALSE(true) << "Unsupported layer type";
1005 }
Chia-I Wu49313302017-10-31 10:14:40 -07001006 {
1007 SCOPED_TRACE("layerG above");
Alec Mouri80863a62019-01-17 15:19:35 -08001008 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001009 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1010 shot->expectColor(Rect(16, 16, 48, 48), Color::GREEN);
1011 }
1012
1013 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).apply();
1014 {
1015 SCOPED_TRACE("layerG below");
Alec Mouri80863a62019-01-17 15:19:35 -08001016 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001017 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1018 shot->expectColor(Rect(32, 32, 48, 48), Color::GREEN);
1019 }
1020}
1021
Alec Mouri80863a62019-01-17 15:19:35 -08001022TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001023 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1024}
1025
Alec Mouri80863a62019-01-17 15:19:35 -08001026TEST_P(LayerRenderTypeTransactionTest, SetRelativeZBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001027 ASSERT_NO_FATAL_FAILURE(setRelativeZBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1028}
1029
Marissa Wall61c58622018-07-18 10:12:20 -07001030TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
chaviw0e3479f2018-09-10 16:49:30 -07001031 sp<SurfaceControl> parent =
Vishnu Nair88a11f22018-11-28 18:30:57 -08001032 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
chaviw0e3479f2018-09-10 16:49:30 -07001033 ISurfaceComposerClient::eFXSurfaceContainer);
Vishnu Nair88a11f22018-11-28 18:30:57 -08001034 Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
Chia-I Wuec2d9852017-11-21 09:21:01 -08001035 sp<SurfaceControl> layerR;
1036 sp<SurfaceControl> layerG;
1037 sp<SurfaceControl> layerB;
1038 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001039 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001040 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001041 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001042 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001043 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001044
chaviw0e3479f2018-09-10 16:49:30 -07001045 Transaction()
1046 .reparent(layerB, parent->getHandle())
1047 .apply();
1048
Chia-I Wuec2d9852017-11-21 09:21:01 -08001049 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
1050 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();
1051
chaviw0e3479f2018-09-10 16:49:30 -07001052 std::unique_ptr<ScreenCapture> screenshot;
Chia-I Wuec2d9852017-11-21 09:21:01 -08001053 // only layerB is in this range
chaviw0e3479f2018-09-10 16:49:30 -07001054 sp<IBinder> parentHandle = parent->getHandle();
Marissa Wall861616d2018-10-22 12:52:23 -07001055 ScreenCapture::captureLayers(&screenshot, parentHandle, Rect(0, 0, 32, 32));
Chia-I Wuec2d9852017-11-21 09:21:01 -08001056 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
1057}
1058
Alec Mouri80863a62019-01-17 15:19:35 -08001059void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) {
Chia-I Wu49313302017-10-31 10:14:40 -07001060 sp<SurfaceControl> layerR;
1061 sp<SurfaceControl> layerG;
1062 sp<SurfaceControl> layerB;
Marissa Wall861616d2018-10-22 12:52:23 -07001063 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test", 32, 32, layerType));
1064 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerR, Color::RED, 32, 32));
1065 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test", 32, 32, layerType));
1066 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerG, Color::GREEN, 32, 32));
1067 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test", 32, 32, layerType));
1068 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layerB, Color::BLUE, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001069
1070 // layerR = 0, layerG = layerR + 3, layerB = 2
Marissa Wall861616d2018-10-22 12:52:23 -07001071 switch (layerType) {
1072 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1073 Transaction()
1074 .setPosition(layerG, 8, 8)
1075 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1076 .setPosition(layerB, 16, 16)
1077 .setLayer(layerB, mLayerZBase + 2)
1078 .apply();
1079 break;
1080 case ISurfaceComposerClient::eFXSurfaceBufferState:
1081 Transaction()
1082 .setFrame(layerR, Rect(0, 0, 32, 32))
1083 .setFrame(layerG, Rect(8, 8, 40, 40))
1084 .setRelativeLayer(layerG, layerR->getHandle(), 3)
1085 .setFrame(layerB, Rect(16, 16, 48, 48))
1086 .setLayer(layerB, mLayerZBase + 2)
1087 .apply();
1088 break;
1089 default:
1090 ASSERT_FALSE(true) << "Unsupported layer type";
1091 }
1092
Chia-I Wu49313302017-10-31 10:14:40 -07001093 {
1094 SCOPED_TRACE("(layerR < layerG) < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001095 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001096 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1097 shot->expectColor(Rect(8, 8, 16, 16), Color::GREEN);
1098 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1099 }
1100
1101 // layerR = 4, layerG = layerR + 3, layerB = 2
1102 Transaction().setLayer(layerR, mLayerZBase + 4).apply();
1103 {
1104 SCOPED_TRACE("layerB < (layerR < layerG)");
Alec Mouri80863a62019-01-17 15:19:35 -08001105 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001106 shot->expectColor(Rect(0, 0, 8, 8), Color::RED);
1107 shot->expectColor(Rect(8, 8, 40, 40), Color::GREEN);
1108 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1109 }
1110
1111 // layerR = 4, layerG = layerR - 3, layerB = 2
1112 Transaction().setRelativeLayer(layerG, layerR->getHandle(), -3).apply();
1113 {
1114 SCOPED_TRACE("layerB < (layerG < layerR)");
Alec Mouri80863a62019-01-17 15:19:35 -08001115 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001116 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1117 shot->expectColor(Rect(32, 32, 40, 40), Color::GREEN);
1118 shot->expectColor(Rect(40, 40, 48, 48), Color::BLUE);
1119 }
1120
1121 // restore to absolute z
1122 // layerR = 4, layerG = 0, layerB = 2
1123 Transaction().setLayer(layerG, mLayerZBase).apply();
1124 {
1125 SCOPED_TRACE("layerG < layerB < layerR");
Alec Mouri80863a62019-01-17 15:19:35 -08001126 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001127 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
1128 shot->expectColor(Rect(32, 32, 48, 48), Color::BLUE);
1129 }
1130
1131 // layerR should not affect layerG anymore
1132 // layerR = 1, layerG = 0, layerB = 2
1133 Transaction().setLayer(layerR, mLayerZBase + 1).apply();
1134 {
1135 SCOPED_TRACE("layerG < layerR < layerB");
Alec Mouri80863a62019-01-17 15:19:35 -08001136 auto shot = getScreenCapture();
Chia-I Wu49313302017-10-31 10:14:40 -07001137 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
1138 shot->expectColor(Rect(16, 16, 48, 48), Color::BLUE);
1139 }
1140}
1141
Alec Mouri80863a62019-01-17 15:19:35 -08001142TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001143 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1144}
1145
Alec Mouri80863a62019-01-17 15:19:35 -08001146TEST_P(LayerRenderTypeTransactionTest, SetRelativeZGroup_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001147 ASSERT_NO_FATAL_FAILURE(setRelativeZGroupHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1148}
1149
Alec Mouri80863a62019-01-17 15:19:35 -08001150TEST_P(LayerTypeAndRenderTypeTransactionTest, SetRelativeZBug64572777) {
Chia-I Wu49313302017-10-31 10:14:40 -07001151 sp<SurfaceControl> layerR;
1152 sp<SurfaceControl> layerG;
1153
1154 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001155 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001156 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001157 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu49313302017-10-31 10:14:40 -07001158
1159 Transaction()
1160 .setPosition(layerG, 16, 16)
1161 .setRelativeLayer(layerG, layerR->getHandle(), 1)
1162 .apply();
1163
Robert Carr87246532019-02-04 15:20:26 -08001164 layerG.clear();
Chia-I Wu49313302017-10-31 10:14:40 -07001165 // layerG should have been removed
Alec Mouri80863a62019-01-17 15:19:35 -08001166 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu49313302017-10-31 10:14:40 -07001167}
1168
Alec Mouri80863a62019-01-17 15:19:35 -08001169TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsHidden) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001170 sp<SurfaceControl> layer;
1171 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001172 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001173
1174 Transaction().setFlags(layer, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden).apply();
1175 {
1176 SCOPED_TRACE("layer hidden");
Alec Mouri80863a62019-01-17 15:19:35 -08001177 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu57b27502017-10-31 10:14:40 -07001178 }
1179
1180 Transaction().setFlags(layer, 0, layer_state_t::eLayerHidden).apply();
1181 {
1182 SCOPED_TRACE("layer shown");
Alec Mouri80863a62019-01-17 15:19:35 -08001183 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu57b27502017-10-31 10:14:40 -07001184 }
1185}
1186
Alec Mouri80863a62019-01-17 15:19:35 -08001187TEST_P(LayerTypeAndRenderTypeTransactionTest, SetFlagsOpaque) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001188 const Color translucentRed = {100, 0, 0, 100};
1189 sp<SurfaceControl> layerR;
1190 sp<SurfaceControl> layerG;
1191 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001192 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, translucentRed, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001193 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001194 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001195
1196 Transaction()
1197 .setLayer(layerR, mLayerZBase + 1)
1198 .setFlags(layerR, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque)
1199 .apply();
1200 {
1201 SCOPED_TRACE("layerR opaque");
Alec Mouri80863a62019-01-17 15:19:35 -08001202 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, 0, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001203 }
1204
1205 Transaction().setFlags(layerR, 0, layer_state_t::eLayerOpaque).apply();
1206 {
1207 SCOPED_TRACE("layerR translucent");
1208 const uint8_t g = uint8_t(255 - translucentRed.a);
Alec Mouri80863a62019-01-17 15:19:35 -08001209 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {100, g, 0, 255});
Chia-I Wu57b27502017-10-31 10:14:40 -07001210 }
1211}
1212
Marissa Wall61c58622018-07-18 10:12:20 -07001213TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
Chia-I Wu57b27502017-10-31 10:14:40 -07001214 sp<SurfaceControl> layer;
1215 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001216 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu57b27502017-10-31 10:14:40 -07001217
1218 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00001219 sp<GraphicBuffer> outBuffer;
Chia-I Wu57b27502017-10-31 10:14:40 -07001220 Transaction()
1221 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1222 .apply(true);
1223 ASSERT_EQ(PERMISSION_DENIED,
chaviw0e3479f2018-09-10 16:49:30 -07001224 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001225
1226 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
1227 ASSERT_EQ(NO_ERROR,
chaviw0e3479f2018-09-10 16:49:30 -07001228 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
Chia-I Wu57b27502017-10-31 10:14:40 -07001229}
1230
Robert Carrfa8855f2019-02-19 10:05:00 -08001231/** RAII Wrapper around get/seteuid */
1232class UIDFaker {
1233 uid_t oldId;
1234public:
1235 UIDFaker(uid_t uid) {
1236 oldId = geteuid();
1237 seteuid(uid);
1238 }
1239 ~UIDFaker() {
1240 seteuid(oldId);
1241 }
1242};
1243
1244TEST_F(LayerTransactionTest, SetFlagsSecureEUidSystem) {
1245 sp<SurfaceControl> layer;
1246 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1247 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
1248
1249 sp<ISurfaceComposer> composer = ComposerService::getComposerService();
1250 sp<GraphicBuffer> outBuffer;
1251 Transaction()
1252 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
1253 .apply(true);
1254 ASSERT_EQ(PERMISSION_DENIED,
1255 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1256
1257 UIDFaker f(AID_SYSTEM);
1258
1259 // By default the system can capture screenshots with secure layers but they
1260 // will be blacked out
1261 ASSERT_EQ(NO_ERROR,
1262 composer->captureScreen(mDisplay, &outBuffer, Rect(), 0, 0, false));
1263
1264 {
1265 SCOPED_TRACE("as system");
1266 auto shot = screenshot();
1267 shot->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
1268 }
1269
1270 // Here we pass captureSecureLayers = true and since we are AID_SYSTEM we should be able
1271 // to receive them...we are expected to take care with the results.
Robert Carr108b2c72019-04-02 16:32:58 -07001272 bool outCapturedSecureLayers;
Robert Carrfa8855f2019-02-19 10:05:00 -08001273 ASSERT_EQ(NO_ERROR,
Robert Carr108b2c72019-04-02 16:32:58 -07001274 composer->captureScreen(mDisplay, &outBuffer, outCapturedSecureLayers,
1275 ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, Rect(), 0,
1276 0, false, ISurfaceComposer::eRotateNone, true));
1277 ASSERT_EQ(true, outCapturedSecureLayers);
Robert Carrfa8855f2019-02-19 10:05:00 -08001278 ScreenCapture sc(outBuffer);
1279 sc.expectColor(Rect(0, 0, 32, 32), Color::RED);
1280}
1281
Alec Mouri80863a62019-01-17 15:19:35 -08001282TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001283 const Rect top(0, 0, 32, 16);
1284 const Rect bottom(0, 16, 32, 32);
1285 sp<SurfaceControl> layer;
1286 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1287
1288 ANativeWindow_Buffer buffer;
Marissa Wall61c58622018-07-18 10:12:20 -07001289 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1290 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
1291 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001292 // setTransparentRegionHint always applies to the following buffer
1293 Transaction().setTransparentRegionHint(layer, Region(top)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001294 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001295 {
1296 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001297 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001298 shot->expectColor(top, Color::BLACK);
1299 shot->expectColor(bottom, Color::RED);
1300 }
1301
1302 Transaction().setTransparentRegionHint(layer, Region(bottom)).apply();
1303 {
1304 SCOPED_TRACE("transparent region hint pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001305 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001306 shot->expectColor(top, Color::BLACK);
1307 shot->expectColor(bottom, Color::RED);
1308 }
1309
Marissa Wall61c58622018-07-18 10:12:20 -07001310 ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
1311 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
1312 ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
1313 ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001314 {
1315 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001316 auto shot = getScreenCapture();
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001317 shot->expectColor(top, Color::RED);
1318 shot->expectColor(bottom, Color::BLACK);
1319 }
1320}
1321
Alec Mouri80863a62019-01-17 15:19:35 -08001322TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07001323 const Rect top(0, 0, 32, 16);
1324 const Rect bottom(0, 16, 32, 32);
1325 sp<SurfaceControl> layer;
1326 ASSERT_NO_FATAL_FAILURE(
1327 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1328
1329 sp<GraphicBuffer> buffer =
1330 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1331 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1332 BufferUsage::COMPOSER_OVERLAY,
1333 "test");
1334
1335 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
1336 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
1337 Transaction()
1338 .setTransparentRegionHint(layer, Region(top))
1339 .setBuffer(layer, buffer)
Marissa Wall861616d2018-10-22 12:52:23 -07001340 .setFrame(layer, Rect(0, 0, 32, 32))
Marissa Wall61c58622018-07-18 10:12:20 -07001341 .apply();
1342 {
1343 SCOPED_TRACE("top transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001344 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -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 intermediate");
Alec Mouri80863a62019-01-17 15:19:35 -08001352 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001353 shot->expectColor(top, Color::BLACK);
1354 shot->expectColor(bottom, Color::BLACK);
1355 }
1356
1357 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
1358 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
1359 BufferUsage::COMPOSER_OVERLAY,
1360 "test");
1361
1362 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
1363 ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Marissa Wall861616d2018-10-22 12:52:23 -07001364 Transaction().setBuffer(layer, buffer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07001365 {
1366 SCOPED_TRACE("bottom transparent");
Alec Mouri80863a62019-01-17 15:19:35 -08001367 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07001368 shot->expectColor(top, Color::RED);
1369 shot->expectColor(bottom, Color::BLACK);
1370 }
1371}
1372
Alec Mouri80863a62019-01-17 15:19:35 -08001373TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferQueue) {
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001374 sp<SurfaceControl> layerTransparent;
1375 sp<SurfaceControl> layerR;
1376 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1377 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
1378
1379 // check that transparent region hint is bound by the layer size
1380 Transaction()
Marissa Wall861616d2018-10-22 12:52:23 -07001381 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001382 .setPosition(layerR, 16, 16)
1383 .setLayer(layerR, mLayerZBase + 1)
1384 .apply();
Marissa Wall861616d2018-10-22 12:52:23 -07001385 ASSERT_NO_FATAL_FAILURE(
1386 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1387 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001388 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Chia-I Wu2113bdd2017-11-01 15:16:35 -07001389}
1390
Alec Mouri80863a62019-01-17 15:19:35 -08001391TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintOutOfBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001392 sp<SurfaceControl> layerTransparent;
1393 sp<SurfaceControl> layerR;
1394 ASSERT_NO_FATAL_FAILURE(layerTransparent = createLayer("test transparent", 32, 32));
1395 ASSERT_NO_FATAL_FAILURE(
1396 layerR = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1397
1398 // check that transparent region hint is bound by the layer size
1399 Transaction()
1400 .setTransparentRegionHint(layerTransparent, Region(mDisplayRect))
1401 .setFrame(layerR, Rect(16, 16, 48, 48))
1402 .setLayer(layerR, mLayerZBase + 1)
1403 .apply();
1404 ASSERT_NO_FATAL_FAILURE(
1405 fillBufferQueueLayerColor(layerTransparent, Color::TRANSPARENT, 32, 32));
1406 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layerR, Color::RED, 32, 32));
Alec Mouri80863a62019-01-17 15:19:35 -08001407 getScreenCapture()->expectColor(Rect(16, 16, 48, 48), Color::RED);
Marissa Wall861616d2018-10-22 12:52:23 -07001408}
1409
Alec Mouri80863a62019-01-17 15:19:35 -08001410void LayerRenderTypeTransactionTest::setAlphaBasicHelper(uint32_t layerType) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001411 sp<SurfaceControl> layer1;
1412 sp<SurfaceControl> layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07001413 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer("test 1", 32, 32, layerType));
1414 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer("test 2", 32, 32, layerType));
1415 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer1, {64, 0, 0, 255}, 32, 32));
1416 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerType, layer2, {0, 64, 0, 255}, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001417
Marissa Wall861616d2018-10-22 12:52:23 -07001418 switch (layerType) {
1419 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1420 Transaction()
1421 .setAlpha(layer1, 0.25f)
1422 .setAlpha(layer2, 0.75f)
1423 .setPosition(layer2, 16, 0)
1424 .setLayer(layer2, mLayerZBase + 1)
1425 .apply();
1426 break;
1427 case ISurfaceComposerClient::eFXSurfaceBufferState:
1428 Transaction()
1429 .setAlpha(layer1, 0.25f)
1430 .setAlpha(layer2, 0.75f)
1431 .setFrame(layer1, Rect(0, 0, 32, 32))
1432 .setFrame(layer2, Rect(16, 0, 48, 32))
1433 .setLayer(layer2, mLayerZBase + 1)
1434 .apply();
1435 break;
1436 default:
1437 ASSERT_FALSE(true) << "Unsupported layer type";
1438 }
Chia-I Wua8a515e2017-11-01 15:16:35 -07001439 {
Alec Mouri80863a62019-01-17 15:19:35 -08001440 auto shot = getScreenCapture();
Chia-I Wua8a515e2017-11-01 15:16:35 -07001441 uint8_t r = 16; // 64 * 0.25f
1442 uint8_t g = 48; // 64 * 0.75f
1443 shot->expectColor(Rect(0, 0, 16, 32), {r, 0, 0, 255});
1444 shot->expectColor(Rect(32, 0, 48, 32), {0, g, 0, 255});
1445
1446 r /= 4; // r * (1.0f - 0.75f)
1447 shot->expectColor(Rect(16, 0, 32, 32), {r, g, 0, 255});
1448 }
1449}
1450
Alec Mouri80863a62019-01-17 15:19:35 -08001451TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferQueue) {
Marissa Wall861616d2018-10-22 12:52:23 -07001452 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue));
1453}
1454
Alec Mouri80863a62019-01-17 15:19:35 -08001455TEST_P(LayerRenderTypeTransactionTest, SetAlphaBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001456 ASSERT_NO_FATAL_FAILURE(setAlphaBasicHelper(ISurfaceComposerClient::eFXSurfaceBufferState));
1457}
1458
Alec Mouri80863a62019-01-17 15:19:35 -08001459TEST_P(LayerTypeAndRenderTypeTransactionTest, SetAlphaClamped) {
Chia-I Wua8a515e2017-11-01 15:16:35 -07001460 const Color color = {64, 0, 0, 255};
1461 sp<SurfaceControl> layer;
1462 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001463 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, color, 32, 32));
Chia-I Wua8a515e2017-11-01 15:16:35 -07001464
1465 Transaction().setAlpha(layer, 2.0f).apply();
1466 {
1467 SCOPED_TRACE("clamped to 1.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001468 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), color);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001469 }
1470
1471 Transaction().setAlpha(layer, -1.0f).apply();
1472 {
1473 SCOPED_TRACE("clamped to 0.0f");
Alec Mouri80863a62019-01-17 15:19:35 -08001474 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wua8a515e2017-11-01 15:16:35 -07001475 }
1476}
1477
Alec Mouri80863a62019-01-17 15:19:35 -08001478TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadius) {
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001479 sp<SurfaceControl> layer;
1480 const uint8_t size = 64;
1481 const uint8_t testArea = 4;
Lucas Dupina1d0e312018-12-04 22:30:27 -08001482 const float cornerRadius = 20.0f;
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001483 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", size, size));
1484 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, size, size));
1485
1486 Transaction()
1487 .setCornerRadius(layer, cornerRadius)
1488 .apply();
1489 {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001490 const uint8_t bottom = size - 1;
1491 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001492 auto shot = getScreenCapture();
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001493 // Transparent corners
1494 shot->expectColor(Rect(0, 0, testArea, testArea), Color::BLACK);
Lucas Dupina1d0e312018-12-04 22:30:27 -08001495 shot->expectColor(Rect(size - testArea, 0, right, testArea), Color::BLACK);
1496 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1497 shot->expectColor(Rect(size - testArea, bottom - testArea, right, bottom), Color::BLACK);
1498 }
1499}
1500
Alec Mouri80863a62019-01-17 15:19:35 -08001501TEST_P(LayerTypeAndRenderTypeTransactionTest, SetCornerRadiusChildCrop) {
Lucas Dupina1d0e312018-12-04 22:30:27 -08001502 sp<SurfaceControl> parent;
1503 sp<SurfaceControl> child;
1504 const uint8_t size = 64;
1505 const uint8_t testArea = 4;
1506 const float cornerRadius = 20.0f;
1507 ASSERT_NO_FATAL_FAILURE(parent = createLayer("parent", size, size));
1508 ASSERT_NO_FATAL_FAILURE(fillLayerColor(parent, Color::RED, size, size));
1509 ASSERT_NO_FATAL_FAILURE(child = createLayer("child", size, size / 2));
1510 ASSERT_NO_FATAL_FAILURE(fillLayerColor(child, Color::GREEN, size, size / 2));
1511
1512 Transaction()
1513 .setCornerRadius(parent, cornerRadius)
1514 .reparent(child, parent->getHandle())
1515 .setPosition(child, 0, size / 2)
1516 .apply();
1517 {
1518 const uint8_t bottom = size - 1;
1519 const uint8_t right = size - 1;
Alec Mouri80863a62019-01-17 15:19:35 -08001520 auto shot = getScreenCapture();
Lucas Dupina1d0e312018-12-04 22:30:27 -08001521 // Top edge of child should not have rounded corners because it's translated in the parent
1522 shot->expectColor(Rect(0, size / 2, right, static_cast<int>(bottom - cornerRadius)),
1523 Color::GREEN);
1524 // But bottom edges should have been clipped according to parent bounds
1525 shot->expectColor(Rect(0, bottom - testArea, testArea, bottom), Color::BLACK);
1526 shot->expectColor(Rect(right - testArea, bottom - testArea, right, bottom), Color::BLACK);
Lucas Dupin1b6531c2018-07-05 17:18:21 -07001527 }
1528}
1529
Alec Mouri80863a62019-01-17 15:19:35 -08001530TEST_P(LayerRenderTypeTransactionTest, SetColorBasic) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001531 sp<SurfaceControl> bufferLayer;
1532 sp<SurfaceControl> colorLayer;
1533 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001534 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001535 ASSERT_NO_FATAL_FAILURE(colorLayer =
1536 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1537 ISurfaceComposerClient::eFXSurfaceColor));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001538
Vishnu Nair88a11f22018-11-28 18:30:57 -08001539 Transaction()
1540 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1541 .setLayer(colorLayer, mLayerZBase + 1)
1542 .apply();
1543
Chia-I Wue4ef6102017-11-01 15:16:35 -07001544 {
1545 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08001546 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001547 }
1548
1549 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1550 const Color expected = {15, 51, 85, 255};
1551 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1552 // channel) should be less than one
1553 const uint8_t tolerance = 1;
1554 Transaction().setColor(colorLayer, color).apply();
1555 {
1556 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08001557 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expected, tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001558 }
1559}
1560
Valerie Haudd0b7572019-01-29 14:59:27 -08001561// RED: Color layer base color and BufferQueueLayer/BufferStateLayer fill
1562// BLUE: prior background color
1563// GREEN: final background color
1564// BLACK: no color or fill
1565void LayerRenderTypeTransactionTest::setBackgroundColorHelper(uint32_t layerType, bool priorColor,
1566 bool bufferFill, float alpha,
1567 Color finalColor) {
1568 sp<SurfaceControl> layer;
1569 int32_t width = 500;
1570 int32_t height = 500;
Valerie Haua72e2812019-01-23 13:40:39 -08001571
Valerie Haudd0b7572019-01-29 14:59:27 -08001572 Color fillColor = Color::RED;
1573 Color priorBgColor = Color::BLUE;
1574 Color expectedColor = Color::BLACK;
1575 switch (layerType) {
1576 case ISurfaceComposerClient::eFXSurfaceColor:
1577 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 0, 0, layerType));
1578 Transaction()
1579 .setCrop_legacy(layer, Rect(0, 0, width, height))
1580 .setColor(layer, half3(1.0f, 0, 0))
1581 .apply();
1582 expectedColor = fillColor;
1583 break;
1584 case ISurfaceComposerClient::eFXSurfaceBufferQueue:
1585 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height));
1586 if (bufferFill) {
1587 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, fillColor, width, height));
1588 expectedColor = fillColor;
1589 }
1590 Transaction().setCrop_legacy(layer, Rect(0, 0, width, height)).apply();
1591 break;
1592 case ISurfaceComposerClient::eFXSurfaceBufferState:
1593 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", width, height, layerType));
1594 if (bufferFill) {
1595 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, fillColor, width, height));
1596 expectedColor = fillColor;
1597 }
1598 Transaction().setFrame(layer, Rect(0, 0, width, height)).apply();
1599 break;
1600 default:
1601 GTEST_FAIL() << "Unknown layer type in setBackgroundColorHelper";
1602 return;
Valerie Haua72e2812019-01-23 13:40:39 -08001603 }
1604
Valerie Haudd0b7572019-01-29 14:59:27 -08001605 if (priorColor && layerType != ISurfaceComposerClient::eFXSurfaceColor) {
1606 Transaction()
1607 .setBackgroundColor(layer, half3(0, 0, 1.0f), 1.0f, ui::Dataspace::UNKNOWN)
1608 .apply();
1609 if (!bufferFill) {
1610 expectedColor = priorBgColor;
1611 }
1612 }
1613
1614 {
1615 SCOPED_TRACE("default before setting background color layer");
1616 screenshot()->expectColor(Rect(0, 0, width, height), expectedColor);
1617 }
Valerie Haua72e2812019-01-23 13:40:39 -08001618 Transaction()
Valerie Haudd0b7572019-01-29 14:59:27 -08001619 .setBackgroundColor(layer, half3(0, 1.0f, 0), alpha, ui::Dataspace::UNKNOWN)
Valerie Haua72e2812019-01-23 13:40:39 -08001620 .apply();
1621
1622 {
Valerie Haua72e2812019-01-23 13:40:39 -08001623 auto shot = screenshot();
Valerie Haudd0b7572019-01-29 14:59:27 -08001624 shot->expectColor(Rect(0, 0, width, height), finalColor);
1625 shot->expectBorder(Rect(0, 0, width, height), Color::BLACK);
Valerie Haua72e2812019-01-23 13:40:39 -08001626 }
1627}
1628
Valerie Haudd0b7572019-01-29 14:59:27 -08001629TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_Color_NoEffect) {
1630 bool priorColor = false;
1631 bool bufferFill = false;
1632 float alpha = 1.0f;
1633 Color finalColor = Color::RED;
1634 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceColor,
1635 priorColor, bufferFill, alpha, finalColor));
1636}
Valerie Haua72e2812019-01-23 13:40:39 -08001637
Valerie Haudd0b7572019-01-29 14:59:27 -08001638TEST_P(LayerRenderTypeTransactionTest,
1639 SetBackgroundColor_BufferQueue_BufferFill_NoPriorColor_Basic) {
1640 bool priorColor = false;
1641 bool bufferFill = true;
1642 float alpha = 1.0f;
1643 Color finalColor = Color::RED;
1644 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1645 priorColor, bufferFill, alpha, finalColor));
1646}
Valerie Haua72e2812019-01-23 13:40:39 -08001647
Valerie Haudd0b7572019-01-29 14:59:27 -08001648TEST_P(LayerRenderTypeTransactionTest,
1649 SetBackgroundColor_BufferQueue_NoBufferFill_NoPriorColor_Basic) {
1650 bool priorColor = false;
1651 bool bufferFill = false;
1652 float alpha = 1.0f;
1653 Color finalColor = Color::GREEN;
1654 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1655 priorColor, bufferFill, alpha, finalColor));
1656}
Valerie Haua72e2812019-01-23 13:40:39 -08001657
Valerie Haudd0b7572019-01-29 14:59:27 -08001658TEST_P(LayerRenderTypeTransactionTest, SetBackgroundColor_BufferQueue_BufferFill_PriorColor_Basic) {
1659 bool priorColor = true;
1660 bool bufferFill = true;
1661 float alpha = 1.0f;
1662 Color finalColor = Color::RED;
1663 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1664 priorColor, bufferFill, alpha, finalColor));
1665}
1666
1667TEST_P(LayerRenderTypeTransactionTest,
1668 SetBackgroundColor_BufferQueue_NoBufferFill_PriorColor_Basic) {
1669 bool priorColor = true;
1670 bool bufferFill = false;
1671 float alpha = 1.0f;
1672 Color finalColor = Color::GREEN;
1673 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1674 priorColor, bufferFill, alpha, finalColor));
1675}
1676TEST_P(LayerRenderTypeTransactionTest,
1677 SetBackgroundColor_BufferQueue_NoPriorColor_ZeroAlpha_NoEffect) {
1678 bool priorColor = false;
1679 bool bufferFill = false;
1680 float alpha = 0;
1681 Color finalColor = Color::BLACK;
1682 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1683 priorColor, bufferFill, alpha, finalColor));
1684}
1685
1686TEST_P(LayerRenderTypeTransactionTest,
1687 SetBackgroundColor_BufferQueue_PriorColor_ZeroAlpha_DeleteBackground) {
1688 bool priorColor = true;
1689 bool bufferFill = false;
1690 float alpha = 0;
1691 Color finalColor = Color::BLACK;
1692 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferQueue,
1693 priorColor, bufferFill, alpha, finalColor));
1694}
1695
1696TEST_P(LayerRenderTypeTransactionTest,
1697 SetBackgroundColor_BufferState_BufferFill_NoPriorColor_Basic) {
1698 bool priorColor = false;
1699 bool bufferFill = true;
1700 float alpha = 1.0f;
1701 Color finalColor = Color::RED;
Valerie Haua6b15a12019-02-05 14:16:30 -08001702 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001703 priorColor, bufferFill, alpha, finalColor));
1704}
1705
1706TEST_P(LayerRenderTypeTransactionTest,
1707 SetBackgroundColor_BufferState_NoBufferFill_NoPriorColor_Basic) {
1708 bool priorColor = false;
1709 bool bufferFill = false;
1710 float alpha = 1.0f;
1711 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001712 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001713 priorColor, bufferFill, alpha, finalColor));
1714}
1715
1716TEST_P(LayerRenderTypeTransactionTest,
1717 SetBackgroundColor_BufferState_NoBufferFill_PriorColor_Basic) {
1718 bool priorColor = true;
1719 bool bufferFill = false;
1720 float alpha = 1.0f;
1721 Color finalColor = Color::GREEN;
Valerie Haua6b15a12019-02-05 14:16:30 -08001722 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001723 priorColor, bufferFill, alpha, finalColor));
1724}
1725
1726TEST_P(LayerRenderTypeTransactionTest,
1727 SetBackgroundColor_BufferState_NoPriorColor_ZeroAlpha_NoEffect) {
1728 bool priorColor = false;
1729 bool bufferFill = false;
1730 float alpha = 0;
1731 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001732 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001733 priorColor, bufferFill, alpha, finalColor));
1734}
1735
1736TEST_P(LayerRenderTypeTransactionTest,
1737 SetBackgroundColor_BufferState_PriorColor_ZeroAlpha_DeleteBackground) {
1738 bool priorColor = true;
1739 bool bufferFill = false;
1740 float alpha = 0;
1741 Color finalColor = Color::BLACK;
Valerie Haua6b15a12019-02-05 14:16:30 -08001742 ASSERT_NO_FATAL_FAILURE(setBackgroundColorHelper(ISurfaceComposerClient::eFXSurfaceBufferState,
Valerie Haudd0b7572019-01-29 14:59:27 -08001743 priorColor, bufferFill, alpha, finalColor));
Valerie Haua72e2812019-01-23 13:40:39 -08001744}
1745
Alec Mouri80863a62019-01-17 15:19:35 -08001746TEST_P(LayerRenderTypeTransactionTest, SetColorClamped) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001747 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08001748 ASSERT_NO_FATAL_FAILURE(colorLayer =
1749 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1750 ISurfaceComposerClient::eFXSurfaceColor));
1751 Transaction()
1752 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
1753 .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f))
1754 .apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001755
Alec Mouri80863a62019-01-17 15:19:35 -08001756 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001757}
1758
Alec Mouri80863a62019-01-17 15:19:35 -08001759TEST_P(LayerRenderTypeTransactionTest, SetColorWithAlpha) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001760 sp<SurfaceControl> bufferLayer;
1761 sp<SurfaceControl> colorLayer;
1762 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001763 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001764 ASSERT_NO_FATAL_FAILURE(colorLayer =
1765 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
1766 ISurfaceComposerClient::eFXSurfaceColor));
1767 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Chia-I Wue4ef6102017-11-01 15:16:35 -07001768
1769 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1770 const float alpha = 0.25f;
1771 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1772 // this is handwavy, but the precison loss scaled by 255 (8-bit per
1773 // channel) should be less than one
1774 const uint8_t tolerance = 1;
1775 Transaction()
1776 .setColor(colorLayer, color)
1777 .setAlpha(colorLayer, alpha)
1778 .setLayer(colorLayer, mLayerZBase + 1)
1779 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001780 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1781 tolerance);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001782}
1783
Alec Mouri80863a62019-01-17 15:19:35 -08001784TEST_P(LayerRenderTypeTransactionTest, SetColorWithParentAlpha_Bug74220420) {
Adrian Roosb7a96502018-04-08 11:38:55 -07001785 sp<SurfaceControl> bufferLayer;
1786 sp<SurfaceControl> parentLayer;
1787 sp<SurfaceControl> colorLayer;
1788 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32));
1789 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001790 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32));
Vishnu Nair88a11f22018-11-28 18:30:57 -08001791 ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */,
1792 0 /* buffer height */,
1793 ISurfaceComposerClient::eFXSurfaceColor));
1794 Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply();
Adrian Roosb7a96502018-04-08 11:38:55 -07001795 const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f);
1796 const float alpha = 0.25f;
1797 const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f);
1798 // this is handwavy, but the precision loss scaled by 255 (8-bit per
1799 // channel) should be less than one
1800 const uint8_t tolerance = 1;
1801 Transaction()
1802 .reparent(colorLayer, parentLayer->getHandle())
1803 .setColor(colorLayer, color)
1804 .setAlpha(parentLayer, alpha)
1805 .setLayer(parentLayer, mLayerZBase + 1)
1806 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001807 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), {expected.r, expected.g, expected.b, 255},
1808 tolerance);
Adrian Roosb7a96502018-04-08 11:38:55 -07001809}
1810
Alec Mouri80863a62019-01-17 15:19:35 -08001811TEST_P(LayerTypeAndRenderTypeTransactionTest, SetColorWithBuffer) {
Chia-I Wue4ef6102017-11-01 15:16:35 -07001812 sp<SurfaceControl> bufferLayer;
1813 ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001814 ASSERT_NO_FATAL_FAILURE(fillLayerColor(bufferLayer, Color::RED, 32, 32));
Chia-I Wue4ef6102017-11-01 15:16:35 -07001815
1816 // color is ignored
1817 Transaction().setColor(bufferLayer, half3(0.0f, 1.0f, 0.0f)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001818 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wue4ef6102017-11-01 15:16:35 -07001819}
1820
Alec Mouri80863a62019-01-17 15:19:35 -08001821TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) {
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001822 sp<SurfaceControl> layer;
1823 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07001824 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001825
1826 Transaction().setLayerStack(layer, mDisplayLayerStack + 1).apply();
1827 {
1828 SCOPED_TRACE("non-existing layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001829 getScreenCapture()->expectColor(mDisplayRect, Color::BLACK);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001830 }
1831
1832 Transaction().setLayerStack(layer, mDisplayLayerStack).apply();
1833 {
1834 SCOPED_TRACE("original layer stack");
Alec Mouri80863a62019-01-17 15:19:35 -08001835 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu3d22f3a2017-11-02 08:30:27 -07001836 }
1837}
1838
Alec Mouri80863a62019-01-17 15:19:35 -08001839TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001840 sp<SurfaceControl> layer;
1841 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001842 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1843 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001844
1845 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 0, 0).apply();
1846 {
1847 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001848 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1849 Color::BLUE, Color::WHITE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001850 }
1851
1852 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).setPosition(layer, 32, 0).apply();
1853 {
1854 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001855 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED,
1856 Color::WHITE, Color::BLUE);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001857 }
1858
1859 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).setPosition(layer, 0, 32).apply();
1860 {
1861 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001862 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE,
1863 Color::RED, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001864 }
1865
1866 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).setPosition(layer, 32, 0).apply();
1867 {
1868 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001869 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED,
1870 Color::WHITE, Color::GREEN);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001871 }
1872
1873 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setPosition(layer, 0, 0).apply();
1874 {
1875 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001876 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 64), Color::RED, Color::GREEN,
1877 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001878 }
1879}
1880
Alec Mouri80863a62019-01-17 15:19:35 -08001881TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07001882 sp<SurfaceControl> layer;
1883 ASSERT_NO_FATAL_FAILURE(
1884 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
1885 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1886 Color::BLUE, Color::WHITE));
1887
1888 Transaction()
1889 .setMatrix(layer, 1.0f, 0.0f, 0.0f, 1.0f)
1890 .setFrame(layer, Rect(0, 0, 32, 32))
1891 .apply();
1892 {
1893 SCOPED_TRACE("IDENTITY");
Alec Mouri80863a62019-01-17 15:19:35 -08001894 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1895 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001896 }
1897
1898 Transaction().setMatrix(layer, -1.0f, 0.0f, 0.0f, 1.0f).apply();
1899 {
1900 SCOPED_TRACE("FLIP_H");
Alec Mouri80863a62019-01-17 15:19:35 -08001901 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1902 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001903 }
1904
1905 Transaction().setMatrix(layer, 1.0f, 0.0f, 0.0f, -1.0f).apply();
1906 {
1907 SCOPED_TRACE("FLIP_V");
Alec Mouri80863a62019-01-17 15:19:35 -08001908 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1909 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001910 }
1911
1912 Transaction().setMatrix(layer, 0.0f, 1.0f, -1.0f, 0.0f).apply();
1913 {
1914 SCOPED_TRACE("ROT_90");
Alec Mouri80863a62019-01-17 15:19:35 -08001915 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1916 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001917 }
1918
1919 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).apply();
1920 {
1921 SCOPED_TRACE("SCALE");
Alec Mouri80863a62019-01-17 15:19:35 -08001922 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::RED, Color::GREEN,
1923 Color::BLUE, Color::WHITE);
Marissa Wall861616d2018-10-22 12:52:23 -07001924 }
1925}
1926
Alec Mouri80863a62019-01-17 15:19:35 -08001927TEST_P(LayerRenderTypeTransactionTest, SetMatrixRot45_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001928 sp<SurfaceControl> layer;
1929 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001930 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1931 Color::BLUE, Color::WHITE));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001932
1933 const float rot = M_SQRT1_2; // 45 degrees
1934 const float trans = M_SQRT2 * 16.0f;
1935 Transaction().setMatrix(layer, rot, rot, -rot, rot).setPosition(layer, trans, 0).apply();
1936
Alec Mouri80863a62019-01-17 15:19:35 -08001937 auto shot = getScreenCapture();
Chia-I Wu93853fe2017-11-02 08:30:27 -07001938 // check a 8x8 region inside each color
1939 auto get8x8Rect = [](int32_t centerX, int32_t centerY) {
1940 const int32_t halfL = 4;
1941 return Rect(centerX - halfL, centerY - halfL, centerX + halfL, centerY + halfL);
1942 };
1943 const int32_t unit = int32_t(trans / 2);
1944 shot->expectColor(get8x8Rect(2 * unit, 1 * unit), Color::RED);
1945 shot->expectColor(get8x8Rect(3 * unit, 2 * unit), Color::GREEN);
1946 shot->expectColor(get8x8Rect(1 * unit, 2 * unit), Color::BLUE);
1947 shot->expectColor(get8x8Rect(2 * unit, 3 * unit), Color::WHITE);
1948}
1949
Alec Mouri80863a62019-01-17 15:19:35 -08001950TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithResize_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001951 sp<SurfaceControl> layer;
Marissa Wall861616d2018-10-22 12:52:23 -07001952 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
1953 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001954
1955 // setMatrix is applied after any pending resize, unlike setPosition
1956 Transaction().setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f).setSize(layer, 64, 64).apply();
1957 {
1958 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08001959 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07001960 const Rect rect(0, 0, 32, 32);
Marissa Wall61c58622018-07-18 10:12:20 -07001961 shot->expectColor(rect, Color::RED);
1962 shot->expectBorder(rect, Color::BLACK);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001963 }
1964
Marissa Wall861616d2018-10-22 12:52:23 -07001965 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 64, 64));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001966 {
1967 SCOPED_TRACE("resize applied");
Marissa Wall861616d2018-10-22 12:52:23 -07001968 const Rect rect(0, 0, 128, 128);
Alec Mouri80863a62019-01-17 15:19:35 -08001969 getScreenCapture()->expectColor(rect, Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001970 }
1971}
1972
Alec Mouri80863a62019-01-17 15:19:35 -08001973TEST_P(LayerRenderTypeTransactionTest, SetMatrixWithScaleToWindow_BufferQueue) {
Chia-I Wu93853fe2017-11-02 08:30:27 -07001974 sp<SurfaceControl> layer;
1975 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001976 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu93853fe2017-11-02 08:30:27 -07001977
1978 // setMatrix is immediate with SCALE_TO_WINDOW, unlike setPosition
1979 Transaction()
1980 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
1981 .setSize(layer, 64, 64)
1982 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1983 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08001984 getScreenCapture()->expectColor(Rect(0, 0, 128, 128), Color::RED);
Chia-I Wu93853fe2017-11-02 08:30:27 -07001985}
1986
Alec Mouri80863a62019-01-17 15:19:35 -08001987TEST_P(LayerRenderTypeTransactionTest, SetOverrideScalingModeBasic_BufferQueue) {
Chia-I Wua56b2042017-11-01 15:16:35 -07001988 sp<SurfaceControl> layer;
1989 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall861616d2018-10-22 12:52:23 -07001990 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
1991 Color::BLUE, Color::WHITE));
Chia-I Wua56b2042017-11-01 15:16:35 -07001992
1993 // XXX SCALE_CROP is not respected; calling setSize and
1994 // setOverrideScalingMode in separate transactions does not work
1995 // (b/69315456)
1996 Transaction()
1997 .setSize(layer, 64, 16)
1998 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
1999 .apply();
2000 {
2001 SCOPED_TRACE("SCALE_TO_WINDOW");
Alec Mouri80863a62019-01-17 15:19:35 -08002002 getScreenCapture()->expectQuadrant(Rect(0, 0, 64, 16), Color::RED, Color::GREEN,
2003 Color::BLUE, Color::WHITE, true /* filtered */);
Chia-I Wua56b2042017-11-01 15:16:35 -07002004 }
2005}
2006
Dan Stoza000dd012018-08-01 13:31:52 -07002007TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
2008 sp<SurfaceControl> layer;
2009 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2010
2011 sp<IBinder> handle = layer->getHandle();
2012 ASSERT_TRUE(handle != nullptr);
2013
2014 FrameStats frameStats;
2015 mClient->getLayerFrameStats(handle, &frameStats);
2016
2017 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
2018}
2019
Alec Mouri80863a62019-01-17 15:19:35 -08002020TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002021 sp<SurfaceControl> layer;
2022 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002023 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002024 const Rect crop(8, 8, 24, 24);
2025
Marissa Wallf58c14b2018-07-24 10:50:43 -07002026 Transaction().setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002027 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002028 shot->expectColor(crop, Color::RED);
2029 shot->expectBorder(crop, Color::BLACK);
2030}
2031
Alec Mouri80863a62019-01-17 15:19:35 -08002032TEST_P(LayerRenderTypeTransactionTest, SetCropBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002033 sp<SurfaceControl> layer;
2034 ASSERT_NO_FATAL_FAILURE(
2035 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2036 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2037 const Rect crop(8, 8, 24, 24);
2038
2039 Transaction().setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002040 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002041 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2042 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002043}
2044
Alec Mouri80863a62019-01-17 15:19:35 -08002045TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002046 sp<SurfaceControl> layer;
2047 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002048 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002049
2050 {
2051 SCOPED_TRACE("empty rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002052 Transaction().setCrop_legacy(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002053 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002054 }
2055
2056 {
2057 SCOPED_TRACE("negative rect");
Marissa Wallf58c14b2018-07-24 10:50:43 -07002058 Transaction().setCrop_legacy(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002059 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002060 }
2061}
2062
Alec Mouri80863a62019-01-17 15:19:35 -08002063TEST_P(LayerRenderTypeTransactionTest, SetCropEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002064 sp<SurfaceControl> layer;
2065 ASSERT_NO_FATAL_FAILURE(
2066 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2067 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2068
2069 {
2070 SCOPED_TRACE("empty rect");
2071 Transaction().setCrop(layer, Rect(8, 8, 8, 8)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002072 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002073 }
2074
2075 {
2076 SCOPED_TRACE("negative rect");
2077 Transaction().setCrop(layer, Rect(8, 8, 0, 0)).apply();
Marissa Wall290ad082019-03-06 13:23:47 -08002078 getScreenCapture()->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
Marissa Wall61c58622018-07-18 10:12:20 -07002079 }
2080}
2081
Alec Mouri80863a62019-01-17 15:19:35 -08002082TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002083 sp<SurfaceControl> layer;
2084 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002085 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002086
Marissa Wallf58c14b2018-07-24 10:50:43 -07002087 Transaction().setCrop_legacy(layer, Rect(-128, -64, 128, 64)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002088 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002089 shot->expectColor(Rect(0, 0, 32, 32), Color::RED);
2090 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2091}
2092
Alec Mouri80863a62019-01-17 15:19:35 -08002093TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
Valerie Hau0bc09152018-12-20 07:42:47 -08002094 sp<SurfaceControl> layer;
Marissa Wall290ad082019-03-06 13:23:47 -08002095 ASSERT_NO_FATAL_FAILURE(
2096 layer = createLayer("test", 32, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
Valerie Hau0bc09152018-12-20 07:42:47 -08002097 sp<GraphicBuffer> buffer =
Marissa Wall290ad082019-03-06 13:23:47 -08002098 new GraphicBuffer(32, 64, PIXEL_FORMAT_RGBA_8888, 1,
Valerie Hau0bc09152018-12-20 07:42:47 -08002099 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2100 BufferUsage::COMPOSER_OVERLAY,
2101 "test");
Marissa Wall290ad082019-03-06 13:23:47 -08002102 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
2103 fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
2104
2105 Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002106
2107 Transaction().setBuffer(layer, buffer).apply();
2108
2109 // Partially out of bounds in the negative (upper left) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002110 Transaction().setCrop(layer, Rect(-128, -128, 32, 16)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002111 {
2112 SCOPED_TRACE("out of bounds, negative (upper left) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002113 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002114 shot->expectColor(Rect(0, 0, 64, 64), Color::BLUE);
2115 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002116 }
2117
2118 // Partially out of bounds in the positive (lower right) direction
Marissa Wall290ad082019-03-06 13:23:47 -08002119 Transaction().setCrop(layer, Rect(0, 16, 128, 128)).apply();
Valerie Hau0bc09152018-12-20 07:42:47 -08002120 {
2121 SCOPED_TRACE("out of bounds, positive (lower right) direction");
Alec Mouri80863a62019-01-17 15:19:35 -08002122 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002123 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2124 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002125 }
2126
2127 // Fully out of buffer space bounds
2128 Transaction().setCrop(layer, Rect(-128, -128, -1, -1)).apply();
2129 {
2130 SCOPED_TRACE("Fully out of bounds");
Alec Mouri80863a62019-01-17 15:19:35 -08002131 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002132 shot->expectColor(Rect(0, 0, 64, 16), Color::BLUE);
2133 shot->expectColor(Rect(0, 16, 64, 64), Color::RED);
2134 shot->expectBorder(Rect(0, 0, 64, 64), Color::BLACK);
Valerie Hau0bc09152018-12-20 07:42:47 -08002135 }
2136}
2137
Alec Mouri80863a62019-01-17 15:19:35 -08002138TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002139 sp<SurfaceControl> layer;
2140 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002141 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002142
2143 const Point position(32, 32);
2144 const Rect crop(8, 8, 24, 24);
Marissa Wallf58c14b2018-07-24 10:50:43 -07002145 Transaction().setPosition(layer, position.x, position.y).setCrop_legacy(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002146 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002147 shot->expectColor(crop + position, Color::RED);
2148 shot->expectBorder(crop + position, Color::BLACK);
2149}
2150
Alec Mouri80863a62019-01-17 15:19:35 -08002151TEST_P(LayerRenderTypeTransactionTest, SetCropWithTranslation_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002152 sp<SurfaceControl> layer;
2153 ASSERT_NO_FATAL_FAILURE(
2154 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2155 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2156
Marissa Wall861616d2018-10-22 12:52:23 -07002157 const Rect frame(32, 32, 64, 64);
Marissa Wall61c58622018-07-18 10:12:20 -07002158 const Rect crop(8, 8, 24, 24);
Marissa Wall861616d2018-10-22 12:52:23 -07002159 Transaction().setFrame(layer, frame).setCrop(layer, crop).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002160 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002161 shot->expectColor(frame, Color::RED);
2162 shot->expectBorder(frame, Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002163}
2164
Alec Mouri80863a62019-01-17 15:19:35 -08002165TEST_P(LayerRenderTypeTransactionTest, SetCropWithScale_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002166 sp<SurfaceControl> layer;
2167 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002168 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002169
Marissa Wall861616d2018-10-22 12:52:23 -07002170 // crop_legacy is affected by matrix
Chia-I Wu04dcca82017-11-02 08:30:27 -07002171 Transaction()
2172 .setMatrix(layer, 2.0f, 0.0f, 0.0f, 2.0f)
Marissa Wallf58c14b2018-07-24 10:50:43 -07002173 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002174 .apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002175 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002176 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2177 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2178}
2179
Alec Mouri80863a62019-01-17 15:19:35 -08002180TEST_P(LayerRenderTypeTransactionTest, SetCropWithResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002181 sp<SurfaceControl> layer;
2182 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002183 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002184
Marissa Wallf58c14b2018-07-24 10:50:43 -07002185 // setCrop_legacy is applied immediately by default, with or without resize pending
2186 Transaction().setCrop_legacy(layer, Rect(8, 8, 24, 24)).setSize(layer, 16, 16).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002187 {
2188 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002189 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002190 shot->expectColor(Rect(8, 8, 24, 24), Color::RED);
2191 shot->expectBorder(Rect(8, 8, 24, 24), Color::BLACK);
2192 }
2193
Marissa Wall61c58622018-07-18 10:12:20 -07002194 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002195 {
2196 SCOPED_TRACE("resize applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002197 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002198 shot->expectColor(Rect(8, 8, 16, 16), Color::RED);
2199 shot->expectBorder(Rect(8, 8, 16, 16), Color::BLACK);
2200 }
2201}
2202
Alec Mouri80863a62019-01-17 15:19:35 -08002203TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResize_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002204 sp<SurfaceControl> layer;
2205 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002206 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002207
Marissa Wallf58c14b2018-07-24 10:50:43 -07002208 // request setCrop_legacy to be applied with the next resize
2209 Transaction()
2210 .setCrop_legacy(layer, Rect(8, 8, 24, 24))
2211 .setGeometryAppliesWithResize(layer)
2212 .apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002213 {
2214 SCOPED_TRACE("waiting for next resize");
Alec Mouri80863a62019-01-17 15:19:35 -08002215 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002216 }
2217
Marissa Wallf58c14b2018-07-24 10:50:43 -07002218 Transaction().setCrop_legacy(layer, Rect(4, 4, 12, 12)).apply();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002219 {
2220 SCOPED_TRACE("pending crop modified");
Alec Mouri80863a62019-01-17 15:19:35 -08002221 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002222 }
2223
2224 Transaction().setSize(layer, 16, 16).apply();
2225 {
2226 SCOPED_TRACE("resize pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002227 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::RED);
Chia-I Wu04dcca82017-11-02 08:30:27 -07002228 }
2229
2230 // finally resize
Marissa Wall61c58622018-07-18 10:12:20 -07002231 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002232 {
2233 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002234 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002235 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2236 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2237 }
2238}
2239
Alec Mouri80863a62019-01-17 15:19:35 -08002240TEST_P(LayerRenderTypeTransactionTest, SetCropWithNextResizeScaleToWindow_BufferQueue) {
Chia-I Wu04dcca82017-11-02 08:30:27 -07002241 sp<SurfaceControl> layer;
2242 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
Marissa Wall61c58622018-07-18 10:12:20 -07002243 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002244
Marissa Wallf58c14b2018-07-24 10:50:43 -07002245 // setCrop_legacy is not immediate even with SCALE_TO_WINDOW override
Chia-I Wu04dcca82017-11-02 08:30:27 -07002246 Transaction()
Marissa Wallf58c14b2018-07-24 10:50:43 -07002247 .setCrop_legacy(layer, Rect(4, 4, 12, 12))
Chia-I Wu04dcca82017-11-02 08:30:27 -07002248 .setSize(layer, 16, 16)
2249 .setOverrideScalingMode(layer, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)
2250 .setGeometryAppliesWithResize(layer)
2251 .apply();
2252 {
2253 SCOPED_TRACE("new crop pending");
Alec Mouri80863a62019-01-17 15:19:35 -08002254 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002255 shot->expectColor(Rect(0, 0, 16, 16), Color::RED);
2256 shot->expectBorder(Rect(0, 0, 16, 16), Color::BLACK);
2257 }
2258
2259 // XXX crop is never latched without other geometry change (b/69315677)
2260 Transaction().setPosition(layer, 1, 0).setGeometryAppliesWithResize(layer).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002261 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 16, 16));
Chia-I Wu04dcca82017-11-02 08:30:27 -07002262 Transaction().setPosition(layer, 0, 0).apply();
2263 {
2264 SCOPED_TRACE("new crop applied");
Alec Mouri80863a62019-01-17 15:19:35 -08002265 auto shot = getScreenCapture();
Chia-I Wu04dcca82017-11-02 08:30:27 -07002266 shot->expectColor(Rect(4, 4, 12, 12), Color::RED);
2267 shot->expectBorder(Rect(4, 4, 12, 12), Color::BLACK);
2268 }
2269}
2270
Alec Mouri80863a62019-01-17 15:19:35 -08002271TEST_P(LayerRenderTypeTransactionTest, SetFrameBasic_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002272 sp<SurfaceControl> layer;
2273 ASSERT_NO_FATAL_FAILURE(
2274 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2275 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2276 const Rect frame(8, 8, 24, 24);
2277
2278 Transaction().setFrame(layer, frame).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002279 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002280 shot->expectColor(frame, Color::RED);
2281 shot->expectBorder(frame, Color::BLACK);
2282}
2283
Alec Mouri80863a62019-01-17 15:19:35 -08002284TEST_P(LayerRenderTypeTransactionTest, SetFrameEmpty_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002285 sp<SurfaceControl> layer;
2286 ASSERT_NO_FATAL_FAILURE(
2287 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2288 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2289
Marissa Wall61c58622018-07-18 10:12:20 -07002290 {
Marissa Wall861616d2018-10-22 12:52:23 -07002291 SCOPED_TRACE("empty rect");
2292 Transaction().setFrame(layer, Rect(8, 8, 8, 8)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002293 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002294 }
2295
Marissa Wall61c58622018-07-18 10:12:20 -07002296 {
Marissa Wall861616d2018-10-22 12:52:23 -07002297 SCOPED_TRACE("negative rect");
2298 Transaction().setFrame(layer, Rect(8, 8, 0, 0)).apply();
Alec Mouri80863a62019-01-17 15:19:35 -08002299 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002300 }
2301}
2302
Alec Mouri80863a62019-01-17 15:19:35 -08002303TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultParentless_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002304 sp<SurfaceControl> layer;
2305 ASSERT_NO_FATAL_FAILURE(
2306 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2307 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 10, 10));
2308
2309 // A parentless layer will default to a frame with the same size as the buffer
Alec Mouri80863a62019-01-17 15:19:35 -08002310 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002311 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2312 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall861616d2018-10-22 12:52:23 -07002313}
2314
Alec Mouri80863a62019-01-17 15:19:35 -08002315TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBSParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002316 sp<SurfaceControl> parent, child;
2317 ASSERT_NO_FATAL_FAILURE(
2318 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2319 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2320 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2321
2322 ASSERT_NO_FATAL_FAILURE(
2323 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2324 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2325
2326 Transaction().reparent(child, parent->getHandle()).apply();
2327
2328 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002329 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002330 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2331 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2332}
2333
Alec Mouri80863a62019-01-17 15:19:35 -08002334TEST_P(LayerRenderTypeTransactionTest, SetFrameDefaultBQParent_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002335 sp<SurfaceControl> parent, child;
2336 ASSERT_NO_FATAL_FAILURE(parent = createLayer("test", 32, 32));
2337 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(parent, Color::RED, 32, 32));
2338
2339 ASSERT_NO_FATAL_FAILURE(
2340 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2341 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2342
2343 Transaction().reparent(child, parent->getHandle()).apply();
2344
2345 // A layer will default to the frame of its parent
Alec Mouri80863a62019-01-17 15:19:35 -08002346 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002347 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2348 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2349}
2350
Alec Mouri80863a62019-01-17 15:19:35 -08002351TEST_P(LayerRenderTypeTransactionTest, SetFrameUpdate_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002352 sp<SurfaceControl> layer;
2353 ASSERT_NO_FATAL_FAILURE(
2354 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2355 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2356 Transaction().setFrame(layer, Rect(0, 0, 32, 32)).apply();
2357
2358 std::this_thread::sleep_for(500ms);
2359
2360 Transaction().setFrame(layer, Rect(16, 16, 48, 48)).apply();
2361
Alec Mouri80863a62019-01-17 15:19:35 -08002362 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002363 shot->expectColor(Rect(16, 16, 48, 48), Color::RED);
2364 shot->expectBorder(Rect(16, 16, 48, 48), Color::BLACK);
2365}
2366
Alec Mouri80863a62019-01-17 15:19:35 -08002367TEST_P(LayerRenderTypeTransactionTest, SetFrameOutsideBounds_BufferState) {
Marissa Wall861616d2018-10-22 12:52:23 -07002368 sp<SurfaceControl> parent, child;
2369 ASSERT_NO_FATAL_FAILURE(
2370 parent = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2371 ASSERT_NO_FATAL_FAILURE(
2372 child = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2373 Transaction().reparent(child, parent->getHandle()).apply();
2374
2375 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(parent, Color::RED, 32, 32));
2376 Transaction().setFrame(parent, Rect(0, 0, 32, 32)).apply();
2377
2378 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::BLUE, 10, 10));
2379 Transaction().setFrame(child, Rect(0, 16, 32, 32)).apply();
2380
Alec Mouri80863a62019-01-17 15:19:35 -08002381 auto shot = getScreenCapture();
Marissa Wall861616d2018-10-22 12:52:23 -07002382 shot->expectColor(Rect(0, 0, 32, 16), Color::RED);
2383 shot->expectColor(Rect(0, 16, 32, 32), Color::BLUE);
2384 shot->expectBorder(Rect(0, 0, 32, 32), Color::BLACK);
2385}
2386
Alec Mouri80863a62019-01-17 15:19:35 -08002387TEST_P(LayerRenderTypeTransactionTest, SetBufferBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002388 sp<SurfaceControl> layer;
2389 ASSERT_NO_FATAL_FAILURE(
2390 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2391
2392 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2393
Alec Mouri80863a62019-01-17 15:19:35 -08002394 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002395 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2396 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002397}
2398
Alec Mouri80863a62019-01-17 15:19:35 -08002399TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleBuffers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002400 sp<SurfaceControl> layer;
2401 ASSERT_NO_FATAL_FAILURE(
2402 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2403
2404 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2405
2406 {
2407 SCOPED_TRACE("set buffer 1");
Alec Mouri80863a62019-01-17 15:19:35 -08002408 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002409 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2410 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002411 }
2412
2413 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLUE, 32, 32));
2414
2415 {
2416 SCOPED_TRACE("set buffer 2");
Alec Mouri80863a62019-01-17 15:19:35 -08002417 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002418 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLUE);
2419 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002420 }
2421
2422 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::RED, 32, 32));
2423
2424 {
2425 SCOPED_TRACE("set buffer 3");
Alec Mouri80863a62019-01-17 15:19:35 -08002426 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002427 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2428 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002429 }
2430}
2431
Alec Mouri80863a62019-01-17 15:19:35 -08002432TEST_P(LayerRenderTypeTransactionTest, SetBufferMultipleLayers_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002433 sp<SurfaceControl> layer1;
2434 ASSERT_NO_FATAL_FAILURE(
2435 layer1 = createLayer("test", 64, 64, ISurfaceComposerClient::eFXSurfaceBufferState));
2436
2437 sp<SurfaceControl> layer2;
2438 ASSERT_NO_FATAL_FAILURE(
2439 layer2 = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2440
2441 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::RED, 64, 64));
2442
Marissa Wall861616d2018-10-22 12:52:23 -07002443 Transaction().setFrame(layer1, Rect(0, 0, 64, 64)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002444 {
2445 SCOPED_TRACE("set layer 1 buffer red");
Alec Mouri80863a62019-01-17 15:19:35 -08002446 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002447 shot->expectColor(Rect(0, 0, 64, 64), Color::RED);
2448 }
2449
2450 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::BLUE, 32, 32));
2451
Marissa Wall861616d2018-10-22 12:52:23 -07002452 Transaction().setFrame(layer2, Rect(0, 0, 32, 32)).apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002453 {
2454 SCOPED_TRACE("set layer 2 buffer blue");
Alec Mouri80863a62019-01-17 15:19:35 -08002455 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002456 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2457 shot->expectColor(Rect(0, 32, 64, 64), Color::RED);
2458 shot->expectColor(Rect(0, 32, 32, 64), Color::RED);
2459 }
2460
2461 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer1, Color::GREEN, 64, 64));
2462 {
2463 SCOPED_TRACE("set layer 1 buffer green");
Alec Mouri80863a62019-01-17 15:19:35 -08002464 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002465 shot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
2466 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2467 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2468 }
2469
2470 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer2, Color::WHITE, 32, 32));
2471
2472 {
2473 SCOPED_TRACE("set layer 2 buffer white");
Alec Mouri80863a62019-01-17 15:19:35 -08002474 auto shot = getScreenCapture();
Marissa Wall61c58622018-07-18 10:12:20 -07002475 shot->expectColor(Rect(0, 0, 32, 32), Color::WHITE);
2476 shot->expectColor(Rect(0, 32, 64, 64), Color::GREEN);
2477 shot->expectColor(Rect(0, 32, 32, 64), Color::GREEN);
2478 }
2479}
2480
Valerie Haua6b15a12019-02-05 14:16:30 -08002481TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002482 sp<SurfaceControl> layer;
2483 ASSERT_NO_FATAL_FAILURE(
2484 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2485
2486 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2487
2488 std::array<sp<GraphicBuffer>, 10> buffers;
2489
2490 size_t idx = 0;
2491 for (auto& buffer : buffers) {
2492 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2493 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2494 BufferUsage::COMPOSER_OVERLAY,
2495 "test");
2496 Color color = colors[idx % colors.size()];
2497 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2498 idx++;
2499 }
2500
2501 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2502 // cache is working.
2503 idx = 0;
2504 for (auto& buffer : buffers) {
2505 for (int i = 0; i < 2; i++) {
2506 Transaction().setBuffer(layer, buffer).apply();
2507
2508 Color color = colors[idx % colors.size()];
2509 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002510 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2511 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002512 }
2513 idx++;
2514 }
2515}
2516
Valerie Haua6b15a12019-02-05 14:16:30 -08002517TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002518 sp<SurfaceControl> layer;
2519 ASSERT_NO_FATAL_FAILURE(
2520 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2521
2522 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2523
2524 std::array<sp<GraphicBuffer>, 70> buffers;
2525
2526 size_t idx = 0;
2527 for (auto& buffer : buffers) {
2528 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2529 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2530 BufferUsage::COMPOSER_OVERLAY,
2531 "test");
2532 Color color = colors[idx % colors.size()];
2533 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2534 idx++;
2535 }
2536
2537 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2538 // cache is working.
2539 idx = 0;
2540 for (auto& buffer : buffers) {
2541 for (int i = 0; i < 2; i++) {
2542 Transaction().setBuffer(layer, buffer).apply();
2543
2544 Color color = colors[idx % colors.size()];
2545 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002546 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2547 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002548 }
2549 idx++;
2550 }
2551}
2552
Valerie Haua6b15a12019-02-05 14:16:30 -08002553TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferState) {
Marissa Wall73411622019-01-25 10:45:41 -08002554 sp<SurfaceControl> layer;
2555 ASSERT_NO_FATAL_FAILURE(
2556 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2557
2558 std::array<Color, 4> colors = {Color::RED, Color::BLUE, Color::WHITE, Color::GREEN};
2559
2560 std::array<sp<GraphicBuffer>, 65> buffers;
2561
2562 size_t idx = 0;
2563 for (auto& buffer : buffers) {
2564 buffer = new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2565 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2566 BufferUsage::COMPOSER_OVERLAY,
2567 "test");
2568 Color color = colors[idx % colors.size()];
2569 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
2570 idx++;
2571 }
2572
2573 // Set each buffer twice. The first time adds it to the cache, the second time tests that the
2574 // cache is working.
2575 idx = 0;
2576 for (auto& buffer : buffers) {
2577 for (int i = 0; i < 2; i++) {
2578 Transaction().setBuffer(layer, buffer).apply();
2579
2580 Color color = colors[idx % colors.size()];
2581 auto shot = screenshot();
Marissa Wall290ad082019-03-06 13:23:47 -08002582 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), color);
2583 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall73411622019-01-25 10:45:41 -08002584 }
2585 if (idx == 0) {
2586 buffers[0].clear();
2587 }
2588 idx++;
2589 }
2590}
2591
Alec Mouri80863a62019-01-17 15:19:35 -08002592TEST_P(LayerRenderTypeTransactionTest, SetTransformRotate90_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002593 sp<SurfaceControl> layer;
2594 ASSERT_NO_FATAL_FAILURE(
2595 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2596
2597 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2598 Color::BLUE, Color::WHITE));
2599
Marissa Wall861616d2018-10-22 12:52:23 -07002600 Transaction()
2601 .setFrame(layer, Rect(0, 0, 32, 32))
2602 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_ROT_90)
2603 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002604
Alec Mouri80863a62019-01-17 15:19:35 -08002605 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::RED, Color::WHITE,
2606 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002607}
2608
Alec Mouri80863a62019-01-17 15:19:35 -08002609TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipH_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002610 sp<SurfaceControl> layer;
2611 ASSERT_NO_FATAL_FAILURE(
2612 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2613
2614 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2615 Color::BLUE, Color::WHITE));
2616
Marissa Wall861616d2018-10-22 12:52:23 -07002617 Transaction()
2618 .setFrame(layer, Rect(0, 0, 32, 32))
2619 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_H)
2620 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002621
Alec Mouri80863a62019-01-17 15:19:35 -08002622 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::GREEN, Color::RED, Color::WHITE,
2623 Color::BLUE, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002624}
2625
Alec Mouri80863a62019-01-17 15:19:35 -08002626TEST_P(LayerRenderTypeTransactionTest, SetTransformFlipV_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002627 sp<SurfaceControl> layer;
2628 ASSERT_NO_FATAL_FAILURE(
2629 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2630
2631 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerQuadrant(layer, 32, 32, Color::RED, Color::GREEN,
2632 Color::BLUE, Color::WHITE));
2633
Marissa Wall861616d2018-10-22 12:52:23 -07002634 Transaction()
2635 .setFrame(layer, Rect(0, 0, 32, 32))
2636 .setTransform(layer, NATIVE_WINDOW_TRANSFORM_FLIP_V)
2637 .apply();
Marissa Wall61c58622018-07-18 10:12:20 -07002638
Alec Mouri80863a62019-01-17 15:19:35 -08002639 getScreenCapture()->expectQuadrant(Rect(0, 0, 32, 32), Color::BLUE, Color::WHITE, Color::RED,
2640 Color::GREEN, true /* filtered */);
Marissa Wall61c58622018-07-18 10:12:20 -07002641}
2642
2643TEST_F(LayerTransactionTest, SetTransformToDisplayInverse_BufferState) {
2644 sp<SurfaceControl> layer;
2645 ASSERT_NO_FATAL_FAILURE(
2646 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2647
2648 Transaction().setTransformToDisplayInverse(layer, false).apply();
2649
2650 ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::GREEN, 32, 32));
2651
2652 Transaction().setTransformToDisplayInverse(layer, true).apply();
2653}
2654
Alec Mouri80863a62019-01-17 15:19:35 -08002655TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002656 sp<SurfaceControl> layer;
Marissa Wall713b63f2018-10-17 15:42:43 -07002657 Transaction transaction;
2658 ASSERT_NO_FATAL_FAILURE(
2659 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2660
2661 sp<GraphicBuffer> buffer =
2662 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2663 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2664 BufferUsage::COMPOSER_OVERLAY,
2665 "test");
2666 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2667
2668 sp<Fence> fence;
2669 if (getBuffer(nullptr, &fence) != NO_ERROR) {
2670 GTEST_SUCCEED() << "test not supported";
2671 return;
2672 }
2673
2674 Transaction().setBuffer(layer, buffer).setAcquireFence(layer, fence).apply();
2675
2676 status_t status = fence->wait(1000);
2677 ASSERT_NE(static_cast<status_t>(Fence::Status::Unsignaled), status);
2678 std::this_thread::sleep_for(200ms);
2679
Alec Mouri80863a62019-01-17 15:19:35 -08002680 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002681 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2682 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall713b63f2018-10-17 15:42:43 -07002683}
2684
Alec Mouri80863a62019-01-17 15:19:35 -08002685TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
Marissa Wall713b63f2018-10-17 15:42:43 -07002686 sp<SurfaceControl> layer;
Marissa Wall61c58622018-07-18 10:12:20 -07002687 ASSERT_NO_FATAL_FAILURE(
2688 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2689
2690 sp<GraphicBuffer> buffer =
2691 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2692 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2693 BufferUsage::COMPOSER_OVERLAY,
2694 "test");
2695 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2696
Marissa Wallfda30bb2018-10-12 11:34:28 -07002697 sp<Fence> fence = Fence::NO_FENCE;
Marissa Wall61c58622018-07-18 10:12:20 -07002698
2699 Transaction()
2700 .setBuffer(layer, buffer)
2701 .setAcquireFence(layer, fence)
Marissa Wall61c58622018-07-18 10:12:20 -07002702 .apply();
2703
Alec Mouri80863a62019-01-17 15:19:35 -08002704 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002705 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2706 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002707}
2708
Alec Mouri80863a62019-01-17 15:19:35 -08002709TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002710 sp<SurfaceControl> layer;
2711 ASSERT_NO_FATAL_FAILURE(
2712 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2713
2714 sp<GraphicBuffer> buffer =
2715 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2716 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2717 BufferUsage::COMPOSER_OVERLAY,
2718 "test");
2719 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2720
2721 Transaction()
2722 .setBuffer(layer, buffer)
2723 .setDataspace(layer, ui::Dataspace::UNKNOWN)
Marissa Wall61c58622018-07-18 10:12:20 -07002724 .apply();
2725
Alec Mouri80863a62019-01-17 15:19:35 -08002726 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002727 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2728 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002729}
2730
Alec Mouri80863a62019-01-17 15:19:35 -08002731TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002732 sp<SurfaceControl> layer;
2733 ASSERT_NO_FATAL_FAILURE(
2734 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2735
2736 sp<GraphicBuffer> buffer =
2737 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2738 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2739 BufferUsage::COMPOSER_OVERLAY,
2740 "test");
2741 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2742
2743 HdrMetadata hdrMetadata;
2744 hdrMetadata.validTypes = 0;
2745 Transaction()
2746 .setBuffer(layer, buffer)
2747 .setHdrMetadata(layer, hdrMetadata)
Marissa Wall61c58622018-07-18 10:12:20 -07002748 .apply();
2749
Alec Mouri80863a62019-01-17 15:19:35 -08002750 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002751 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2752 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002753}
2754
Alec Mouri80863a62019-01-17 15:19:35 -08002755TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002756 sp<SurfaceControl> layer;
2757 ASSERT_NO_FATAL_FAILURE(
2758 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2759
2760 sp<GraphicBuffer> buffer =
2761 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2762 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2763 BufferUsage::COMPOSER_OVERLAY,
2764 "test");
2765 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2766
2767 Region region;
2768 region.set(32, 32);
2769 Transaction()
2770 .setBuffer(layer, buffer)
2771 .setSurfaceDamageRegion(layer, region)
Marissa Wall61c58622018-07-18 10:12:20 -07002772 .apply();
2773
Alec Mouri80863a62019-01-17 15:19:35 -08002774 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002775 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2776 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002777}
2778
Alec Mouri80863a62019-01-17 15:19:35 -08002779TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
Marissa Wall61c58622018-07-18 10:12:20 -07002780 sp<SurfaceControl> layer;
2781 ASSERT_NO_FATAL_FAILURE(
2782 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2783
2784 sp<GraphicBuffer> buffer =
2785 new GraphicBuffer(32, 32, PIXEL_FORMAT_RGBA_8888, 1,
2786 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
2787 BufferUsage::COMPOSER_OVERLAY,
2788 "test");
2789 fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
2790
2791 Transaction()
2792 .setBuffer(layer, buffer)
2793 .setApi(layer, NATIVE_WINDOW_API_CPU)
Marissa Wall61c58622018-07-18 10:12:20 -07002794 .apply();
2795
Alec Mouri80863a62019-01-17 15:19:35 -08002796 auto shot = getScreenCapture();
Marissa Wall290ad082019-03-06 13:23:47 -08002797 shot->expectColor(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::RED);
2798 shot->expectBorder(Rect(0, 0, mDisplayWidth, mDisplayHeight), Color::BLACK);
Marissa Wall61c58622018-07-18 10:12:20 -07002799}
2800
2801TEST_F(LayerTransactionTest, SetSidebandStreamNull_BufferState) {
2802 sp<SurfaceControl> layer;
2803 ASSERT_NO_FATAL_FAILURE(
2804 layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
2805
2806 // verify this doesn't cause a crash
2807 Transaction().setSidebandStream(layer, nullptr).apply();
2808}
2809
Robert Carr54cf5b12019-01-25 14:02:28 -08002810TEST_F(LayerTransactionTest, ReparentToSelf) {
2811 sp<SurfaceControl> layer;
2812 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
2813 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(layer, Color::RED, 32, 32));
2814 Transaction().reparent(layer, layer->getHandle()).apply();
2815
2816 {
2817 // We expect the transaction to be silently dropped, but for SurfaceFlinger
2818 // to still be functioning.
2819 SCOPED_TRACE("after reparent to self");
2820 const Rect rect(0, 0, 32, 32);
2821 auto shot = screenshot();
2822 shot->expectColor(rect, Color::RED);
2823 shot->expectBorder(rect, Color::BLACK);
2824 }
2825}
2826
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002827class ColorTransformHelper {
2828public:
2829 static void DegammaColorSingle(half& s) {
2830 if (s <= 0.03928f)
2831 s = s / 12.92f;
2832 else
2833 s = pow((s + 0.055f) / 1.055f, 2.4f);
2834 }
2835
2836 static void DegammaColor(half3& color) {
2837 DegammaColorSingle(color.r);
2838 DegammaColorSingle(color.g);
2839 DegammaColorSingle(color.b);
2840 }
2841
2842 static void GammaColorSingle(half& s) {
2843 if (s <= 0.0031308f) {
2844 s = s * 12.92f;
2845 } else {
2846 s = 1.055f * pow(s, (1.0f / 2.4f)) - 0.055f;
2847 }
2848 }
2849
2850 static void GammaColor(half3& color) {
2851 GammaColorSingle(color.r);
2852 GammaColorSingle(color.g);
2853 GammaColorSingle(color.b);
2854 }
2855
2856 static void applyMatrix(half3& color, const mat3& mat) {
2857 half3 ret = half3(0);
2858
2859 for (int i = 0; i < 3; i++) {
2860 for (int j = 0; j < 3; j++) {
2861 ret[i] = ret[i] + color[j] * mat[j][i];
2862 }
2863 }
2864 color = ret;
2865 }
2866};
2867
Alec Mouri80863a62019-01-17 15:19:35 -08002868TEST_P(LayerRenderTypeTransactionTest, SetColorTransformBasic) {
Peiyong Lind3788632018-09-18 16:01:31 -07002869 sp<SurfaceControl> colorLayer;
Vishnu Nair88a11f22018-11-28 18:30:57 -08002870 ASSERT_NO_FATAL_FAILURE(colorLayer =
2871 createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2872 ISurfaceComposerClient::eFXSurfaceColor));
2873 Transaction()
2874 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2875 .setLayer(colorLayer, mLayerZBase + 1)
2876 .apply();
Peiyong Lind3788632018-09-18 16:01:31 -07002877 {
2878 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002879 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
Peiyong Lind3788632018-09-18 16:01:31 -07002880 }
2881
2882 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002883 half3 expected = color;
Peiyong Lind3788632018-09-18 16:01:31 -07002884 mat3 matrix;
2885 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2886 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2887 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07002888
2889 // degamma before applying the matrix
2890 if (mColorManagementUsed) {
2891 ColorTransformHelper::DegammaColor(expected);
2892 }
2893
2894 ColorTransformHelper::applyMatrix(expected, matrix);
2895
2896 if (mColorManagementUsed) {
2897 ColorTransformHelper::GammaColor(expected);
2898 }
2899
2900 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2901 uint8_t(expected.b * 255), 255};
2902
2903 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2904 // channel) should be less than one
2905 const uint8_t tolerance = 1;
2906
Peiyong Lind3788632018-09-18 16:01:31 -07002907 Transaction().setColor(colorLayer, color)
2908 .setColorTransform(colorLayer, matrix, vec3()).apply();
2909 {
2910 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002911 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
Peiyong Lind3788632018-09-18 16:01:31 -07002912 }
2913}
2914
Alec Mouri80863a62019-01-17 15:19:35 -08002915TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnParent) {
chaviwf66724d2018-11-28 16:35:21 -08002916 sp<SurfaceControl> parentLayer;
2917 sp<SurfaceControl> colorLayer;
2918 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2919 0 /* buffer height */,
2920 ISurfaceComposerClient::eFXSurfaceContainer));
2921 ASSERT_NO_FATAL_FAILURE(
2922 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2923 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2924
2925 Transaction()
2926 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2927 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2928 .setLayer(parentLayer, mLayerZBase + 1)
2929 .apply();
2930 {
2931 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002932 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002933 }
2934
2935 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2936 half3 expected = color;
2937 mat3 matrix;
2938 matrix[0][0] = 0.3; matrix[1][0] = 0.59; matrix[2][0] = 0.11;
2939 matrix[0][1] = 0.3; matrix[1][1] = 0.59; matrix[2][1] = 0.11;
2940 matrix[0][2] = 0.3; matrix[1][2] = 0.59; matrix[2][2] = 0.11;
2941
2942 // degamma before applying the matrix
2943 if (mColorManagementUsed) {
2944 ColorTransformHelper::DegammaColor(expected);
2945 }
2946
2947 ColorTransformHelper::applyMatrix(expected, matrix);
2948
2949 if (mColorManagementUsed) {
2950 ColorTransformHelper::GammaColor(expected);
2951 }
2952
2953 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
2954 uint8_t(expected.b * 255), 255};
2955
2956 // this is handwavy, but the precison loss scaled by 255 (8-bit per
2957 // channel) should be less than one
2958 const uint8_t tolerance = 1;
2959
2960 Transaction()
2961 .setColor(colorLayer, color)
2962 .setColorTransform(parentLayer, matrix, vec3())
2963 .apply();
2964 {
2965 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08002966 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08002967 }
2968}
2969
Alec Mouri80863a62019-01-17 15:19:35 -08002970TEST_P(LayerRenderTypeTransactionTest, SetColorTransformOnChildAndParent) {
chaviwf66724d2018-11-28 16:35:21 -08002971 sp<SurfaceControl> parentLayer;
2972 sp<SurfaceControl> colorLayer;
2973 ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parent", 0 /* buffer width */,
2974 0 /* buffer height */,
2975 ISurfaceComposerClient::eFXSurfaceContainer));
2976 ASSERT_NO_FATAL_FAILURE(
2977 colorLayer = createLayer("test", 0 /* buffer width */, 0 /* buffer height */,
2978 ISurfaceComposerClient::eFXSurfaceColor, parentLayer.get()));
2979
2980 Transaction()
2981 .setCrop_legacy(parentLayer, Rect(0, 0, 100, 100))
2982 .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32))
2983 .setLayer(parentLayer, mLayerZBase + 1)
2984 .apply();
2985 {
2986 SCOPED_TRACE("default color");
Alec Mouri80863a62019-01-17 15:19:35 -08002987 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), Color::BLACK);
chaviwf66724d2018-11-28 16:35:21 -08002988 }
2989
2990 const half3 color(50.0f / 255.0f, 100.0f / 255.0f, 150.0f / 255.0f);
2991 half3 expected = color;
2992 mat3 matrixChild;
2993 matrixChild[0][0] = 0.3; matrixChild[1][0] = 0.59; matrixChild[2][0] = 0.11;
2994 matrixChild[0][1] = 0.3; matrixChild[1][1] = 0.59; matrixChild[2][1] = 0.11;
2995 matrixChild[0][2] = 0.3; matrixChild[1][2] = 0.59; matrixChild[2][2] = 0.11;
2996 mat3 matrixParent;
2997 matrixParent[0][0] = 0.2; matrixParent[1][0] = 0.4; matrixParent[2][0] = 0.10;
2998 matrixParent[0][1] = 0.2; matrixParent[1][1] = 0.4; matrixParent[2][1] = 0.10;
2999 matrixParent[0][2] = 0.2; matrixParent[1][2] = 0.4; matrixParent[2][2] = 0.10;
3000
3001 // degamma before applying the matrix
3002 if (mColorManagementUsed) {
3003 ColorTransformHelper::DegammaColor(expected);
3004 }
3005
3006 ColorTransformHelper::applyMatrix(expected, matrixChild);
3007 ColorTransformHelper::applyMatrix(expected, matrixParent);
3008
3009 if (mColorManagementUsed) {
3010 ColorTransformHelper::GammaColor(expected);
3011 }
3012
3013 const Color expectedColor = {uint8_t(expected.r * 255), uint8_t(expected.g * 255),
3014 uint8_t(expected.b * 255), 255};
3015
3016 // this is handwavy, but the precison loss scaled by 255 (8-bit per
3017 // channel) should be less than one
3018 const uint8_t tolerance = 1;
3019
3020 Transaction()
3021 .setColor(colorLayer, color)
3022 .setColorTransform(parentLayer, matrixParent, vec3())
3023 .setColorTransform(colorLayer, matrixChild, vec3())
3024 .apply();
3025 {
3026 SCOPED_TRACE("new color");
Alec Mouri80863a62019-01-17 15:19:35 -08003027 getScreenCapture()->expectColor(Rect(0, 0, 32, 32), expectedColor, tolerance);
chaviwf66724d2018-11-28 16:35:21 -08003028 }
3029}
3030
Marissa Wall80d94ad2019-01-18 16:04:36 -08003031struct CallbackData {
3032 CallbackData() = default;
3033 CallbackData(nsecs_t time, const sp<Fence>& fence,
3034 const std::vector<SurfaceControlStats>& stats)
3035 : latchTime(time), presentFence(fence), surfaceControlStats(stats) {}
3036
3037 nsecs_t latchTime;
3038 sp<Fence> presentFence;
3039 std::vector<SurfaceControlStats> surfaceControlStats;
3040};
3041
Marissa Wallfda30bb2018-10-12 11:34:28 -07003042class ExpectedResult {
3043public:
3044 enum Transaction {
3045 NOT_PRESENTED = 0,
3046 PRESENTED,
3047 };
3048
3049 enum Buffer {
3050 NOT_ACQUIRED = 0,
3051 ACQUIRED,
3052 };
3053
3054 enum PreviousBuffer {
3055 NOT_RELEASED = 0,
3056 RELEASED,
Marissa Wall5a68a772018-12-22 17:43:42 -08003057 UNKNOWN,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003058 };
3059
3060 void reset() {
3061 mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
3062 mExpectedSurfaceResults.clear();
3063 }
3064
3065 void addSurface(ExpectedResult::Transaction transactionResult, const sp<SurfaceControl>& layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003066 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003067 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3068 mTransactionResult = transactionResult;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003069 mExpectedSurfaceResults.emplace(std::piecewise_construct, std::forward_as_tuple(layer),
Marissa Wallfda30bb2018-10-12 11:34:28 -07003070 std::forward_as_tuple(bufferResult, previousBufferResult));
3071 }
3072
3073 void addSurfaces(ExpectedResult::Transaction transactionResult,
3074 const std::vector<sp<SurfaceControl>>& layers,
Marissa Wall713b63f2018-10-17 15:42:43 -07003075 ExpectedResult::Buffer bufferResult = ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003076 ExpectedResult::PreviousBuffer previousBufferResult = NOT_RELEASED) {
3077 for (const auto& layer : layers) {
3078 addSurface(transactionResult, layer, bufferResult, previousBufferResult);
3079 }
3080 }
3081
Marissa Wall17b4e452018-12-26 16:32:34 -08003082 void addExpectedPresentTime(nsecs_t expectedPresentTime) {
3083 mExpectedPresentTime = expectedPresentTime;
3084 }
3085
Marissa Wall80d94ad2019-01-18 16:04:36 -08003086 void verifyCallbackData(const CallbackData& callbackData) const {
3087 const auto& [latchTime, presentFence, surfaceControlStats] = callbackData;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003088 if (mTransactionResult == ExpectedResult::Transaction::PRESENTED) {
3089 ASSERT_GE(latchTime, 0) << "bad latch time";
Valerie Hau63258a12018-12-14 14:31:48 -08003090 ASSERT_NE(presentFence, nullptr);
Marissa Wall17b4e452018-12-26 16:32:34 -08003091 if (mExpectedPresentTime >= 0) {
3092 ASSERT_EQ(presentFence->wait(3000), NO_ERROR);
3093 ASSERT_GE(presentFence->getSignalTime(), mExpectedPresentTime - nsecs_t(5 * 1e6));
3094 // if the panel is running at 30 hz, at the worst case, our expected time just
3095 // misses vsync and we have to wait another 33.3ms
3096 ASSERT_LE(presentFence->getSignalTime(),
3097 mExpectedPresentTime + nsecs_t(66.666666 * 1e6));
3098 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003099 } else {
Valerie Hau63258a12018-12-14 14:31:48 -08003100 ASSERT_EQ(presentFence, nullptr) << "transaction shouldn't have been presented";
Marissa Wallfda30bb2018-10-12 11:34:28 -07003101 ASSERT_EQ(latchTime, -1) << "unpresented transactions shouldn't be latched";
3102 }
3103
Marissa Wall80d94ad2019-01-18 16:04:36 -08003104 ASSERT_EQ(surfaceControlStats.size(), mExpectedSurfaceResults.size())
Marissa Wallfda30bb2018-10-12 11:34:28 -07003105 << "wrong number of surfaces";
3106
Marissa Wall80d94ad2019-01-18 16:04:36 -08003107 for (const auto& stats : surfaceControlStats) {
3108 ASSERT_NE(stats.surfaceControl, nullptr) << "returned null surface control";
3109
Marissa Wallfda30bb2018-10-12 11:34:28 -07003110 const auto& expectedSurfaceResult = mExpectedSurfaceResults.find(stats.surfaceControl);
3111 ASSERT_NE(expectedSurfaceResult, mExpectedSurfaceResults.end())
3112 << "unexpected surface control";
Marissa Wall80d94ad2019-01-18 16:04:36 -08003113 expectedSurfaceResult->second.verifySurfaceControlStats(stats, latchTime);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003114 }
3115 }
3116
3117private:
3118 class ExpectedSurfaceResult {
3119 public:
3120 ExpectedSurfaceResult(ExpectedResult::Buffer bufferResult,
3121 ExpectedResult::PreviousBuffer previousBufferResult)
3122 : mBufferResult(bufferResult), mPreviousBufferResult(previousBufferResult) {}
3123
Marissa Wall80d94ad2019-01-18 16:04:36 -08003124 void verifySurfaceControlStats(const SurfaceControlStats& surfaceControlStats,
3125 nsecs_t latchTime) const {
3126 const auto& [surfaceControl, acquireTime, previousReleaseFence] = surfaceControlStats;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003127
3128 ASSERT_EQ(acquireTime > 0, mBufferResult == ExpectedResult::Buffer::ACQUIRED)
3129 << "bad acquire time";
3130 ASSERT_LE(acquireTime, latchTime) << "acquire time should be <= latch time";
Marissa Wall5a68a772018-12-22 17:43:42 -08003131
3132 if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::RELEASED) {
3133 ASSERT_NE(previousReleaseFence, nullptr)
3134 << "failed to set release prev buffer fence";
3135 } else if (mPreviousBufferResult == ExpectedResult::PreviousBuffer::NOT_RELEASED) {
3136 ASSERT_EQ(previousReleaseFence, nullptr)
3137 << "should not have set released prev buffer fence";
3138 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003139 }
3140
3141 private:
3142 ExpectedResult::Buffer mBufferResult;
3143 ExpectedResult::PreviousBuffer mPreviousBufferResult;
3144 };
3145
Marissa Wall80d94ad2019-01-18 16:04:36 -08003146 struct SCHash {
3147 std::size_t operator()(const sp<SurfaceControl>& sc) const {
3148 return std::hash<IBinder*>{}(sc->getHandle().get());
Marissa Wallfda30bb2018-10-12 11:34:28 -07003149 }
3150 };
3151 ExpectedResult::Transaction mTransactionResult = ExpectedResult::Transaction::NOT_PRESENTED;
Marissa Wall17b4e452018-12-26 16:32:34 -08003152 nsecs_t mExpectedPresentTime = -1;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003153 std::unordered_map<sp<SurfaceControl>, ExpectedSurfaceResult, SCHash> mExpectedSurfaceResults;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003154};
3155
3156class CallbackHelper {
3157public:
Marissa Wall80d94ad2019-01-18 16:04:36 -08003158 static void function(void* callbackContext, nsecs_t latchTime, const sp<Fence>& presentFence,
3159 const std::vector<SurfaceControlStats>& stats) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003160 if (!callbackContext) {
3161 ALOGE("failed to get callback context");
3162 }
3163 CallbackHelper* helper = static_cast<CallbackHelper*>(callbackContext);
3164 std::lock_guard lock(helper->mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003165 helper->mCallbackDataQueue.emplace(latchTime, presentFence, stats);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003166 helper->mConditionVariable.notify_all();
3167 }
3168
Marissa Wall80d94ad2019-01-18 16:04:36 -08003169 void getCallbackData(CallbackData* outData) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003170 std::unique_lock lock(mMutex);
3171
Marissa Wall80d94ad2019-01-18 16:04:36 -08003172 if (mCallbackDataQueue.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003173 ASSERT_NE(mConditionVariable.wait_for(lock, std::chrono::seconds(3)),
3174 std::cv_status::timeout)
3175 << "did not receive callback";
3176 }
3177
Marissa Wall80d94ad2019-01-18 16:04:36 -08003178 *outData = std::move(mCallbackDataQueue.front());
3179 mCallbackDataQueue.pop();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003180 }
3181
3182 void verifyFinalState() {
3183 // Wait to see if there are extra callbacks
3184 std::this_thread::sleep_for(500ms);
3185
3186 std::lock_guard lock(mMutex);
Marissa Wall80d94ad2019-01-18 16:04:36 -08003187 EXPECT_EQ(mCallbackDataQueue.size(), 0) << "extra callbacks received";
3188 mCallbackDataQueue = {};
Marissa Wallfda30bb2018-10-12 11:34:28 -07003189 }
3190
3191 void* getContext() { return static_cast<void*>(this); }
3192
3193 std::mutex mMutex;
3194 std::condition_variable mConditionVariable;
Marissa Wall80d94ad2019-01-18 16:04:36 -08003195 std::queue<CallbackData> mCallbackDataQueue;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003196};
3197
3198class LayerCallbackTest : public LayerTransactionTest {
Marissa Wall861616d2018-10-22 12:52:23 -07003199public:
Marissa Wallfda30bb2018-10-12 11:34:28 -07003200 virtual sp<SurfaceControl> createBufferStateLayer() {
Marissa Wall861616d2018-10-22 12:52:23 -07003201 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003202 }
3203
Marissa Wall713b63f2018-10-17 15:42:43 -07003204 static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper,
Valerie Hauaa194562019-02-05 16:21:38 -08003205 const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true,
3206 bool setBackgroundColor = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003207 if (layer) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003208 sp<GraphicBuffer> buffer;
3209 sp<Fence> fence;
Valerie Hauaa194562019-02-05 16:21:38 -08003210 if (setBuffer) {
3211 int err = getBuffer(&buffer, &fence);
3212 if (err != NO_ERROR) {
3213 return err;
3214 }
3215
3216 transaction.setBuffer(layer, buffer);
3217 transaction.setAcquireFence(layer, fence);
Marissa Wall713b63f2018-10-17 15:42:43 -07003218 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003219
Valerie Hauaa194562019-02-05 16:21:38 -08003220 if (setBackgroundColor) {
3221 transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f,
3222 ui::Dataspace::UNKNOWN);
3223 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003224 }
3225
3226 transaction.addTransactionCompletedCallback(callbackHelper->function,
3227 callbackHelper->getContext());
Marissa Wall713b63f2018-10-17 15:42:43 -07003228 return NO_ERROR;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003229 }
3230
Marissa Wall861616d2018-10-22 12:52:23 -07003231 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult,
3232 bool finalState = false) {
Marissa Wall80d94ad2019-01-18 16:04:36 -08003233 CallbackData callbackData;
3234 ASSERT_NO_FATAL_FAILURE(helper.getCallbackData(&callbackData));
3235 EXPECT_NO_FATAL_FAILURE(expectedResult.verifyCallbackData(callbackData));
Marissa Wallfda30bb2018-10-12 11:34:28 -07003236
3237 if (finalState) {
3238 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3239 }
3240 }
3241
Marissa Wall861616d2018-10-22 12:52:23 -07003242 static void waitForCallbacks(CallbackHelper& helper,
3243 const std::vector<ExpectedResult>& expectedResults,
3244 bool finalState = false) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003245 for (const auto& expectedResult : expectedResults) {
3246 waitForCallback(helper, expectedResult);
3247 }
3248 if (finalState) {
3249 ASSERT_NO_FATAL_FAILURE(helper.verifyFinalState());
3250 }
3251 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003252};
3253
Valerie Hauaa194562019-02-05 16:21:38 -08003254TEST_F(LayerCallbackTest, BufferColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003255 sp<SurfaceControl> layer;
3256 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3257
3258 Transaction transaction;
3259 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003260 int err = fillTransaction(transaction, &callback, layer, true, true);
Marissa Wall713b63f2018-10-17 15:42:43 -07003261 if (err) {
3262 GTEST_SUCCEED() << "test not supported";
3263 return;
3264 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003265
3266 transaction.apply();
3267
3268 ExpectedResult expected;
3269 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3270 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3271}
3272
Valerie Hauaa194562019-02-05 16:21:38 -08003273TEST_F(LayerCallbackTest, NoBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003274 sp<SurfaceControl> layer;
3275 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3276
3277 Transaction transaction;
3278 CallbackHelper callback;
Valerie Hauaa194562019-02-05 16:21:38 -08003279 int err = fillTransaction(transaction, &callback, layer, false, false);
Marissa Wall713b63f2018-10-17 15:42:43 -07003280 if (err) {
3281 GTEST_SUCCEED() << "test not supported";
3282 return;
3283 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003284
Marissa Wall861616d2018-10-22 12:52:23 -07003285 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003286
3287 ExpectedResult expected;
Marissa Wall713b63f2018-10-17 15:42:43 -07003288 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3289 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003290 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3291}
3292
Valerie Hauaa194562019-02-05 16:21:38 -08003293TEST_F(LayerCallbackTest, BufferNoColor) {
3294 sp<SurfaceControl> layer;
3295 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3296
3297 Transaction transaction;
3298 CallbackHelper callback;
3299 int err = fillTransaction(transaction, &callback, layer, true, false);
3300 if (err) {
3301 GTEST_SUCCEED() << "test not supported";
3302 return;
3303 }
3304
3305 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3306
3307 ExpectedResult expected;
3308 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3309 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3310}
3311
3312TEST_F(LayerCallbackTest, NoBufferColor) {
3313 sp<SurfaceControl> layer;
3314 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3315
3316 Transaction transaction;
3317 CallbackHelper callback;
3318 int err = fillTransaction(transaction, &callback, layer, false, true);
3319 if (err) {
3320 GTEST_SUCCEED() << "test not supported";
3321 return;
3322 }
3323
3324 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
3325
3326 ExpectedResult expected;
3327 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3328 ExpectedResult::Buffer::NOT_ACQUIRED);
3329 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3330}
3331
Marissa Wallfda30bb2018-10-12 11:34:28 -07003332TEST_F(LayerCallbackTest, NoStateChange) {
3333 Transaction transaction;
3334 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003335 int err = fillTransaction(transaction, &callback);
3336 if (err) {
3337 GTEST_SUCCEED() << "test not supported";
3338 return;
3339 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003340
3341 transaction.apply();
3342
3343 ExpectedResult expected;
3344 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3345}
3346
3347TEST_F(LayerCallbackTest, OffScreen) {
3348 sp<SurfaceControl> layer;
3349 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3350
3351 Transaction transaction;
3352 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003353 int err = fillTransaction(transaction, &callback, layer);
3354 if (err) {
3355 GTEST_SUCCEED() << "test not supported";
3356 return;
3357 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003358
Marissa Wall861616d2018-10-22 12:52:23 -07003359 transaction.setFrame(layer, Rect(-100, -100, 100, 100)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003360
3361 ExpectedResult expected;
3362 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3363 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3364}
3365
Valerie Hauaa194562019-02-05 16:21:38 -08003366TEST_F(LayerCallbackTest, MergeBufferNoColor) {
Marissa Wallfda30bb2018-10-12 11:34:28 -07003367 sp<SurfaceControl> layer1, layer2;
3368 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3369 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3370
3371 Transaction transaction1, transaction2;
3372 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003373 int err = fillTransaction(transaction1, &callback1, layer1);
3374 if (err) {
3375 GTEST_SUCCEED() << "test not supported";
3376 return;
3377 }
3378 err = fillTransaction(transaction2, &callback2, layer2);
3379 if (err) {
3380 GTEST_SUCCEED() << "test not supported";
3381 return;
3382 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003383
Marissa Wall861616d2018-10-22 12:52:23 -07003384 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3385 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003386
3387 ExpectedResult expected;
3388 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3389 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3390 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3391}
3392
Valerie Hauaa194562019-02-05 16:21:38 -08003393TEST_F(LayerCallbackTest, MergeNoBufferColor) {
3394 sp<SurfaceControl> layer1, layer2;
3395 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3396 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3397
3398 Transaction transaction1, transaction2;
3399 CallbackHelper callback1, callback2;
3400 int err = fillTransaction(transaction1, &callback1, layer1, false, true);
3401 if (err) {
3402 GTEST_SUCCEED() << "test not supported";
3403 return;
3404 }
3405 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3406 if (err) {
3407 GTEST_SUCCEED() << "test not supported";
3408 return;
3409 }
3410
3411 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3412 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3413
3414 ExpectedResult expected;
3415 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
3416 ExpectedResult::Buffer::NOT_ACQUIRED);
3417 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3418 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3419}
3420
3421TEST_F(LayerCallbackTest, MergeOneBufferOneColor) {
3422 sp<SurfaceControl> layer1, layer2;
3423 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3424 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3425
3426 Transaction transaction1, transaction2;
3427 CallbackHelper callback1, callback2;
3428 int err = fillTransaction(transaction1, &callback1, layer1);
3429 if (err) {
3430 GTEST_SUCCEED() << "test not supported";
3431 return;
3432 }
3433 err = fillTransaction(transaction2, &callback2, layer2, false, true);
3434 if (err) {
3435 GTEST_SUCCEED() << "test not supported";
3436 return;
3437 }
3438
3439 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3440 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
3441
3442 ExpectedResult expected;
3443 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer1);
3444 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer2,
3445 ExpectedResult::Buffer::NOT_ACQUIRED);
3446 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3447 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3448}
Marissa Wallfda30bb2018-10-12 11:34:28 -07003449TEST_F(LayerCallbackTest, Merge_SameCallback) {
3450 sp<SurfaceControl> layer1, layer2;
3451 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3452 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3453
3454 Transaction transaction1, transaction2;
3455 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003456 int err = fillTransaction(transaction1, &callback, layer1);
3457 if (err) {
3458 GTEST_SUCCEED() << "test not supported";
3459 return;
3460 }
3461 err = fillTransaction(transaction2, &callback, layer2);
3462 if (err) {
3463 GTEST_SUCCEED() << "test not supported";
3464 return;
3465 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003466
3467 transaction2.merge(std::move(transaction1)).apply();
3468
3469 ExpectedResult expected;
3470 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3471 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3472 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3473}
3474
3475TEST_F(LayerCallbackTest, Merge_SameLayer) {
3476 sp<SurfaceControl> layer;
3477 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3478
3479 Transaction transaction1, transaction2;
3480 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003481 int err = fillTransaction(transaction1, &callback1, layer);
3482 if (err) {
3483 GTEST_SUCCEED() << "test not supported";
3484 return;
3485 }
3486 err = fillTransaction(transaction2, &callback2, layer);
3487 if (err) {
3488 GTEST_SUCCEED() << "test not supported";
3489 return;
3490 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003491
3492 transaction2.merge(std::move(transaction1)).apply();
3493
3494 ExpectedResult expected;
3495 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3496 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3497 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3498}
3499
Marissa Wallfda30bb2018-10-12 11:34:28 -07003500TEST_F(LayerCallbackTest, Merge_DifferentClients) {
3501 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3502 client2(new SurfaceComposerClient);
3503
3504 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3505 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3506
3507 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003508 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003509 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003510 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003511 ISurfaceComposerClient::eFXSurfaceBufferState));
3512
3513 Transaction transaction1, transaction2;
3514 CallbackHelper callback1, callback2;
Marissa Wall713b63f2018-10-17 15:42:43 -07003515 int err = fillTransaction(transaction1, &callback1, layer1);
3516 if (err) {
3517 GTEST_SUCCEED() << "test not supported";
3518 return;
3519 }
3520 err = fillTransaction(transaction2, &callback2, layer2);
3521 if (err) {
3522 GTEST_SUCCEED() << "test not supported";
3523 return;
3524 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003525
Marissa Wall861616d2018-10-22 12:52:23 -07003526 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3527 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003528
3529 ExpectedResult expected;
3530 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3531 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3532 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3533}
3534
3535TEST_F(LayerCallbackTest, MultipleTransactions) {
3536 sp<SurfaceControl> layer;
3537 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3538
3539 Transaction transaction;
3540 CallbackHelper callback;
3541 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003542 int err = fillTransaction(transaction, &callback, layer);
3543 if (err) {
3544 GTEST_SUCCEED() << "test not supported";
3545 return;
3546 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003547
3548 transaction.apply();
3549
3550 ExpectedResult expected;
3551 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall713b63f2018-10-17 15:42:43 -07003552 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003553 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3554 : ExpectedResult::PreviousBuffer::RELEASED);
3555 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3556 }
3557 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3558}
3559
3560TEST_F(LayerCallbackTest, MultipleTransactions_NoStateChange) {
3561 sp<SurfaceControl> layer;
3562 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3563
3564 Transaction transaction;
3565 CallbackHelper callback;
3566 for (size_t i = 0; i < 10; i++) {
3567 ExpectedResult expected;
3568
3569 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003570 int err = fillTransaction(transaction, &callback, layer);
3571 if (err) {
3572 GTEST_SUCCEED() << "test not supported";
3573 return;
3574 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003575 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3576 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003577 int err = fillTransaction(transaction, &callback);
3578 if (err) {
3579 GTEST_SUCCEED() << "test not supported";
3580 return;
3581 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003582 }
3583
3584 transaction.apply();
3585
3586 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected));
3587 }
3588 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3589}
3590
3591TEST_F(LayerCallbackTest, MultipleTransactions_SameStateChange) {
3592 sp<SurfaceControl> layer;
3593 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3594
3595 Transaction transaction;
3596 CallbackHelper callback;
3597 for (size_t i = 0; i < 10; i++) {
3598 if (i == 0) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003599 int err = fillTransaction(transaction, &callback, layer);
3600 if (err) {
3601 GTEST_SUCCEED() << "test not supported";
3602 return;
3603 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003604 } else {
Marissa Wall713b63f2018-10-17 15:42:43 -07003605 int err = fillTransaction(transaction, &callback);
3606 if (err) {
3607 GTEST_SUCCEED() << "test not supported";
3608 return;
3609 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003610 }
3611
Marissa Wall861616d2018-10-22 12:52:23 -07003612 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003613
3614 ExpectedResult expected;
3615 expected.addSurface((i == 0) ? ExpectedResult::Transaction::PRESENTED
3616 : ExpectedResult::Transaction::NOT_PRESENTED,
Marissa Wall713b63f2018-10-17 15:42:43 -07003617 layer,
3618 (i == 0) ? ExpectedResult::Buffer::ACQUIRED
3619 : ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003620 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, i == 0));
3621 }
3622 ASSERT_NO_FATAL_FAILURE(callback.verifyFinalState());
3623}
3624
3625TEST_F(LayerCallbackTest, MultipleTransactions_Merge) {
3626 sp<SurfaceControl> layer1, layer2;
3627 ASSERT_NO_FATAL_FAILURE(layer1 = createBufferStateLayer());
3628 ASSERT_NO_FATAL_FAILURE(layer2 = createBufferStateLayer());
3629
3630 Transaction transaction1, transaction2;
3631 CallbackHelper callback1, callback2;
3632 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003633 int err = fillTransaction(transaction1, &callback1, layer1);
3634 if (err) {
3635 GTEST_SUCCEED() << "test not supported";
3636 return;
3637 }
3638 err = fillTransaction(transaction2, &callback2, layer2);
3639 if (err) {
3640 GTEST_SUCCEED() << "test not supported";
3641 return;
3642 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003643
Marissa Wall861616d2018-10-22 12:52:23 -07003644 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3645 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003646
3647 ExpectedResult expected;
3648 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003649 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003650 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3651 : ExpectedResult::PreviousBuffer::RELEASED);
3652 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3653 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3654 }
3655 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3656 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3657}
3658
3659TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients) {
3660 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3661 client2(new SurfaceComposerClient);
3662 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3663 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3664
3665 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003666 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003667 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003668 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003669 ISurfaceComposerClient::eFXSurfaceBufferState));
3670
3671 Transaction transaction1, transaction2;
3672 CallbackHelper callback1, callback2;
3673 for (size_t i = 0; i < 10; i++) {
Marissa Wall713b63f2018-10-17 15:42:43 -07003674 int err = fillTransaction(transaction1, &callback1, layer1);
3675 if (err) {
3676 GTEST_SUCCEED() << "test not supported";
3677 return;
3678 }
3679 err = fillTransaction(transaction2, &callback2, layer2);
3680 if (err) {
3681 GTEST_SUCCEED() << "test not supported";
3682 return;
3683 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003684
Marissa Wall861616d2018-10-22 12:52:23 -07003685 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3686 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003687
3688 ExpectedResult expected;
3689 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2},
Marissa Wall713b63f2018-10-17 15:42:43 -07003690 ExpectedResult::Buffer::ACQUIRED,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003691 (i == 0) ? ExpectedResult::PreviousBuffer::NOT_RELEASED
3692 : ExpectedResult::PreviousBuffer::RELEASED);
3693 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
3694 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected));
3695 }
3696 ASSERT_NO_FATAL_FAILURE(callback1.verifyFinalState());
3697 ASSERT_NO_FATAL_FAILURE(callback2.verifyFinalState());
3698}
3699
3700TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_NoStateChange) {
3701 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3702 client2(new SurfaceComposerClient);
3703 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3704 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3705
3706 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003707 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003708 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003709 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003710 ISurfaceComposerClient::eFXSurfaceBufferState));
3711
3712 Transaction transaction1, transaction2;
3713 CallbackHelper callback1, callback2;
3714
3715 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003716 int err = fillTransaction(transaction1, &callback1, layer1);
3717 if (err) {
3718 GTEST_SUCCEED() << "test not supported";
3719 return;
3720 }
3721 err = fillTransaction(transaction2, &callback2, layer2);
3722 if (err) {
3723 GTEST_SUCCEED() << "test not supported";
3724 return;
3725 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003726
Marissa Wall861616d2018-10-22 12:52:23 -07003727 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3728 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003729
3730 ExpectedResult expected;
3731 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3732 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3733 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3734 expected.reset();
3735
3736 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003737 err = fillTransaction(transaction1, &callback1);
3738 if (err) {
3739 GTEST_SUCCEED() << "test not supported";
3740 return;
3741 }
3742 err = fillTransaction(transaction2, &callback2);
3743 if (err) {
3744 GTEST_SUCCEED() << "test not supported";
3745 return;
3746 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003747
3748 transaction2.merge(std::move(transaction1)).apply();
3749
3750 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3751 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3752}
3753
3754TEST_F(LayerCallbackTest, MultipleTransactions_Merge_DifferentClients_SameStateChange) {
3755 sp<SurfaceComposerClient> client1(new SurfaceComposerClient),
3756 client2(new SurfaceComposerClient);
3757
3758 ASSERT_EQ(NO_ERROR, client1->initCheck()) << "failed to create SurfaceComposerClient";
3759 ASSERT_EQ(NO_ERROR, client2->initCheck()) << "failed to create SurfaceComposerClient";
3760
3761 sp<SurfaceControl> layer1, layer2;
Marissa Wall861616d2018-10-22 12:52:23 -07003762 ASSERT_NO_FATAL_FAILURE(layer1 = createLayer(client1, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003763 ISurfaceComposerClient::eFXSurfaceBufferState));
Marissa Wall861616d2018-10-22 12:52:23 -07003764 ASSERT_NO_FATAL_FAILURE(layer2 = createLayer(client2, "test", 0, 0,
Marissa Wallfda30bb2018-10-12 11:34:28 -07003765 ISurfaceComposerClient::eFXSurfaceBufferState));
3766
3767 Transaction transaction1, transaction2;
3768 CallbackHelper callback1, callback2;
3769
3770 // Normal call to set up test
Marissa Wall713b63f2018-10-17 15:42:43 -07003771 int err = fillTransaction(transaction1, &callback1, layer1);
3772 if (err) {
3773 GTEST_SUCCEED() << "test not supported";
3774 return;
3775 }
3776 err = fillTransaction(transaction2, &callback2, layer2);
3777 if (err) {
3778 GTEST_SUCCEED() << "test not supported";
3779 return;
3780 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003781
Marissa Wall861616d2018-10-22 12:52:23 -07003782 transaction1.setFrame(layer1, Rect(0, 0, 32, 32));
3783 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003784
3785 ExpectedResult expected;
3786 expected.addSurfaces(ExpectedResult::Transaction::PRESENTED, {layer1, layer2});
3787 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3788 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3789 expected.reset();
3790
3791 // Test
Marissa Wall713b63f2018-10-17 15:42:43 -07003792 err = fillTransaction(transaction1, &callback1);
3793 if (err) {
3794 GTEST_SUCCEED() << "test not supported";
3795 return;
3796 }
3797 err = fillTransaction(transaction2, &callback2);
3798 if (err) {
3799 GTEST_SUCCEED() << "test not supported";
3800 return;
3801 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003802
Marissa Wall861616d2018-10-22 12:52:23 -07003803 transaction2.setFrame(layer2, Rect(32, 32, 64, 64)).merge(std::move(transaction1)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003804
Marissa Wall713b63f2018-10-17 15:42:43 -07003805 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer2,
3806 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003807 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected, true));
3808 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected, true));
3809}
3810
3811TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame) {
3812 sp<SurfaceControl> layer;
3813 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3814
3815 Transaction transaction;
3816 CallbackHelper callback;
3817 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003818 for (auto& expected : expectedResults) {
3819 expected.reset();
3820 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
Marissa Wall5a68a772018-12-22 17:43:42 -08003821 ExpectedResult::Buffer::ACQUIRED,
3822 ExpectedResult::PreviousBuffer::UNKNOWN);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003823
Marissa Wall713b63f2018-10-17 15:42:43 -07003824 int err = fillTransaction(transaction, &callback, layer);
3825 if (err) {
3826 GTEST_SUCCEED() << "test not supported";
3827 return;
3828 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003829
3830 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003831 }
3832 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3833}
3834
3835TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_NoStateChange) {
3836 sp<SurfaceControl> layer;
3837 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3838
Marissa Wall713b63f2018-10-17 15:42:43 -07003839 // Normal call to set up test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003840 Transaction transaction;
3841 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003842 int err = fillTransaction(transaction, &callback, layer);
3843 if (err) {
3844 GTEST_SUCCEED() << "test not supported";
3845 return;
3846 }
3847
3848 transaction.apply();
3849
3850 ExpectedResult expected;
3851 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3852 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3853
3854 // Test
Marissa Wallfda30bb2018-10-12 11:34:28 -07003855 std::vector<ExpectedResult> expectedResults(50);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003856 for (auto& expected : expectedResults) {
3857 expected.reset();
3858
Marissa Wall713b63f2018-10-17 15:42:43 -07003859 err = fillTransaction(transaction, &callback);
3860 if (err) {
3861 GTEST_SUCCEED() << "test not supported";
3862 return;
Marissa Wallfda30bb2018-10-12 11:34:28 -07003863 }
3864
3865 transaction.apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003866 }
3867 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3868}
3869
3870TEST_F(LayerCallbackTest, MultipleTransactions_SingleFrame_SameStateChange) {
3871 sp<SurfaceControl> layer;
3872 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3873
3874 // Normal call to set up test
3875 Transaction transaction;
3876 CallbackHelper callback;
Marissa Wall713b63f2018-10-17 15:42:43 -07003877 int err = fillTransaction(transaction, &callback, layer);
3878 if (err) {
3879 GTEST_SUCCEED() << "test not supported";
3880 return;
3881 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003882
Marissa Wall861616d2018-10-22 12:52:23 -07003883 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003884
3885 ExpectedResult expectedResult;
3886 expectedResult.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3887 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expectedResult, true));
3888
3889 // Test
3890 std::vector<ExpectedResult> expectedResults(50);
3891 for (auto& expected : expectedResults) {
3892 expected.reset();
Marissa Wall713b63f2018-10-17 15:42:43 -07003893 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
3894 ExpectedResult::Buffer::NOT_ACQUIRED);
Marissa Wallfda30bb2018-10-12 11:34:28 -07003895
Marissa Wall713b63f2018-10-17 15:42:43 -07003896 err = fillTransaction(transaction, &callback);
3897 if (err) {
3898 GTEST_SUCCEED() << "test not supported";
3899 return;
3900 }
Marissa Wallfda30bb2018-10-12 11:34:28 -07003901
Marissa Wall861616d2018-10-22 12:52:23 -07003902 transaction.setFrame(layer, Rect(0, 0, 32, 32)).apply();
Marissa Wallfda30bb2018-10-12 11:34:28 -07003903 }
3904 EXPECT_NO_FATAL_FAILURE(waitForCallbacks(callback, expectedResults, true));
3905}
3906
Marissa Wall17b4e452018-12-26 16:32:34 -08003907TEST_F(LayerCallbackTest, DesiredPresentTime) {
3908 sp<SurfaceControl> layer;
3909 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3910
3911 Transaction transaction;
3912 CallbackHelper callback;
3913 int err = fillTransaction(transaction, &callback, layer);
3914 if (err) {
3915 GTEST_SUCCEED() << "test not supported";
3916 return;
3917 }
3918
3919 // Try to present 100ms in the future
3920 nsecs_t time = systemTime() + (100 * 1e6);
3921
3922 transaction.setDesiredPresentTime(time);
3923 transaction.apply();
3924
3925 ExpectedResult expected;
3926 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3927 expected.addExpectedPresentTime(time);
3928 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
3929}
3930
3931TEST_F(LayerCallbackTest, DesiredPresentTime_Multiple) {
3932 sp<SurfaceControl> layer;
3933 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3934
3935 Transaction transaction;
3936 CallbackHelper callback1;
3937 int err = fillTransaction(transaction, &callback1, layer);
3938 if (err) {
3939 GTEST_SUCCEED() << "test not supported";
3940 return;
3941 }
3942
3943 // Try to present 100ms in the future
3944 nsecs_t time = systemTime() + (100 * 1e6);
3945
3946 transaction.setDesiredPresentTime(time);
3947 transaction.apply();
3948
3949 ExpectedResult expected1;
3950 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3951 expected1.addExpectedPresentTime(time);
3952
3953 CallbackHelper callback2;
3954 err = fillTransaction(transaction, &callback2, layer);
3955 if (err) {
3956 GTEST_SUCCEED() << "test not supported";
3957 return;
3958 }
3959
3960 // Try to present 33ms after the first frame
3961 time += (33.3 * 1e6);
3962
3963 transaction.setDesiredPresentTime(time);
3964 transaction.apply();
3965
3966 ExpectedResult expected2;
3967 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
3968 ExpectedResult::Buffer::ACQUIRED,
3969 ExpectedResult::PreviousBuffer::RELEASED);
3970 expected2.addExpectedPresentTime(time);
3971
3972 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
3973 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
3974}
3975
3976TEST_F(LayerCallbackTest, DesiredPresentTime_OutOfOrder) {
3977 sp<SurfaceControl> layer;
3978 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
3979
3980 Transaction transaction;
3981 CallbackHelper callback1;
3982 int err = fillTransaction(transaction, &callback1, layer);
3983 if (err) {
3984 GTEST_SUCCEED() << "test not supported";
3985 return;
3986 }
3987
3988 // Try to present 100ms in the future
3989 nsecs_t time = systemTime() + (100 * 1e6);
3990
3991 transaction.setDesiredPresentTime(time);
3992 transaction.apply();
3993
3994 ExpectedResult expected1;
3995 expected1.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
3996 expected1.addExpectedPresentTime(time);
3997
3998 CallbackHelper callback2;
3999 err = fillTransaction(transaction, &callback2, layer);
4000 if (err) {
4001 GTEST_SUCCEED() << "test not supported";
4002 return;
4003 }
4004
4005 // Try to present 33ms before the previous frame
4006 time -= (33.3 * 1e6);
4007
4008 transaction.setDesiredPresentTime(time);
4009 transaction.apply();
4010
4011 ExpectedResult expected2;
4012 expected2.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
4013 ExpectedResult::Buffer::ACQUIRED,
4014 ExpectedResult::PreviousBuffer::RELEASED);
4015
4016 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback1, expected1, true));
4017 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback2, expected2, true));
4018}
4019
4020TEST_F(LayerCallbackTest, DesiredPresentTime_Past) {
4021 sp<SurfaceControl> layer;
4022 ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer());
4023
4024 Transaction transaction;
4025 CallbackHelper callback;
4026 int err = fillTransaction(transaction, &callback, layer);
4027 if (err) {
4028 GTEST_SUCCEED() << "test not supported";
4029 return;
4030 }
4031
4032 // Try to present 100ms in the past
4033 nsecs_t time = systemTime() - (100 * 1e6);
4034
4035 transaction.setDesiredPresentTime(time);
4036 transaction.apply();
4037
4038 ExpectedResult expected;
4039 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer);
4040 expected.addExpectedPresentTime(systemTime());
4041 EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true));
4042}
4043
Chavi Weingarten40482ff2017-11-30 01:51:40 +00004044class LayerUpdateTest : public LayerTransactionTest {
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004045protected:
4046 virtual void SetUp() {
chaviw0e3479f2018-09-10 16:49:30 -07004047 LayerTransactionTest::SetUp();
4048 ASSERT_EQ(NO_ERROR, mClient->initCheck());
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004049
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004050 const auto display = SurfaceComposerClient::getInternalDisplayToken();
4051 ASSERT_FALSE(display == nullptr);
4052
Mathias Agopianc666cae2012-07-25 18:56:13 -07004053 DisplayInfo info;
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08004054 ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getDisplayInfo(display, &info));
Mathias Agopianc666cae2012-07-25 18:56:13 -07004055
4056 ssize_t displayWidth = info.w;
4057 ssize_t displayHeight = info.h;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004058
4059 // Background surface
chaviw0e3479f2018-09-10 16:49:30 -07004060 mBGSurfaceControl = createLayer(String8("BG Test Surface"), displayWidth,
4061 displayHeight, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004062 ASSERT_TRUE(mBGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004063 ASSERT_TRUE(mBGSurfaceControl->isValid());
4064 fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
4065
4066 // Foreground surface
chaviw0e3479f2018-09-10 16:49:30 -07004067 mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
4068
Peiyong Lin566a3b42018-01-09 18:22:43 -08004069 ASSERT_TRUE(mFGSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004070 ASSERT_TRUE(mFGSurfaceControl->isValid());
4071
4072 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4073
4074 // Synchronization surface
chaviw0e3479f2018-09-10 16:49:30 -07004075 mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004076 ASSERT_TRUE(mSyncSurfaceControl != nullptr);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004077 ASSERT_TRUE(mSyncSurfaceControl->isValid());
4078
4079 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4080
Robert Carr4cdc58f2017-08-23 14:22:20 -07004081 asTransaction([&](Transaction& t) {
4082 t.setDisplayLayerStack(display, 0);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004083
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004084 t.setLayer(mBGSurfaceControl, INT32_MAX - 2).show(mBGSurfaceControl);
Pablo Ceballos5e4fcbe2015-09-02 09:53:16 -07004085
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004086 t.setLayer(mFGSurfaceControl, INT32_MAX - 1)
4087 .setPosition(mFGSurfaceControl, 64, 64)
4088 .show(mFGSurfaceControl);
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004089
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004090 t.setLayer(mSyncSurfaceControl, INT32_MAX - 1)
4091 .setPosition(mSyncSurfaceControl, displayWidth - 2, displayHeight - 2)
4092 .show(mSyncSurfaceControl);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004093 });
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004094 }
4095
4096 virtual void TearDown() {
chaviw0e3479f2018-09-10 16:49:30 -07004097 LayerTransactionTest::TearDown();
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004098 mBGSurfaceControl = 0;
4099 mFGSurfaceControl = 0;
4100 mSyncSurfaceControl = 0;
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004101 }
4102
4103 void waitForPostedBuffers() {
4104 // Since the sync surface is in synchronous mode (i.e. double buffered)
4105 // posting three buffers to it should ensure that at least two
4106 // SurfaceFlinger::handlePageFlip calls have been made, which should
4107 // guaranteed that a buffer posted to another Surface has been retired.
4108 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4109 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4110 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4111 }
4112
Robert Carr4cdc58f2017-08-23 14:22:20 -07004113
Jamie Gennis23c2c5d2011-10-11 19:22:19 -07004114 sp<SurfaceControl> mBGSurfaceControl;
4115 sp<SurfaceControl> mFGSurfaceControl;
4116
4117 // This surface is used to ensure that the buffers posted to
4118 // mFGSurfaceControl have been picked up by SurfaceFlinger.
4119 sp<SurfaceControl> mSyncSurfaceControl;
4120};
4121
Robert Carr7f619b22017-11-06 12:56:35 -08004122TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
Robert Carr7f619b22017-11-06 12:56:35 -08004123
chaviw0e3479f2018-09-10 16:49:30 -07004124 std::unique_ptr<ScreenCapture> sc;
4125
4126 sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
Robert Carr7f619b22017-11-06 12:56:35 -08004127 fillSurfaceRGBA8(relative, 10, 10, 10);
4128 waitForPostedBuffers();
4129
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004130 Transaction{}
4131 .setRelativeLayer(relative, mFGSurfaceControl->getHandle(), 1)
Robert Carr7f619b22017-11-06 12:56:35 -08004132 .setPosition(relative, 64, 64)
4133 .apply();
4134
4135 {
4136 // The relative should be on top of the FG control.
4137 ScreenCapture::captureScreen(&sc);
4138 sc->checkPixel(64, 64, 10, 10, 10);
4139 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004140 Transaction{}.detachChildren(mFGSurfaceControl).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004141
4142 {
4143 // Nothing should change at this point.
4144 ScreenCapture::captureScreen(&sc);
4145 sc->checkPixel(64, 64, 10, 10, 10);
4146 }
4147
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004148 Transaction{}.hide(relative).apply();
Robert Carr7f619b22017-11-06 12:56:35 -08004149
4150 {
4151 // Ensure that the relative was actually hidden, rather than
4152 // being left in the detached but visible state.
4153 ScreenCapture::captureScreen(&sc);
4154 sc->expectFGColor(64, 64);
4155 }
4156}
4157
Robert Carr8d5227b2017-03-16 15:41:03 -07004158class GeometryLatchingTest : public LayerUpdateTest {
4159protected:
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004160 void EXPECT_INITIAL_STATE(const char* trace) {
Robert Carr8d5227b2017-03-16 15:41:03 -07004161 SCOPED_TRACE(trace);
4162 ScreenCapture::captureScreen(&sc);
4163 // We find the leading edge of the FG surface.
4164 sc->expectFGColor(127, 127);
4165 sc->expectBGColor(128, 128);
4166 }
Robert Carr7bf247e2017-05-18 14:02:49 -07004167
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004168 void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
Robert Carr7bf247e2017-05-18 14:02:49 -07004169
4170 void unlockFGBuffer() {
4171 sp<Surface> s = mFGSurfaceControl->getSurface();
4172 ASSERT_EQ(NO_ERROR, s->unlockAndPost());
4173 waitForPostedBuffers();
4174 }
4175
Robert Carr8d5227b2017-03-16 15:41:03 -07004176 void completeFGResize() {
4177 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4178 waitForPostedBuffers();
4179 }
4180 void restoreInitialState() {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004181 asTransaction([&](Transaction& t) {
4182 t.setSize(mFGSurfaceControl, 64, 64);
4183 t.setPosition(mFGSurfaceControl, 64, 64);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004184 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 64, 64));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004185 });
Robert Carr8d5227b2017-03-16 15:41:03 -07004186
4187 EXPECT_INITIAL_STATE("After restoring initial state");
4188 }
chaviw0e3479f2018-09-10 16:49:30 -07004189 std::unique_ptr<ScreenCapture> sc;
Robert Carr8d5227b2017-03-16 15:41:03 -07004190};
4191
Robert Carr8d5227b2017-03-16 15:41:03 -07004192class CropLatchingTest : public GeometryLatchingTest {
4193protected:
4194 void EXPECT_CROPPED_STATE(const char* trace) {
4195 SCOPED_TRACE(trace);
4196 ScreenCapture::captureScreen(&sc);
4197 // The edge should be moved back one pixel by our crop.
4198 sc->expectFGColor(126, 126);
4199 sc->expectBGColor(127, 127);
4200 sc->expectBGColor(128, 128);
4201 }
chaviw59f5c562017-06-28 16:39:06 -07004202
4203 void EXPECT_RESIZE_STATE(const char* trace) {
4204 SCOPED_TRACE(trace);
4205 ScreenCapture::captureScreen(&sc);
4206 // The FG is now resized too 128,128 at 64,64
4207 sc->expectFGColor(64, 64);
4208 sc->expectFGColor(191, 191);
4209 sc->expectBGColor(192, 192);
4210 }
Robert Carr8d5227b2017-03-16 15:41:03 -07004211};
4212
Pablo Ceballos05289c22016-04-14 15:49:55 -07004213TEST_F(LayerUpdateTest, DeferredTransactionTest) {
chaviw0e3479f2018-09-10 16:49:30 -07004214 std::unique_ptr<ScreenCapture> sc;
Pablo Ceballos05289c22016-04-14 15:49:55 -07004215 {
4216 SCOPED_TRACE("before anything");
4217 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004218 sc->expectBGColor(32, 32);
4219 sc->expectFGColor(96, 96);
4220 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004221 }
4222
4223 // set up two deferred transactions on different frames
Robert Carr4cdc58f2017-08-23 14:22:20 -07004224 asTransaction([&](Transaction& t) {
4225 t.setAlpha(mFGSurfaceControl, 0.75);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004226 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4227 mSyncSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004228 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004229
Robert Carr4cdc58f2017-08-23 14:22:20 -07004230 asTransaction([&](Transaction& t) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004231 t.setPosition(mFGSurfaceControl, 128, 128);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004232 t.deferTransactionUntil_legacy(mFGSurfaceControl, mSyncSurfaceControl->getHandle(),
4233 mSyncSurfaceControl->getSurface()->getNextFrameNumber() + 1);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004234 });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004235
4236 {
4237 SCOPED_TRACE("before any trigger");
4238 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004239 sc->expectBGColor(32, 32);
4240 sc->expectFGColor(96, 96);
4241 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004242 }
4243
4244 // should trigger the first deferred transaction, but not the second one
4245 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4246 {
4247 SCOPED_TRACE("after first trigger");
4248 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004249 sc->expectBGColor(32, 32);
4250 sc->checkPixel(96, 96, 162, 63, 96);
4251 sc->expectBGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004252 }
4253
4254 // should show up immediately since it's not deferred
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004255 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
Pablo Ceballos05289c22016-04-14 15:49:55 -07004256
4257 // trigger the second deferred transaction
4258 fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
4259 {
4260 SCOPED_TRACE("after second trigger");
4261 ScreenCapture::captureScreen(&sc);
Robert Carr2b91c822017-02-21 19:41:24 -08004262 sc->expectBGColor(32, 32);
4263 sc->expectBGColor(96, 96);
4264 sc->expectFGColor(160, 160);
Pablo Ceballos05289c22016-04-14 15:49:55 -07004265 }
4266}
4267
Robert Carre392b552017-09-19 12:16:05 -07004268TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
chaviw0e3479f2018-09-10 16:49:30 -07004269 std::unique_ptr<ScreenCapture> sc;
Robert Carre392b552017-09-19 12:16:05 -07004270
4271 sp<SurfaceControl> childNoBuffer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004272 createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */,
4273 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4274 sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20,
4275 PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get());
Robert Carre392b552017-09-19 12:16:05 -07004276 fillSurfaceRGBA8(childBuffer, 200, 200, 200);
Vishnu Nair60356342018-11-13 13:00:45 -08004277 SurfaceComposerClient::Transaction{}
4278 .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
4279 .show(childNoBuffer)
4280 .show(childBuffer)
4281 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004282 {
4283 ScreenCapture::captureScreen(&sc);
4284 sc->expectChildColor(73, 73);
4285 sc->expectFGColor(74, 74);
4286 }
Vishnu Nair60356342018-11-13 13:00:45 -08004287 SurfaceComposerClient::Transaction{}
4288 .setCrop_legacy(childNoBuffer, Rect(0, 0, 20, 20))
4289 .apply(true);
Robert Carre392b552017-09-19 12:16:05 -07004290 {
4291 ScreenCapture::captureScreen(&sc);
4292 sc->expectChildColor(73, 73);
4293 sc->expectChildColor(74, 74);
4294 }
4295}
4296
Robert Carr2c5f6d22017-09-26 12:30:35 -07004297TEST_F(LayerUpdateTest, MergingTransactions) {
chaviw0e3479f2018-09-10 16:49:30 -07004298 std::unique_ptr<ScreenCapture> sc;
Robert Carr2c5f6d22017-09-26 12:30:35 -07004299 {
4300 SCOPED_TRACE("before move");
4301 ScreenCapture::captureScreen(&sc);
4302 sc->expectBGColor(0, 12);
4303 sc->expectFGColor(75, 75);
4304 sc->expectBGColor(145, 145);
4305 }
4306
4307 Transaction t1, t2;
4308 t1.setPosition(mFGSurfaceControl, 128, 128);
4309 t2.setPosition(mFGSurfaceControl, 0, 0);
4310 // We expect that the position update from t2 now
4311 // overwrites the position update from t1.
4312 t1.merge(std::move(t2));
4313 t1.apply();
4314
4315 {
4316 ScreenCapture::captureScreen(&sc);
4317 sc->expectFGColor(1, 1);
4318 }
4319}
4320
Robert Carr1f0a16a2016-10-24 16:27:39 -07004321class ChildLayerTest : public LayerUpdateTest {
4322protected:
4323 void SetUp() override {
4324 LayerUpdateTest::SetUp();
Vishnu Nairc652ff82019-03-15 12:48:54 -07004325 mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
Vishnu Nair88a11f22018-11-28 18:30:57 -08004326 mFGSurfaceControl.get());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004327 fillSurfaceRGBA8(mChild, 200, 200, 200);
4328
4329 {
4330 SCOPED_TRACE("before anything");
chaviw0e3479f2018-09-10 16:49:30 -07004331 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004332 mCapture->expectChildColor(64, 64);
4333 }
4334 }
4335 void TearDown() override {
4336 LayerUpdateTest::TearDown();
4337 mChild = 0;
4338 }
4339
4340 sp<SurfaceControl> mChild;
chaviw0e3479f2018-09-10 16:49:30 -07004341 std::unique_ptr<ScreenCapture> mCapture;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004342};
4343
4344TEST_F(ChildLayerTest, ChildLayerPositioning) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004345 asTransaction([&](Transaction& t) {
4346 t.show(mChild);
4347 t.setPosition(mChild, 10, 10);
4348 t.setPosition(mFGSurfaceControl, 64, 64);
4349 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004350
4351 {
chaviw0e3479f2018-09-10 16:49:30 -07004352 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004353 // Top left of foreground must now be visible
4354 mCapture->expectFGColor(64, 64);
4355 // But 10 pixels in we should see the child surface
4356 mCapture->expectChildColor(74, 74);
4357 // And 10 more pixels we should be back to the foreground surface
4358 mCapture->expectFGColor(84, 84);
4359 }
4360
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004361 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004362
4363 {
chaviw0e3479f2018-09-10 16:49:30 -07004364 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004365 // Top left of foreground should now be at 0, 0
4366 mCapture->expectFGColor(0, 0);
4367 // But 10 pixels in we should see the child surface
4368 mCapture->expectChildColor(10, 10);
4369 // And 10 more pixels we should be back to the foreground surface
4370 mCapture->expectFGColor(20, 20);
4371 }
4372}
4373
Robert Carr41b08b52017-06-01 16:11:34 -07004374TEST_F(ChildLayerTest, ChildLayerCropping) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004375 asTransaction([&](Transaction& t) {
4376 t.show(mChild);
4377 t.setPosition(mChild, 0, 0);
4378 t.setPosition(mFGSurfaceControl, 0, 0);
Marissa Wallf58c14b2018-07-24 10:50:43 -07004379 t.setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 5, 5));
Robert Carr4cdc58f2017-08-23 14:22:20 -07004380 });
Robert Carr41b08b52017-06-01 16:11:34 -07004381
4382 {
chaviw0e3479f2018-09-10 16:49:30 -07004383 mCapture = screenshot();
Robert Carr41b08b52017-06-01 16:11:34 -07004384 mCapture->expectChildColor(0, 0);
4385 mCapture->expectChildColor(4, 4);
4386 mCapture->expectBGColor(5, 5);
4387 }
4388}
4389
Robert Carr1f0a16a2016-10-24 16:27:39 -07004390TEST_F(ChildLayerTest, ChildLayerConstraints) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004391 asTransaction([&](Transaction& t) {
4392 t.show(mChild);
4393 t.setPosition(mFGSurfaceControl, 0, 0);
4394 t.setPosition(mChild, 63, 63);
4395 });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004396
4397 {
chaviw0e3479f2018-09-10 16:49:30 -07004398 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004399 mCapture->expectFGColor(0, 0);
4400 // Last pixel in foreground should now be the child.
4401 mCapture->expectChildColor(63, 63);
4402 // But the child should be constrained and the next pixel
4403 // must be the background
4404 mCapture->expectBGColor(64, 64);
4405 }
4406}
4407
4408TEST_F(ChildLayerTest, ChildLayerScaling) {
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004409 asTransaction([&](Transaction& t) { t.setPosition(mFGSurfaceControl, 0, 0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004410
4411 // Find the boundary between the parent and child
4412 {
chaviw0e3479f2018-09-10 16:49:30 -07004413 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004414 mCapture->expectChildColor(9, 9);
4415 mCapture->expectFGColor(10, 10);
4416 }
4417
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004418 asTransaction([&](Transaction& t) { t.setMatrix(mFGSurfaceControl, 2.0, 0, 0, 2.0); });
Robert Carr1f0a16a2016-10-24 16:27:39 -07004419
4420 // The boundary should be twice as far from the origin now.
4421 // The pixels from the last test should all be child now
4422 {
chaviw0e3479f2018-09-10 16:49:30 -07004423 mCapture = screenshot();
Robert Carr1f0a16a2016-10-24 16:27:39 -07004424 mCapture->expectChildColor(9, 9);
4425 mCapture->expectChildColor(10, 10);
4426 mCapture->expectChildColor(19, 19);
4427 mCapture->expectFGColor(20, 20);
4428 }
4429}
Robert Carr9524cb32017-02-13 11:32:32 -08004430
Vishnu Nairc652ff82019-03-15 12:48:54 -07004431// A child with a scale transform should be cropped by its parent bounds.
4432TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
4433 asTransaction([&](Transaction& t) {
4434 t.setPosition(mFGSurfaceControl, 0, 0);
4435 t.setPosition(mChild, 0, 0);
4436 });
4437
4438 // Find the boundary between the parent and child.
4439 {
4440 mCapture = screenshot();
4441 mCapture->expectChildColor(0, 0);
4442 mCapture->expectChildColor(9, 9);
4443 mCapture->expectFGColor(10, 10);
4444 }
4445
4446 asTransaction([&](Transaction& t) { t.setMatrix(mChild, 10.0, 0, 0, 10.0); });
4447
4448 // The child should fill its parent bounds and be cropped by it.
4449 {
4450 mCapture = screenshot();
4451 mCapture->expectChildColor(0, 0);
4452 mCapture->expectChildColor(63, 63);
4453 mCapture->expectBGColor(64, 64);
4454 }
4455}
4456
Robert Carr6452f122017-03-21 10:41:29 -07004457TEST_F(ChildLayerTest, ChildLayerAlpha) {
4458 fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
4459 fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
4460 fillSurfaceRGBA8(mChild, 0, 254, 0);
4461 waitForPostedBuffers();
4462
Robert Carr4cdc58f2017-08-23 14:22:20 -07004463 asTransaction([&](Transaction& t) {
4464 t.show(mChild);
4465 t.setPosition(mChild, 0, 0);
4466 t.setPosition(mFGSurfaceControl, 0, 0);
4467 });
Robert Carr6452f122017-03-21 10:41:29 -07004468
4469 {
chaviw0e3479f2018-09-10 16:49:30 -07004470 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004471 // Unblended child color
4472 mCapture->checkPixel(0, 0, 0, 254, 0);
4473 }
4474
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004475 asTransaction([&](Transaction& t) { t.setAlpha(mChild, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004476
4477 {
chaviw0e3479f2018-09-10 16:49:30 -07004478 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004479 // Child and BG blended.
4480 mCapture->checkPixel(0, 0, 127, 127, 0);
4481 }
4482
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004483 asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 0.5); });
Robert Carr6452f122017-03-21 10:41:29 -07004484
4485 {
chaviw0e3479f2018-09-10 16:49:30 -07004486 mCapture = screenshot();
Robert Carr6452f122017-03-21 10:41:29 -07004487 // Child and BG blended.
4488 mCapture->checkPixel(0, 0, 95, 64, 95);
4489 }
4490}
4491
Robert Carr9524cb32017-02-13 11:32:32 -08004492TEST_F(ChildLayerTest, ReparentChildren) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004493 asTransaction([&](Transaction& t) {
4494 t.show(mChild);
4495 t.setPosition(mChild, 10, 10);
4496 t.setPosition(mFGSurfaceControl, 64, 64);
4497 });
Robert Carr9524cb32017-02-13 11:32:32 -08004498
4499 {
chaviw0e3479f2018-09-10 16:49:30 -07004500 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004501 // Top left of foreground must now be visible
4502 mCapture->expectFGColor(64, 64);
4503 // But 10 pixels in we should see the child surface
4504 mCapture->expectChildColor(74, 74);
4505 // And 10 more pixels we should be back to the foreground surface
4506 mCapture->expectFGColor(84, 84);
4507 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004508
4509 asTransaction([&](Transaction& t) {
4510 t.reparentChildren(mFGSurfaceControl, mBGSurfaceControl->getHandle());
4511 });
4512
Robert Carr9524cb32017-02-13 11:32:32 -08004513 {
chaviw0e3479f2018-09-10 16:49:30 -07004514 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004515 mCapture->expectFGColor(64, 64);
4516 // In reparenting we should have exposed the entire foreground surface.
4517 mCapture->expectFGColor(74, 74);
4518 // And the child layer should now begin at 10, 10 (since the BG
4519 // layer is at (0, 0)).
4520 mCapture->expectBGColor(9, 9);
4521 mCapture->expectChildColor(10, 10);
4522 }
4523}
4524
Robert Carr2e102c92018-10-23 12:11:15 -07004525TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
4526 sp<SurfaceControl> mGrandChild =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004527 createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
Robert Carr2e102c92018-10-23 12:11:15 -07004528 fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
4529
4530 {
4531 SCOPED_TRACE("Grandchild visible");
4532 ScreenCapture::captureScreen(&mCapture);
4533 mCapture->checkPixel(64, 64, 111, 111, 111);
4534 }
4535
Robert Carr87246532019-02-04 15:20:26 -08004536 mChild.clear();
Robert Carr2e102c92018-10-23 12:11:15 -07004537
4538 {
4539 SCOPED_TRACE("After destroying child");
4540 ScreenCapture::captureScreen(&mCapture);
4541 mCapture->expectFGColor(64, 64);
4542 }
4543
4544 asTransaction([&](Transaction& t) {
4545 t.reparent(mGrandChild, mFGSurfaceControl->getHandle());
4546 });
4547
4548 {
4549 SCOPED_TRACE("After reparenting grandchild");
4550 ScreenCapture::captureScreen(&mCapture);
4551 mCapture->checkPixel(64, 64, 111, 111, 111);
4552 }
4553}
4554
chaviw161410b02017-07-27 10:46:08 -07004555TEST_F(ChildLayerTest, DetachChildrenSameClient) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004556 asTransaction([&](Transaction& t) {
4557 t.show(mChild);
4558 t.setPosition(mChild, 10, 10);
4559 t.setPosition(mFGSurfaceControl, 64, 64);
4560 });
Robert Carr9524cb32017-02-13 11:32:32 -08004561
4562 {
chaviw0e3479f2018-09-10 16:49:30 -07004563 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004564 // Top left of foreground must now be visible
4565 mCapture->expectFGColor(64, 64);
4566 // But 10 pixels in we should see the child surface
4567 mCapture->expectChildColor(74, 74);
4568 // And 10 more pixels we should be back to the foreground surface
4569 mCapture->expectFGColor(84, 84);
4570 }
4571
chaviw0e3479f2018-09-10 16:49:30 -07004572
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004573 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
Robert Carr9524cb32017-02-13 11:32:32 -08004574
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004575 asTransaction([&](Transaction& t) { t.hide(mChild); });
Robert Carr9524cb32017-02-13 11:32:32 -08004576
chaviw161410b02017-07-27 10:46:08 -07004577 // Since the child has the same client as the parent, it will not get
4578 // detached and will be hidden.
4579 {
chaviw0e3479f2018-09-10 16:49:30 -07004580 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004581 mCapture->expectFGColor(64, 64);
4582 mCapture->expectFGColor(74, 74);
4583 mCapture->expectFGColor(84, 84);
4584 }
4585}
4586
4587TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
4588 sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient;
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004589 sp<SurfaceControl> mChildNewClient =
Vishnu Nair88a11f22018-11-28 18:30:57 -08004590 createSurface(mNewComposerClient, "New Child Test Surface", 10, 10,
4591 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw161410b02017-07-27 10:46:08 -07004592
chaviw161410b02017-07-27 10:46:08 -07004593 ASSERT_TRUE(mChildNewClient->isValid());
4594
4595 fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
4596
Robert Carr4cdc58f2017-08-23 14:22:20 -07004597 asTransaction([&](Transaction& t) {
4598 t.hide(mChild);
4599 t.show(mChildNewClient);
4600 t.setPosition(mChildNewClient, 10, 10);
4601 t.setPosition(mFGSurfaceControl, 64, 64);
4602 });
chaviw161410b02017-07-27 10:46:08 -07004603
4604 {
chaviw0e3479f2018-09-10 16:49:30 -07004605 mCapture = screenshot();
chaviw161410b02017-07-27 10:46:08 -07004606 // Top left of foreground must now be visible
4607 mCapture->expectFGColor(64, 64);
4608 // But 10 pixels in we should see the child surface
4609 mCapture->expectChildColor(74, 74);
4610 // And 10 more pixels we should be back to the foreground surface
4611 mCapture->expectFGColor(84, 84);
4612 }
4613
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004614 asTransaction([&](Transaction& t) { t.detachChildren(mFGSurfaceControl); });
chaviw161410b02017-07-27 10:46:08 -07004615
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004616 asTransaction([&](Transaction& t) { t.hide(mChildNewClient); });
chaviw161410b02017-07-27 10:46:08 -07004617
Robert Carr9524cb32017-02-13 11:32:32 -08004618 // Nothing should have changed.
4619 {
chaviw0e3479f2018-09-10 16:49:30 -07004620 mCapture = screenshot();
Robert Carr9524cb32017-02-13 11:32:32 -08004621 mCapture->expectFGColor(64, 64);
4622 mCapture->expectChildColor(74, 74);
4623 mCapture->expectFGColor(84, 84);
4624 }
4625}
4626
chaviw5aedec92018-10-22 10:40:38 -07004627TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
4628 sp<SurfaceComposerClient> newComposerClient = new SurfaceComposerClient;
4629 sp<SurfaceControl> childNewClient =
4630 newComposerClient->createSurface(String8("New Child Test Surface"), 10, 10,
4631 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
4632
4633 ASSERT_TRUE(childNewClient != nullptr);
4634 ASSERT_TRUE(childNewClient->isValid());
4635
4636 fillSurfaceRGBA8(childNewClient, 200, 200, 200);
4637
4638 Transaction()
4639 .hide(mChild)
4640 .show(childNewClient)
4641 .setPosition(childNewClient, 10, 10)
4642 .setPosition(mFGSurfaceControl, 64, 64)
4643 .apply();
4644
4645 {
4646 mCapture = screenshot();
4647 // Top left of foreground must now be visible
4648 mCapture->expectFGColor(64, 64);
4649 // But 10 pixels in we should see the child surface
4650 mCapture->expectChildColor(74, 74);
4651 // And 10 more pixels we should be back to the foreground surface
4652 mCapture->expectFGColor(84, 84);
4653 }
4654
4655 Transaction().detachChildren(mFGSurfaceControl).apply();
4656 Transaction().hide(childNewClient).apply();
4657
4658 // Nothing should have changed.
4659 {
4660 mCapture = screenshot();
4661 mCapture->expectFGColor(64, 64);
4662 mCapture->expectChildColor(74, 74);
4663 mCapture->expectFGColor(84, 84);
4664 }
4665
4666 sp<SurfaceControl> newParentSurface = createLayer(String8("New Parent Surface"), 32, 32, 0);
4667 fillLayerColor(ISurfaceComposerClient::eFXSurfaceBufferQueue, newParentSurface, Color::RED, 32,
4668 32);
4669 Transaction()
4670 .setLayer(newParentSurface, INT32_MAX - 1)
4671 .show(newParentSurface)
4672 .setPosition(newParentSurface, 20, 20)
4673 .reparent(childNewClient, newParentSurface->getHandle())
4674 .apply();
4675 {
4676 mCapture = screenshot();
4677 // Child is now hidden.
4678 mCapture->expectColor(Rect(20, 20, 52, 52), Color::RED);
4679 }
4680}
4681
Robert Carr9b429f42017-04-17 14:56:57 -07004682TEST_F(ChildLayerTest, ChildrenInheritNonTransformScalingFromParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004683 asTransaction([&](Transaction& t) {
4684 t.show(mChild);
4685 t.setPosition(mChild, 0, 0);
4686 t.setPosition(mFGSurfaceControl, 0, 0);
4687 });
Robert Carr9b429f42017-04-17 14:56:57 -07004688
4689 {
chaviw0e3479f2018-09-10 16:49:30 -07004690 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004691 // We've positioned the child in the top left.
4692 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004693 // But it's only 10x15.
4694 mCapture->expectFGColor(10, 15);
Robert Carr9b429f42017-04-17 14:56:57 -07004695 }
4696
Robert Carr4cdc58f2017-08-23 14:22:20 -07004697 asTransaction([&](Transaction& t) {
4698 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4699 // We cause scaling by 2.
4700 t.setSize(mFGSurfaceControl, 128, 128);
4701 });
Robert Carr9b429f42017-04-17 14:56:57 -07004702
4703 {
chaviw0e3479f2018-09-10 16:49:30 -07004704 mCapture = screenshot();
Robert Carr9b429f42017-04-17 14:56:57 -07004705 // We've positioned the child in the top left.
4706 mCapture->expectChildColor(0, 0);
4707 mCapture->expectChildColor(10, 10);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004708 mCapture->expectChildColor(19, 29);
4709 // And now it should be scaled all the way to 20x30
4710 mCapture->expectFGColor(20, 30);
Robert Carr9b429f42017-04-17 14:56:57 -07004711 }
4712}
4713
Robert Carr1725eee2017-04-26 18:32:15 -07004714// Regression test for b/37673612
4715TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004716 asTransaction([&](Transaction& t) {
4717 t.show(mChild);
4718 t.setPosition(mChild, 0, 0);
4719 t.setPosition(mFGSurfaceControl, 0, 0);
4720 });
Robert Carr1725eee2017-04-26 18:32:15 -07004721
4722 {
chaviw0e3479f2018-09-10 16:49:30 -07004723 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004724 // We've positioned the child in the top left.
4725 mCapture->expectChildColor(0, 0);
Vishnu Nairc652ff82019-03-15 12:48:54 -07004726 mCapture->expectChildColor(9, 14);
4727 // But it's only 10x15.
4728 mCapture->expectFGColor(10, 15);
Robert Carr1725eee2017-04-26 18:32:15 -07004729 }
Robert Carr1725eee2017-04-26 18:32:15 -07004730 // We set things up as in b/37673612 so that there is a mismatch between the buffer size and
4731 // the WM specified state size.
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004732 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
Robert Carr1725eee2017-04-26 18:32:15 -07004733 sp<Surface> s = mFGSurfaceControl->getSurface();
4734 auto anw = static_cast<ANativeWindow*>(s.get());
4735 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4736 native_window_set_buffers_dimensions(anw, 64, 128);
4737 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4738 waitForPostedBuffers();
4739
4740 {
4741 // The child should still be in the same place and not have any strange scaling as in
4742 // b/37673612.
chaviw0e3479f2018-09-10 16:49:30 -07004743 mCapture = screenshot();
Robert Carr1725eee2017-04-26 18:32:15 -07004744 mCapture->expectChildColor(0, 0);
4745 mCapture->expectFGColor(10, 10);
4746 }
4747}
4748
Vishnu Nairc652ff82019-03-15 12:48:54 -07004749// A child with a buffer transform from its parents should be cropped by its parent bounds.
4750TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
4751 asTransaction([&](Transaction& t) {
4752 t.show(mChild);
4753 t.setPosition(mChild, 0, 0);
4754 t.setPosition(mFGSurfaceControl, 0, 0);
4755 t.setSize(mChild, 100, 100);
4756 });
4757 fillSurfaceRGBA8(mChild, 200, 200, 200);
4758
4759 {
4760 mCapture = screenshot();
4761
4762 mCapture->expectChildColor(0, 0);
4763 mCapture->expectChildColor(63, 63);
4764 mCapture->expectBGColor(64, 64);
4765 }
4766
4767 asTransaction([&](Transaction& t) { t.setSize(mFGSurfaceControl, 128, 64); });
4768 sp<Surface> s = mFGSurfaceControl->getSurface();
4769 auto anw = static_cast<ANativeWindow*>(s.get());
4770 // Apply a 90 transform on the buffer.
4771 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4772 native_window_set_buffers_dimensions(anw, 64, 128);
4773 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4774 waitForPostedBuffers();
4775
4776 // The child should be cropped by the new parent bounds.
4777 {
4778 mCapture = screenshot();
4779 mCapture->expectChildColor(0, 0);
4780 mCapture->expectChildColor(99, 63);
4781 mCapture->expectFGColor(100, 63);
4782 mCapture->expectBGColor(128, 64);
4783 }
4784}
4785
4786// A child with a scale transform from its parents should be cropped by its parent bounds.
4787TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
4788 asTransaction([&](Transaction& t) {
4789 t.show(mChild);
4790 t.setPosition(mChild, 0, 0);
4791 t.setPosition(mFGSurfaceControl, 0, 0);
4792 t.setSize(mChild, 200, 200);
4793 });
4794 fillSurfaceRGBA8(mChild, 200, 200, 200);
4795
4796 {
4797 mCapture = screenshot();
4798
4799 mCapture->expectChildColor(0, 0);
4800 mCapture->expectChildColor(63, 63);
4801 mCapture->expectBGColor(64, 64);
4802 }
4803
4804 asTransaction([&](Transaction& t) {
4805 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4806 // Set a scaling by 2.
4807 t.setSize(mFGSurfaceControl, 128, 128);
4808 });
4809
4810 // Child should inherit its parents scale but should be cropped by its parent bounds.
4811 {
4812 mCapture = screenshot();
4813 mCapture->expectChildColor(0, 0);
4814 mCapture->expectChildColor(127, 127);
4815 mCapture->expectBGColor(128, 128);
4816 }
4817}
4818
4819// Regression test for b/127368943
4820// Child should ignore the buffer transform but apply parent scale transform.
4821TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
4822 asTransaction([&](Transaction& t) {
4823 t.show(mChild);
4824 t.setPosition(mChild, 0, 0);
4825 t.setPosition(mFGSurfaceControl, 0, 0);
4826 });
4827
4828 {
4829 mCapture = screenshot();
4830 mCapture->expectChildColor(0, 0);
4831 mCapture->expectChildColor(9, 14);
4832 mCapture->expectFGColor(10, 15);
4833 }
4834
4835 // Change the size of the foreground to 128 * 64 so we can test rotation as well.
4836 asTransaction([&](Transaction& t) {
4837 t.setOverrideScalingMode(mFGSurfaceControl, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4838 t.setSize(mFGSurfaceControl, 128, 64);
4839 });
4840 sp<Surface> s = mFGSurfaceControl->getSurface();
4841 auto anw = static_cast<ANativeWindow*>(s.get());
4842 // Apply a 90 transform on the buffer and submit a buffer half the expected size so that we
4843 // have an effective scale of 2.0 applied to the buffer along with a rotation transform.
4844 native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
4845 native_window_set_buffers_dimensions(anw, 32, 64);
4846 fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
4847 waitForPostedBuffers();
4848
4849 // The child should ignore the buffer transform but apply the 2.0 scale from parent.
4850 {
4851 mCapture = screenshot();
4852 mCapture->expectChildColor(0, 0);
4853 mCapture->expectChildColor(19, 29);
4854 mCapture->expectFGColor(20, 30);
4855 }
4856}
4857
Dan Stoza412903f2017-04-27 13:42:17 -07004858TEST_F(ChildLayerTest, Bug36858924) {
4859 // Destroy the child layer
4860 mChild.clear();
4861
4862 // Now recreate it as hidden
Vishnu Nair88a11f22018-11-28 18:30:57 -08004863 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888,
4864 ISurfaceComposerClient::eHidden, mFGSurfaceControl.get());
Dan Stoza412903f2017-04-27 13:42:17 -07004865
4866 // Show the child layer in a deferred transaction
Robert Carr4cdc58f2017-08-23 14:22:20 -07004867 asTransaction([&](Transaction& t) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07004868 t.deferTransactionUntil_legacy(mChild, mFGSurfaceControl->getHandle(),
4869 mFGSurfaceControl->getSurface()->getNextFrameNumber());
Robert Carr4cdc58f2017-08-23 14:22:20 -07004870 t.show(mChild);
4871 });
Dan Stoza412903f2017-04-27 13:42:17 -07004872
4873 // Render the foreground surface a few times
4874 //
4875 // Prior to the bugfix for b/36858924, this would usually hang while trying to fill the third
4876 // frame because SurfaceFlinger would never process the deferred transaction and would therefore
4877 // never acquire/release the first buffer
4878 ALOGI("Filling 1");
4879 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4880 ALOGI("Filling 2");
4881 fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
4882 ALOGI("Filling 3");
4883 fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
4884 ALOGI("Filling 4");
4885 fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
4886}
4887
chaviwf1961f72017-09-18 16:41:07 -07004888TEST_F(ChildLayerTest, Reparent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004889 asTransaction([&](Transaction& t) {
4890 t.show(mChild);
4891 t.setPosition(mChild, 10, 10);
4892 t.setPosition(mFGSurfaceControl, 64, 64);
4893 });
chaviw06178942017-07-27 10:25:59 -07004894
4895 {
chaviw0e3479f2018-09-10 16:49:30 -07004896 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004897 // Top left of foreground must now be visible
4898 mCapture->expectFGColor(64, 64);
4899 // But 10 pixels in we should see the child surface
4900 mCapture->expectChildColor(74, 74);
4901 // And 10 more pixels we should be back to the foreground surface
4902 mCapture->expectFGColor(84, 84);
4903 }
Robert Carr4cdc58f2017-08-23 14:22:20 -07004904
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004905 asTransaction([&](Transaction& t) { t.reparent(mChild, mBGSurfaceControl->getHandle()); });
Robert Carr4cdc58f2017-08-23 14:22:20 -07004906
chaviw06178942017-07-27 10:25:59 -07004907 {
chaviw0e3479f2018-09-10 16:49:30 -07004908 mCapture = screenshot();
chaviw06178942017-07-27 10:25:59 -07004909 mCapture->expectFGColor(64, 64);
4910 // In reparenting we should have exposed the entire foreground surface.
4911 mCapture->expectFGColor(74, 74);
4912 // And the child layer should now begin at 10, 10 (since the BG
4913 // layer is at (0, 0)).
4914 mCapture->expectBGColor(9, 9);
4915 mCapture->expectChildColor(10, 10);
4916 }
4917}
4918
chaviwf1961f72017-09-18 16:41:07 -07004919TEST_F(ChildLayerTest, ReparentToNoParent) {
Robert Carr4cdc58f2017-08-23 14:22:20 -07004920 asTransaction([&](Transaction& t) {
4921 t.show(mChild);
4922 t.setPosition(mChild, 10, 10);
4923 t.setPosition(mFGSurfaceControl, 64, 64);
4924 });
chaviwf1961f72017-09-18 16:41:07 -07004925
4926 {
chaviw0e3479f2018-09-10 16:49:30 -07004927 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004928 // Top left of foreground must now be visible
4929 mCapture->expectFGColor(64, 64);
4930 // But 10 pixels in we should see the child surface
4931 mCapture->expectChildColor(74, 74);
4932 // And 10 more pixels we should be back to the foreground surface
4933 mCapture->expectFGColor(84, 84);
4934 }
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004935 asTransaction([&](Transaction& t) { t.reparent(mChild, nullptr); });
chaviwf1961f72017-09-18 16:41:07 -07004936 {
chaviw0e3479f2018-09-10 16:49:30 -07004937 mCapture = screenshot();
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004938 // The surface should now be offscreen.
chaviwf1961f72017-09-18 16:41:07 -07004939 mCapture->expectFGColor(64, 64);
Robert Carr6fb1a7e2018-12-11 12:07:25 -08004940 mCapture->expectFGColor(74, 74);
chaviwf1961f72017-09-18 16:41:07 -07004941 mCapture->expectFGColor(84, 84);
4942 }
4943}
4944
4945TEST_F(ChildLayerTest, ReparentFromNoParent) {
chaviw0e3479f2018-09-10 16:49:30 -07004946 sp<SurfaceControl> newSurface = createLayer(String8("New Surface"), 10, 10, 0);
Peiyong Lin566a3b42018-01-09 18:22:43 -08004947 ASSERT_TRUE(newSurface != nullptr);
chaviwf1961f72017-09-18 16:41:07 -07004948 ASSERT_TRUE(newSurface->isValid());
4949
4950 fillSurfaceRGBA8(newSurface, 63, 195, 63);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004951 asTransaction([&](Transaction& t) {
4952 t.hide(mChild);
4953 t.show(newSurface);
4954 t.setPosition(newSurface, 10, 10);
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004955 t.setLayer(newSurface, INT32_MAX - 2);
Robert Carr4cdc58f2017-08-23 14:22:20 -07004956 t.setPosition(mFGSurfaceControl, 64, 64);
4957 });
chaviwf1961f72017-09-18 16:41:07 -07004958
4959 {
chaviw0e3479f2018-09-10 16:49:30 -07004960 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004961 // Top left of foreground must now be visible
4962 mCapture->expectFGColor(64, 64);
4963 // At 10, 10 we should see the new surface
4964 mCapture->checkPixel(10, 10, 63, 195, 63);
4965 }
4966
Chia-I Wu1078bbb2017-10-20 11:29:02 -07004967 asTransaction([&](Transaction& t) { t.reparent(newSurface, mFGSurfaceControl->getHandle()); });
chaviwf1961f72017-09-18 16:41:07 -07004968
4969 {
chaviw0e3479f2018-09-10 16:49:30 -07004970 mCapture = screenshot();
chaviwf1961f72017-09-18 16:41:07 -07004971 // newSurface will now be a child of mFGSurface so it will be 10, 10 offset from
4972 // mFGSurface, putting it at 74, 74.
4973 mCapture->expectFGColor(64, 64);
4974 mCapture->checkPixel(74, 74, 63, 195, 63);
4975 mCapture->expectFGColor(84, 84);
4976 }
4977}
4978
chaviwc9674332017-08-28 12:32:18 -07004979TEST_F(ChildLayerTest, NestedChildren) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08004980 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
4981 PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
chaviwc9674332017-08-28 12:32:18 -07004982 fillSurfaceRGBA8(grandchild, 50, 50, 50);
4983
4984 {
chaviw0e3479f2018-09-10 16:49:30 -07004985 mCapture = screenshot();
chaviwc9674332017-08-28 12:32:18 -07004986 // Expect the grandchild to begin at 64, 64 because it's a child of mChild layer
4987 // which begins at 64, 64
4988 mCapture->checkPixel(64, 64, 50, 50, 50);
4989 }
4990}
4991
Robert Carr503c7042017-09-27 15:06:08 -07004992TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07004993 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
Robert Carr503c7042017-09-27 15:06:08 -07004994 fillSurfaceRGBA8(relative, 255, 255, 255);
4995
4996 Transaction t;
4997 t.setLayer(relative, INT32_MAX)
4998 .setRelativeLayer(mChild, relative->getHandle(), 1)
4999 .setPosition(mFGSurfaceControl, 0, 0)
5000 .apply(true);
5001
5002 // We expect that the child should have been elevated above our
5003 // INT_MAX layer even though it's not a child of it.
5004 {
chaviw0e3479f2018-09-10 16:49:30 -07005005 mCapture = screenshot();
Robert Carr503c7042017-09-27 15:06:08 -07005006 mCapture->expectChildColor(0, 0);
5007 mCapture->expectChildColor(9, 9);
5008 mCapture->checkPixel(10, 10, 255, 255, 255);
5009 }
5010}
Vishnu Nairc652ff82019-03-15 12:48:54 -07005011
Vishnu Nair60356342018-11-13 13:00:45 -08005012class BoundlessLayerTest : public LayerUpdateTest {
5013protected:
5014 std::unique_ptr<ScreenCapture> mCapture;
5015};
5016
5017// Verify setting a size on a buffer layer has no effect.
5018TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) {
5019 sp<SurfaceControl> bufferLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005020 createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0,
5021 mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005022 ASSERT_TRUE(bufferLayer->isValid());
5023 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30));
5024 asTransaction([&](Transaction& t) { t.show(bufferLayer); });
5025 {
5026 mCapture = screenshot();
5027 // Top left of background must now be visible
5028 mCapture->expectBGColor(0, 0);
5029 // Foreground Surface bounds must be color layer
5030 mCapture->expectColor(Rect(64, 64, 94, 94), Color::BLACK);
5031 // Buffer layer should not extend past buffer bounds
5032 mCapture->expectFGColor(95, 95);
5033 }
5034}
5035
5036// Verify a boundless color layer will fill its parent bounds. The parent has a buffer size
5037// which will crop the color layer.
5038TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) {
5039 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005040 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5041 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005042 ASSERT_TRUE(colorLayer->isValid());
5043 asTransaction([&](Transaction& t) {
5044 t.setColor(colorLayer, half3{0, 0, 0});
5045 t.show(colorLayer);
5046 });
5047 {
5048 mCapture = screenshot();
5049 // Top left of background must now be visible
5050 mCapture->expectBGColor(0, 0);
5051 // Foreground Surface bounds must be color layer
5052 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5053 // Color layer should not extend past foreground bounds
5054 mCapture->expectBGColor(129, 129);
5055 }
5056}
5057
5058// Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has
5059// a crop which will be used to crop the color layer.
5060TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005061 sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5062 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005063 ASSERT_TRUE(cropLayer->isValid());
5064 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005065 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5066 ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005067 ASSERT_TRUE(colorLayer->isValid());
5068 asTransaction([&](Transaction& t) {
5069 t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10));
5070 t.setColor(colorLayer, half3{0, 0, 0});
5071 t.show(cropLayer);
5072 t.show(colorLayer);
5073 });
5074 {
5075 mCapture = screenshot();
5076 // Top left of background must now be visible
5077 mCapture->expectBGColor(0, 0);
5078 // Top left of foreground must now be visible
5079 mCapture->expectFGColor(64, 64);
5080 // 5 pixels from the foreground we should see the child surface
5081 mCapture->expectColor(Rect(69, 69, 74, 74), Color::BLACK);
5082 // 10 pixels from the foreground we should be back to the foreground surface
5083 mCapture->expectFGColor(74, 74);
5084 }
5085}
5086
5087// Verify for boundless layer with no children, their transforms have no effect.
5088TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) {
5089 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005090 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5091 ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005092 ASSERT_TRUE(colorLayer->isValid());
5093 asTransaction([&](Transaction& t) {
5094 t.setPosition(colorLayer, 320, 320);
5095 t.setMatrix(colorLayer, 2, 0, 0, 2);
5096 t.setColor(colorLayer, half3{0, 0, 0});
5097 t.show(colorLayer);
5098 });
5099 {
5100 mCapture = screenshot();
5101 // Top left of background must now be visible
5102 mCapture->expectBGColor(0, 0);
5103 // Foreground Surface bounds must be color layer
5104 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5105 // Color layer should not extend past foreground bounds
5106 mCapture->expectBGColor(129, 129);
5107 }
5108}
5109
5110// Verify for boundless layer with children, their transforms have an effect.
5111TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) {
5112 sp<SurfaceControl> boundlessLayerRightShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005113 createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5114 0 /* flags */, mFGSurfaceControl.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005115 ASSERT_TRUE(boundlessLayerRightShift->isValid());
5116 sp<SurfaceControl> boundlessLayerDownShift =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005117 createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888,
5118 0 /* flags */, boundlessLayerRightShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005119 ASSERT_TRUE(boundlessLayerDownShift->isValid());
5120 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005121 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5122 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get());
Vishnu Nair60356342018-11-13 13:00:45 -08005123 ASSERT_TRUE(colorLayer->isValid());
5124 asTransaction([&](Transaction& t) {
5125 t.setPosition(boundlessLayerRightShift, 32, 0);
5126 t.show(boundlessLayerRightShift);
5127 t.setPosition(boundlessLayerDownShift, 0, 32);
5128 t.show(boundlessLayerDownShift);
5129 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5130 t.setColor(colorLayer, half3{0, 0, 0});
5131 t.show(colorLayer);
5132 });
5133 {
5134 mCapture = screenshot();
5135 // Top left of background must now be visible
5136 mCapture->expectBGColor(0, 0);
5137 // Top left of foreground must now be visible
5138 mCapture->expectFGColor(64, 64);
5139 // Foreground Surface bounds must be color layer
5140 mCapture->expectColor(Rect(96, 96, 128, 128), Color::BLACK);
5141 // Color layer should not extend past foreground bounds
5142 mCapture->expectBGColor(129, 129);
5143 }
5144}
5145
5146// Verify child layers do not get clipped if they temporarily move into the negative
5147// coordinate space as the result of an intermediate transformation.
5148TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) {
5149 sp<SurfaceControl> boundlessLayer =
5150 mClient->createSurface(String8("BoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5151 0 /* flags */, mFGSurfaceControl.get());
5152 ASSERT_TRUE(boundlessLayer != nullptr);
5153 ASSERT_TRUE(boundlessLayer->isValid());
5154 sp<SurfaceControl> colorLayer =
5155 mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888,
5156 ISurfaceComposerClient::eFXSurfaceColor, boundlessLayer.get());
5157 ASSERT_TRUE(colorLayer != nullptr);
5158 ASSERT_TRUE(colorLayer->isValid());
5159 asTransaction([&](Transaction& t) {
5160 // shift child layer off bounds. If this layer was not boundless, we will
5161 // expect the child layer to be cropped.
5162 t.setPosition(boundlessLayer, 32, 32);
5163 t.show(boundlessLayer);
5164 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5165 // undo shift by parent
5166 t.setPosition(colorLayer, -32, -32);
5167 t.setColor(colorLayer, half3{0, 0, 0});
5168 t.show(colorLayer);
5169 });
5170 {
5171 mCapture = screenshot();
5172 // Top left of background must now be visible
5173 mCapture->expectBGColor(0, 0);
5174 // Foreground Surface bounds must be color layer
5175 mCapture->expectColor(Rect(64, 64, 128, 128), Color::BLACK);
5176 // Color layer should not extend past foreground bounds
5177 mCapture->expectBGColor(129, 129);
5178 }
5179}
5180
5181// Verify for boundless root layers with children, their transforms have an effect.
5182TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005183 sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0,
5184 PIXEL_FORMAT_RGBA_8888, 0 /* flags */);
Vishnu Nair60356342018-11-13 13:00:45 -08005185 ASSERT_TRUE(rootBoundlessLayer->isValid());
5186 sp<SurfaceControl> colorLayer =
Vishnu Nair88a11f22018-11-28 18:30:57 -08005187 createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888,
5188 ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get());
5189
Vishnu Nair60356342018-11-13 13:00:45 -08005190 ASSERT_TRUE(colorLayer->isValid());
5191 asTransaction([&](Transaction& t) {
5192 t.setLayer(rootBoundlessLayer, INT32_MAX - 1);
5193 t.setPosition(rootBoundlessLayer, 32, 32);
5194 t.show(rootBoundlessLayer);
5195 t.setCrop_legacy(colorLayer, Rect(0, 0, 64, 64));
5196 t.setColor(colorLayer, half3{0, 0, 0});
5197 t.show(colorLayer);
5198 t.hide(mFGSurfaceControl);
5199 });
5200 {
5201 mCapture = screenshot();
5202 // Top left of background must now be visible
5203 mCapture->expectBGColor(0, 0);
5204 // Top left of foreground must now be visible
5205 mCapture->expectBGColor(31, 31);
5206 // Foreground Surface bounds must be color layer
5207 mCapture->expectColor(Rect(32, 32, 96, 96), Color::BLACK);
5208 // Color layer should not extend past foreground bounds
5209 mCapture->expectBGColor(97, 97);
5210 }
5211}
Robert Carr503c7042017-09-27 15:06:08 -07005212
chaviwa76b2712017-09-20 12:02:26 -07005213class ScreenCaptureTest : public LayerUpdateTest {
5214protected:
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005215 std::unique_ptr<ScreenCapture> mCapture;
chaviwa76b2712017-09-20 12:02:26 -07005216};
5217
5218TEST_F(ScreenCaptureTest, CaptureSingleLayer) {
5219 auto bgHandle = mBGSurfaceControl->getHandle();
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005220 ScreenCapture::captureLayers(&mCapture, bgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005221 mCapture->expectBGColor(0, 0);
5222 // Doesn't capture FG layer which is at 64, 64
5223 mCapture->expectBGColor(64, 64);
5224}
5225
5226TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
5227 auto fgHandle = mFGSurfaceControl->getHandle();
5228
Vishnu Nair88a11f22018-11-28 18:30:57 -08005229 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5230 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005231 fillSurfaceRGBA8(child, 200, 200, 200);
5232
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005233 SurfaceComposerClient::Transaction().show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005234
5235 // Captures mFGSurfaceControl layer and its child.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005236 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005237 mCapture->expectFGColor(10, 10);
5238 mCapture->expectChildColor(0, 0);
5239}
5240
Robert Carr578038f2018-03-09 12:25:24 -08005241TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
5242 auto fgHandle = mFGSurfaceControl->getHandle();
5243
Vishnu Nair88a11f22018-11-28 18:30:57 -08005244 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5245 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005246 fillSurfaceRGBA8(child, 200, 200, 200);
5247
5248 SurfaceComposerClient::Transaction().show(child).apply(true);
5249
5250 // Captures mFGSurfaceControl's child
5251 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5252 mCapture->checkPixel(10, 10, 0, 0, 0);
5253 mCapture->expectChildColor(0, 0);
5254}
5255
Robert Carr866455f2019-04-02 16:28:26 -07005256TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
5257 auto fgHandle = mFGSurfaceControl->getHandle();
5258
5259 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5260 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5261 fillSurfaceRGBA8(child, 200, 200, 200);
5262 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5263 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5264 fillSurfaceRGBA8(child2, 200, 0, 200);
5265
5266 SurfaceComposerClient::Transaction()
5267 .show(child)
5268 .show(child2)
5269 .setLayer(child, 1)
5270 .setLayer(child2, 2)
5271 .apply(true);
5272
5273 // Child2 would be visible but its excluded, so we should see child1 color instead.
5274 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5275 mCapture->checkPixel(10, 10, 0, 0, 0);
5276 mCapture->checkPixel(0, 0, 200, 200, 200);
5277}
5278
5279// Like the last test but verifies that children are also exclude.
5280TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
5281 auto fgHandle = mFGSurfaceControl->getHandle();
5282
5283 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5284 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5285 fillSurfaceRGBA8(child, 200, 200, 200);
5286 sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
5287 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5288 fillSurfaceRGBA8(child2, 200, 0, 200);
5289 sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
5290 PIXEL_FORMAT_RGBA_8888, 0, child2.get());
5291 fillSurfaceRGBA8(child2, 200, 0, 200);
5292
5293 SurfaceComposerClient::Transaction()
5294 .show(child)
5295 .show(child2)
5296 .show(child3)
5297 .setLayer(child, 1)
5298 .setLayer(child2, 2)
5299 .apply(true);
5300
5301 // Child2 would be visible but its excluded, so we should see child1 color instead.
5302 ScreenCapture::captureChildLayersExcluding(&mCapture, fgHandle, {child2->getHandle()});
5303 mCapture->checkPixel(10, 10, 0, 0, 0);
5304 mCapture->checkPixel(0, 0, 200, 200, 200);
5305}
5306
chaviw50da5042018-04-09 13:49:37 -07005307TEST_F(ScreenCaptureTest, CaptureTransparent) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005308 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5309 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw50da5042018-04-09 13:49:37 -07005310
5311 fillSurfaceRGBA8(child, 200, 200, 200);
5312
5313 SurfaceComposerClient::Transaction().show(child).apply(true);
5314
5315 auto childHandle = child->getHandle();
5316
5317 // Captures child
5318 ScreenCapture::captureLayers(&mCapture, childHandle, {0, 0, 10, 20});
5319 mCapture->expectColor(Rect(0, 0, 9, 9), {200, 200, 200, 255});
5320 // Area outside of child's bounds is transparent.
5321 mCapture->expectColor(Rect(0, 10, 9, 19), {0, 0, 0, 0});
5322}
5323
chaviw4b129c22018-04-09 16:19:43 -07005324TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
5325 auto fgHandle = mFGSurfaceControl->getHandle();
5326
Vishnu Nair88a11f22018-11-28 18:30:57 -08005327 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5328 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5329 ASSERT_NE(nullptr, child.get()) << "failed to create surface";
chaviw0e3479f2018-09-10 16:49:30 -07005330 sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0);
chaviw4b129c22018-04-09 16:19:43 -07005331 fillSurfaceRGBA8(child, 200, 200, 200);
5332 fillSurfaceRGBA8(relative, 100, 100, 100);
5333
5334 SurfaceComposerClient::Transaction()
5335 .show(child)
5336 // Set relative layer above fg layer so should be shown above when computing all layers.
5337 .setRelativeLayer(relative, fgHandle, 1)
5338 .show(relative)
5339 .apply(true);
5340
5341 // Captures mFGSurfaceControl layer and its child. Relative layer shouldn't be captured.
5342 ScreenCapture::captureLayers(&mCapture, fgHandle);
5343 mCapture->expectFGColor(10, 10);
5344 mCapture->expectChildColor(0, 0);
5345}
5346
5347TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
5348 auto fgHandle = mFGSurfaceControl->getHandle();
5349
Vishnu Nair88a11f22018-11-28 18:30:57 -08005350 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5351 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
5352 sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10,
5353 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviw4b129c22018-04-09 16:19:43 -07005354 fillSurfaceRGBA8(child, 200, 200, 200);
5355 fillSurfaceRGBA8(relative, 100, 100, 100);
5356
5357 SurfaceComposerClient::Transaction()
5358 .show(child)
5359 // Set relative layer below fg layer but relative to child layer so it should be shown
5360 // above child layer.
5361 .setLayer(relative, -1)
5362 .setRelativeLayer(relative, child->getHandle(), 1)
5363 .show(relative)
5364 .apply(true);
5365
5366 // Captures mFGSurfaceControl layer and its children. Relative layer is a child of fg so its
5367 // relative value should be taken into account, placing it above child layer.
5368 ScreenCapture::captureLayers(&mCapture, fgHandle);
5369 mCapture->expectFGColor(10, 10);
5370 // Relative layer is showing on top of child layer
5371 mCapture->expectColor(Rect(0, 0, 9, 9), {100, 100, 100, 255});
5372}
Robert Carr578038f2018-03-09 12:25:24 -08005373
5374// In the following tests we verify successful skipping of a parent layer,
5375// so we use the same verification logic and only change how we mutate
5376// the parent layer to verify that various properties are ignored.
5377class ScreenCaptureChildOnlyTest : public LayerUpdateTest {
5378public:
5379 void SetUp() override {
5380 LayerUpdateTest::SetUp();
5381
Vishnu Nair88a11f22018-11-28 18:30:57 -08005382 mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
5383 mFGSurfaceControl.get());
Robert Carr578038f2018-03-09 12:25:24 -08005384 fillSurfaceRGBA8(mChild, 200, 200, 200);
5385
5386 SurfaceComposerClient::Transaction().show(mChild).apply(true);
5387 }
5388
Vishnu Nair333a9572019-02-15 16:05:56 -08005389 void verify(std::function<void()> verifyStartingState) {
5390 // Verify starting state before a screenshot is taken.
5391 verifyStartingState();
5392
5393 // Verify child layer does not inherit any of the properties of its
5394 // parent when its screenshot is captured.
Robert Carr578038f2018-03-09 12:25:24 -08005395 auto fgHandle = mFGSurfaceControl->getHandle();
5396 ScreenCapture::captureChildLayers(&mCapture, fgHandle);
5397 mCapture->checkPixel(10, 10, 0, 0, 0);
5398 mCapture->expectChildColor(0, 0);
Vishnu Nair333a9572019-02-15 16:05:56 -08005399
5400 // Verify all assumptions are still true after the screenshot is taken.
5401 verifyStartingState();
Robert Carr578038f2018-03-09 12:25:24 -08005402 }
5403
5404 std::unique_ptr<ScreenCapture> mCapture;
5405 sp<SurfaceControl> mChild;
5406};
5407
Vishnu Nair333a9572019-02-15 16:05:56 -08005408// Regression test b/76099859
Robert Carr578038f2018-03-09 12:25:24 -08005409TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentVisibility) {
5410
5411 SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true);
5412
5413 // Even though the parent is hidden we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005414
5415 // Before and after reparenting, verify child is properly hidden
5416 // when rendering full-screen.
5417 verify([&] { screenshot()->expectBGColor(64, 64); });
Robert Carr578038f2018-03-09 12:25:24 -08005418}
5419
5420TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresParentCrop) {
Marissa Wallf58c14b2018-07-24 10:50:43 -07005421 SurfaceComposerClient::Transaction()
5422 .setCrop_legacy(mFGSurfaceControl, Rect(0, 0, 1, 1))
5423 .apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005424
5425 // Even though the parent is cropped out we should still capture the child.
Vishnu Nair333a9572019-02-15 16:05:56 -08005426
5427 // Before and after reparenting, verify child is cropped by parent.
5428 verify([&] { screenshot()->expectBGColor(65, 65); });
Robert Carr578038f2018-03-09 12:25:24 -08005429}
5430
Vishnu Nair333a9572019-02-15 16:05:56 -08005431// Regression test b/124372894
Robert Carr578038f2018-03-09 12:25:24 -08005432TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) {
Vishnu Nair333a9572019-02-15 16:05:56 -08005433 SurfaceComposerClient::Transaction().setMatrix(mFGSurfaceControl, 2, 0, 0, 2).apply(true);
Robert Carr578038f2018-03-09 12:25:24 -08005434
5435 // We should not inherit the parent scaling.
Robert Carr578038f2018-03-09 12:25:24 -08005436
Vishnu Nair333a9572019-02-15 16:05:56 -08005437 // Before and after reparenting, verify child is properly scaled.
5438 verify([&] { screenshot()->expectChildColor(80, 80); });
Robert Carr15eae092018-03-23 13:43:53 -07005439}
5440
5441
chaviwa76b2712017-09-20 12:02:26 -07005442TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
5443 auto fgHandle = mFGSurfaceControl->getHandle();
5444
Vishnu Nair88a11f22018-11-28 18:30:57 -08005445 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5446 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005447 fillSurfaceRGBA8(child, 200, 200, 200);
5448
Vishnu Nair88a11f22018-11-28 18:30:57 -08005449 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5450 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005451
5452 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5453 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005454 .show(child)
5455 .setPosition(grandchild, 5, 5)
5456 .show(grandchild)
5457 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005458
5459 // Captures mFGSurfaceControl, its child, and the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005460 ScreenCapture::captureLayers(&mCapture, fgHandle);
chaviwa76b2712017-09-20 12:02:26 -07005461 mCapture->expectFGColor(10, 10);
5462 mCapture->expectChildColor(0, 0);
5463 mCapture->checkPixel(5, 5, 50, 50, 50);
5464}
5465
5466TEST_F(ScreenCaptureTest, CaptureChildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005467 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5468 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005469 fillSurfaceRGBA8(child, 200, 200, 200);
5470 auto childHandle = child->getHandle();
5471
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005472 SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005473
5474 // Captures only the child layer, and not the parent.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005475 ScreenCapture::captureLayers(&mCapture, childHandle);
chaviwa76b2712017-09-20 12:02:26 -07005476 mCapture->expectChildColor(0, 0);
5477 mCapture->expectChildColor(9, 9);
5478}
5479
5480TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
Vishnu Nair88a11f22018-11-28 18:30:57 -08005481 sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
5482 PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
chaviwa76b2712017-09-20 12:02:26 -07005483 fillSurfaceRGBA8(child, 200, 200, 200);
5484 auto childHandle = child->getHandle();
5485
Vishnu Nair88a11f22018-11-28 18:30:57 -08005486 sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
5487 PIXEL_FORMAT_RGBA_8888, 0, child.get());
chaviwa76b2712017-09-20 12:02:26 -07005488 fillSurfaceRGBA8(grandchild, 50, 50, 50);
5489
5490 SurfaceComposerClient::Transaction()
Chia-I Wu1078bbb2017-10-20 11:29:02 -07005491 .show(child)
5492 .setPosition(grandchild, 5, 5)
5493 .show(grandchild)
5494 .apply(true);
chaviwa76b2712017-09-20 12:02:26 -07005495
5496 auto grandchildHandle = grandchild->getHandle();
5497
5498 // Captures only the grandchild.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005499 ScreenCapture::captureLayers(&mCapture, grandchildHandle);
chaviwa76b2712017-09-20 12:02:26 -07005500 mCapture->checkPixel(0, 0, 50, 50, 50);
5501 mCapture->checkPixel(4, 4, 50, 50, 50);
5502}
5503
chaviw7206d492017-11-10 16:16:12 -08005504TEST_F(ScreenCaptureTest, CaptureCrop) {
chaviw0e3479f2018-09-10 16:49:30 -07005505 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005506 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5507 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005508
Marissa Wall61c58622018-07-18 10:12:20 -07005509 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5510 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005511
5512 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005513 .setLayer(redLayer, INT32_MAX - 1)
5514 .show(redLayer)
5515 .show(blueLayer)
5516 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005517
5518 auto redLayerHandle = redLayer->getHandle();
5519
5520 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005521 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5522 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5523 // red area below the blue area
5524 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5525 // red area to the right of the blue area
5526 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005527
Marissa Wall861616d2018-10-22 12:52:23 -07005528 const Rect crop = Rect(0, 0, 30, 30);
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005529 ScreenCapture::captureLayers(&mCapture, redLayerHandle, crop);
chaviw7206d492017-11-10 16:16:12 -08005530 // Capturing the cropped screen, cropping out the shown red area, should leave only the blue
5531 // area visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005532 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
chaviw7206d492017-11-10 16:16:12 -08005533 mCapture->checkPixel(30, 30, 0, 0, 0);
5534}
5535
5536TEST_F(ScreenCaptureTest, CaptureSize) {
chaviw0e3479f2018-09-10 16:49:30 -07005537 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
Vishnu Nair88a11f22018-11-28 18:30:57 -08005538 sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30,
5539 PIXEL_FORMAT_RGBA_8888, 0, redLayer.get());
chaviw7206d492017-11-10 16:16:12 -08005540
Marissa Wall61c58622018-07-18 10:12:20 -07005541 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
5542 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30));
chaviw7206d492017-11-10 16:16:12 -08005543
5544 SurfaceComposerClient::Transaction()
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005545 .setLayer(redLayer, INT32_MAX - 1)
5546 .show(redLayer)
5547 .show(blueLayer)
5548 .apply(true);
chaviw7206d492017-11-10 16:16:12 -08005549
5550 auto redLayerHandle = redLayer->getHandle();
5551
5552 // Capturing full screen should have both red and blue are visible.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005553 ScreenCapture::captureLayers(&mCapture, redLayerHandle);
5554 mCapture->expectColor(Rect(0, 0, 29, 29), Color::BLUE);
5555 // red area below the blue area
5556 mCapture->expectColor(Rect(0, 30, 59, 59), Color::RED);
5557 // red area to the right of the blue area
5558 mCapture->expectColor(Rect(30, 0, 59, 59), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005559
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005560 ScreenCapture::captureLayers(&mCapture, redLayerHandle, Rect::EMPTY_RECT, 0.5);
chaviw7206d492017-11-10 16:16:12 -08005561 // Capturing the downsized area (30x30) should leave both red and blue but in a smaller area.
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005562 mCapture->expectColor(Rect(0, 0, 14, 14), Color::BLUE);
5563 // red area below the blue area
5564 mCapture->expectColor(Rect(0, 15, 29, 29), Color::RED);
5565 // red area to the right of the blue area
5566 mCapture->expectColor(Rect(15, 0, 29, 29), Color::RED);
chaviw7206d492017-11-10 16:16:12 -08005567 mCapture->checkPixel(30, 30, 0, 0, 0);
5568}
5569
5570TEST_F(ScreenCaptureTest, CaptureInvalidLayer) {
chaviw0e3479f2018-09-10 16:49:30 -07005571 sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0);
chaviw7206d492017-11-10 16:16:12 -08005572
Marissa Wall61c58622018-07-18 10:12:20 -07005573 ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60));
chaviw7206d492017-11-10 16:16:12 -08005574
5575 auto redLayerHandle = redLayer->getHandle();
Robert Carr87246532019-02-04 15:20:26 -08005576 redLayer.clear();
chaviw7206d492017-11-10 16:16:12 -08005577 SurfaceComposerClient::Transaction().apply(true);
5578
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005579 sp<GraphicBuffer> outBuffer;
chaviw7206d492017-11-10 16:16:12 -08005580
5581 // Layer was deleted so captureLayers should fail with NAME_NOT_FOUND
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005582 sp<ISurfaceComposer> sf(ComposerService::getComposerService());
5583 ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0));
chaviw7206d492017-11-10 16:16:12 -08005584}
5585
chaviw8e3fe5d2018-02-22 10:55:42 -08005586
5587class DereferenceSurfaceControlTest : public LayerTransactionTest {
5588protected:
5589 void SetUp() override {
5590 LayerTransactionTest::SetUp();
5591 bgLayer = createLayer("BG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005592 fillBufferQueueLayerColor(bgLayer, Color::RED, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005593 fgLayer = createLayer("FG layer", 20, 20);
Marissa Wall61c58622018-07-18 10:12:20 -07005594 fillBufferQueueLayerColor(fgLayer, Color::BLUE, 20, 20);
chaviw8e3fe5d2018-02-22 10:55:42 -08005595 Transaction().setLayer(fgLayer, mLayerZBase + 1).apply();
5596 {
5597 SCOPED_TRACE("before anything");
5598 auto shot = screenshot();
5599 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5600 }
5601 }
5602 void TearDown() override {
5603 LayerTransactionTest::TearDown();
5604 bgLayer = 0;
5605 fgLayer = 0;
5606 }
5607
5608 sp<SurfaceControl> bgLayer;
5609 sp<SurfaceControl> fgLayer;
5610};
5611
5612TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
5613 fgLayer = nullptr;
5614 {
5615 SCOPED_TRACE("after setting null");
5616 auto shot = screenshot();
5617 shot->expectColor(Rect(0, 0, 20, 20), Color::RED);
5618 }
5619}
5620
5621TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
5622 auto transaction = Transaction().show(fgLayer);
5623 fgLayer = nullptr;
5624 {
5625 SCOPED_TRACE("after setting null");
5626 auto shot = screenshot();
5627 shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE);
5628 }
5629}
5630
Vishnu Nairb927e1f2019-02-19 13:36:15 -08005631class MultiDisplayLayerBoundsTest : public LayerTransactionTest {
5632protected:
5633 virtual void SetUp() {
5634 LayerTransactionTest::SetUp();
5635 ASSERT_EQ(NO_ERROR, mClient->initCheck());
5636
5637 mMainDisplay = SurfaceComposerClient::getInternalDisplayToken();
5638 SurfaceComposerClient::getDisplayInfo(mMainDisplay, &mMainDisplayInfo);
5639
5640 sp<IGraphicBufferConsumer> consumer;
5641 BufferQueue::createBufferQueue(&mProducer, &consumer);
5642 consumer->setConsumerName(String8("Virtual disp consumer"));
5643 consumer->setDefaultBufferSize(mMainDisplayInfo.w, mMainDisplayInfo.h);
5644 }
5645
5646 virtual void TearDown() {
5647 SurfaceComposerClient::destroyDisplay(mVirtualDisplay);
5648 LayerTransactionTest::TearDown();
5649 mColorLayer = 0;
5650 }
5651
5652 void createDisplay(const Rect& layerStackRect, uint32_t layerStack) {
5653 mVirtualDisplay =
5654 SurfaceComposerClient::createDisplay(String8("VirtualDisplay"), false /*secure*/);
5655 asTransaction([&](Transaction& t) {
5656 t.setDisplaySurface(mVirtualDisplay, mProducer);
5657 t.setDisplayLayerStack(mVirtualDisplay, layerStack);
5658 t.setDisplayProjection(mVirtualDisplay, mMainDisplayInfo.orientation, layerStackRect,
5659 Rect(mMainDisplayInfo.w, mMainDisplayInfo.h));
5660 });
5661 }
5662
5663 void createColorLayer(uint32_t layerStack) {
5664 mColorLayer =
5665 createSurface(mClient, "ColorLayer", 0 /* buffer width */, 0 /* buffer height */,
5666 PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor);
5667 ASSERT_TRUE(mColorLayer != nullptr);
5668 ASSERT_TRUE(mColorLayer->isValid());
5669 asTransaction([&](Transaction& t) {
5670 t.setLayerStack(mColorLayer, layerStack);
5671 t.setCrop_legacy(mColorLayer, Rect(0, 0, 30, 40));
5672 t.setLayer(mColorLayer, INT32_MAX - 2);
5673 t.setColor(mColorLayer,
5674 half3{mExpectedColor.r / 255.0f, mExpectedColor.g / 255.0f,
5675 mExpectedColor.b / 255.0f});
5676 t.show(mColorLayer);
5677 });
5678 }
5679
5680 DisplayInfo mMainDisplayInfo;
5681 sp<IBinder> mMainDisplay;
5682 sp<IBinder> mVirtualDisplay;
5683 sp<IGraphicBufferProducer> mProducer;
5684 sp<SurfaceControl> mColorLayer;
5685 Color mExpectedColor = {63, 63, 195, 255};
5686};
5687
5688TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInVirtualDisplay) {
5689 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 1 /* layerStack */);
5690 createColorLayer(1 /* layerStack */);
5691
5692 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5693
5694 // Verify color layer does not render on main display.
5695 std::unique_ptr<ScreenCapture> sc;
5696 ScreenCapture::captureScreen(&sc, mMainDisplay);
5697 sc->expectColor(Rect(10, 10, 40, 50), {0, 0, 0, 255});
5698 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5699
5700 // Verify color layer renders correctly on virtual display.
5701 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5702 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5703 sc->expectColor(Rect(1, 1, 9, 9), {0, 0, 0, 0});
5704}
5705
5706TEST_F(MultiDisplayLayerBoundsTest, RenderLayerInMirroredVirtualDisplay) {
5707 // Create a display and set its layer stack to the main display's layer stack so
5708 // the contents of the main display are mirrored on to the virtual display.
5709
5710 // Assumption here is that the new mirrored display has the same viewport as the
5711 // primary display that it is mirroring.
5712 createDisplay({mMainDisplayInfo.viewportW, mMainDisplayInfo.viewportH}, 0 /* layerStack */);
5713 createColorLayer(0 /* layerStack */);
5714
5715 asTransaction([&](Transaction& t) { t.setPosition(mColorLayer, 10, 10); });
5716
5717 // Verify color layer renders correctly on main display and it is mirrored on the
5718 // virtual display.
5719 std::unique_ptr<ScreenCapture> sc;
5720 ScreenCapture::captureScreen(&sc, mMainDisplay);
5721 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5722 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5723
5724 ScreenCapture::captureScreen(&sc, mVirtualDisplay);
5725 sc->expectColor(Rect(10, 10, 40, 50), mExpectedColor);
5726 sc->expectColor(Rect(0, 0, 9, 9), {0, 0, 0, 255});
5727}
5728
Ady Abrahamdf9df4a2019-03-12 17:32:05 -07005729class DisplayActiveConfigTest : public ::testing::Test {
5730protected:
5731 void SetUp() override {
5732 mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
5733 SurfaceComposerClient::getDisplayConfigs(mDisplayToken, &mDisplayconfigs);
5734 EXPECT_GT(mDisplayconfigs.size(), 0);
5735
5736 // set display power to on to make sure config can be changed
5737 SurfaceComposerClient::setDisplayPowerMode(mDisplayToken, HWC_POWER_MODE_NORMAL);
5738 }
5739
5740 sp<IBinder> mDisplayToken;
5741 Vector<DisplayInfo> mDisplayconfigs;
5742};
5743
5744TEST_F(DisplayActiveConfigTest, allConfigsAllowed) {
5745 std::vector<int32_t> allowedConfigs;
5746
5747 // Add all configs to the allowed configs
5748 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5749 allowedConfigs.push_back(i);
5750 }
5751
5752 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5753 EXPECT_EQ(res, NO_ERROR);
5754
5755 std::vector<int32_t> outConfigs;
5756 res = SurfaceComposerClient::getAllowedDisplayConfigs(mDisplayToken, &outConfigs);
5757 EXPECT_EQ(res, NO_ERROR);
5758 EXPECT_EQ(allowedConfigs, outConfigs);
5759}
5760
5761TEST_F(DisplayActiveConfigTest, changeAllowedConfig) {
5762 // we need at least 2 configs available for this test
5763 if (mDisplayconfigs.size() <= 1) return;
5764
5765 int activeConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5766
5767 // We want to set the allowed config to everything but the active config
5768 std::vector<int32_t> allowedConfigs;
5769 for (int i = 0; i < mDisplayconfigs.size(); i++) {
5770 if (i != activeConfig) {
5771 allowedConfigs.push_back(i);
5772 }
5773 }
5774
5775 status_t res = SurfaceComposerClient::setAllowedDisplayConfigs(mDisplayToken, allowedConfigs);
5776 EXPECT_EQ(res, NO_ERROR);
5777
5778 // Allow some time for the config change
5779 std::this_thread::sleep_for(200ms);
5780
5781 int newActiveConfig = SurfaceComposerClient::getActiveConfig(mDisplayToken);
5782 EXPECT_NE(activeConfig, newActiveConfig);
5783
5784 // Make sure the new config is part of allowed config
5785 EXPECT_TRUE(std::find(allowedConfigs.begin(), allowedConfigs.end(), newActiveConfig) !=
5786 allowedConfigs.end());
5787}
5788
Chavi Weingarten40482ff2017-11-30 01:51:40 +00005789} // namespace android