blob: 15fb1b8583a2d531b6803d1dcba36b41bc1995a6 [file] [log] [blame]
Alec Mouri6e57f682018-09-29 20:45:08 -07001/*
2 * Copyright 2018 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
Ana Krulec82ba2ec2020-11-21 13:33:20 -080017#undef LOG_TAG
18#define LOG_TAG "RenderEngineTest"
19
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080020// TODO(b/129481165): remove the #pragma below and fix conversion issues
21#pragma clang diagnostic push
22#pragma clang diagnostic ignored "-Wconversion"
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010023#pragma clang diagnostic ignored "-Wextra"
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080024
Alec Mouri16a99402019-07-29 16:37:30 -070025#include <chrono>
26#include <condition_variable>
Vishnu Nair16efdbf2019-12-10 11:55:42 -080027#include <fstream>
Alec Mouri6e57f682018-09-29 20:45:08 -070028
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080029#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080030#include <gtest/gtest.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070031#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070032#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070033#include <ui/PixelFormat.h>
Alec Mourid43ccab2019-03-13 12:23:45 -070034#include "../gl/GLESRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080035#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070036
Alec Mouri1089aed2018-10-25 21:33:57 -070037constexpr int DEFAULT_DISPLAY_WIDTH = 128;
38constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
39constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080040constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070041
Alec Mouri6e57f682018-09-29 20:45:08 -070042namespace android {
43
Ana Krulec82ba2ec2020-11-21 13:33:20 -080044class RenderEngineFactory {
45public:
46 virtual ~RenderEngineFactory() = default;
47
48 virtual std::string name() = 0;
49 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() = 0;
50};
51
52class GLESRenderEngineFactory : public RenderEngineFactory {
53public:
54 std::string name() override { return "GLESRenderEngineFactory"; }
55
56 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080057 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070058 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080059 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
60 .setImageCacheSize(1)
61 .setUseColorManagerment(false)
62 .setEnableProtectedContext(false)
63 .setPrecacheToneMapperShaderOnly(false)
64 .setSupportsBackgroundBlur(true)
65 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
66 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::GLES)
KaiChieh Chuang436fc192020-09-07 13:48:42 +080067 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080068 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070069 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080070};
Alec Mourid43ccab2019-03-13 12:23:45 -070071
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080072class GLESCMRenderEngineFactory : public RenderEngineFactory {
73public:
74 std::string name() override { return "GLESCMRenderEngineFactory"; }
75
76 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
77 renderengine::RenderEngineCreationArgs reCreationArgs =
78 renderengine::RenderEngineCreationArgs::Builder()
79 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
80 .setImageCacheSize(1)
81 .setEnableProtectedContext(false)
82 .setPrecacheToneMapperShaderOnly(false)
83 .setSupportsBackgroundBlur(true)
84 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
85 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::GLES)
86 .setUseColorManagerment(true)
87 .build();
88 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
89 }
90};
91
Alec Mouri0eab3e82020-12-08 18:10:27 -080092class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
93public:
94 std::string name() override { return "SkiaGLESRenderEngineFactory"; }
95
96 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
97 renderengine::RenderEngineCreationArgs reCreationArgs =
98 renderengine::RenderEngineCreationArgs::Builder()
99 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
100 .setImageCacheSize(1)
101 .setEnableProtectedContext(false)
102 .setPrecacheToneMapperShaderOnly(false)
103 .setSupportsBackgroundBlur(true)
104 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
105 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::SKIA_GL)
106 .build();
107 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
108 }
109};
110
111class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
112public:
113 std::string name() override { return "SkiaGLESCMRenderEngineFactory"; }
114
115 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
116 renderengine::RenderEngineCreationArgs reCreationArgs =
117 renderengine::RenderEngineCreationArgs::Builder()
118 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
119 .setImageCacheSize(1)
120 .setEnableProtectedContext(false)
121 .setPrecacheToneMapperShaderOnly(false)
122 .setSupportsBackgroundBlur(true)
123 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
124 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::SKIA_GL)
125 .setUseColorManagerment(true)
126 .build();
127 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
128 }
129};
130
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800131class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
132public:
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800133 static sp<GraphicBuffer> allocateDefaultBuffer() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700134 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
135 HAL_PIXEL_FORMAT_RGBA_8888, 1,
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800136 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
137 GRALLOC_USAGE_HW_RENDER,
Alec Mouri1089aed2018-10-25 21:33:57 -0700138 "output");
Alec Mouri6e57f682018-09-29 20:45:08 -0700139 }
140
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800141 // Allocates a 1x1 buffer to fill with a solid color
142 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) {
143 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
144 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
145 GRALLOC_USAGE_HW_TEXTURE,
146 "input");
147 }
148
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800149 RenderEngineTest() {
150 const ::testing::TestInfo* const test_info =
151 ::testing::UnitTest::GetInstance()->current_test_info();
152 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
153 mBuffer = allocateDefaultBuffer();
154 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700155
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800156 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800157 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
158 writeBufferToFile("/data/texture_out_");
159 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800160 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800161 mRE->deleteTextures(1, &texName);
162 EXPECT_FALSE(mRE->isTextureNameKnownForTesting(texName));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800163 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800164 const ::testing::TestInfo* const test_info =
165 ::testing::UnitTest::GetInstance()->current_test_info();
166 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800167 }
168
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800169 void writeBufferToFile(const char* basename) {
170 std::string filename(basename);
171 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
172 filename.append(".ppm");
173 std::ofstream file(filename.c_str(), std::ios::binary);
174 if (!file.is_open()) {
175 ALOGE("Unable to open file: %s", filename.c_str());
176 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
177 "surfaceflinger to write debug images");
178 return;
179 }
180
Alec Mouri1089aed2018-10-25 21:33:57 -0700181 uint8_t* pixels;
182 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
183 reinterpret_cast<void**>(&pixels));
184
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800185 file << "P6\n";
186 file << mBuffer->getWidth() << "\n";
187 file << mBuffer->getHeight() << "\n";
188 file << 255 << "\n";
189
190 std::vector<uint8_t> outBuffer(mBuffer->getWidth() * mBuffer->getHeight() * 3);
191 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
192
193 for (int32_t j = 0; j < mBuffer->getHeight(); j++) {
194 const uint8_t* src = pixels + (mBuffer->getStride() * j) * 4;
195 for (int32_t i = 0; i < mBuffer->getWidth(); i++) {
196 // Only copy R, G and B components
197 outPtr[0] = src[0];
198 outPtr[1] = src[1];
199 outPtr[2] = src[2];
200 outPtr += 3;
201
202 src += 4;
203 }
204 }
205 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
206 mBuffer->unlock();
207 }
208
209 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
210 size_t c;
211 Rect const* rect = region.getArray(&c);
212 for (size_t i = 0; i < c; i++, rect++) {
213 expectBufferColor(*rect, r, g, b, a);
214 }
215 }
216
217 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
218 uint8_t tolerance = 0) {
219 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
220 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
221 uint8_t tmp = a >= b ? a - b : b - a;
222 return tmp <= tolerance;
223 };
224 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700225 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800226
227 expectBufferColor(rect, r, g, b, a, colorCompare);
228 }
229
230 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
231 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
232 uint8_t* pixels;
233 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
234 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700235 int32_t maxFails = 10;
236 int32_t fails = 0;
237 for (int32_t j = 0; j < region.getHeight(); j++) {
238 const uint8_t* src =
239 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4;
240 for (int32_t i = 0; i < region.getWidth(); i++) {
241 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800242 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700243 EXPECT_TRUE(equal)
244 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
245 << "expected (" << static_cast<uint32_t>(r) << ", "
246 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
247 << static_cast<uint32_t>(a) << "), "
248 << "got (" << static_cast<uint32_t>(src[0]) << ", "
249 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
250 << ", " << static_cast<uint32_t>(src[3]) << ")";
251 src += 4;
252 if (!equal && ++fails >= maxFails) {
253 break;
254 }
255 }
256 if (fails >= maxFails) {
257 break;
258 }
259 }
260 mBuffer->unlock();
261 }
262
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800263 void expectAlpha(const Rect& rect, uint8_t a) {
264 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
265 return colorA[3] == colorB[3];
266 };
267 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
268 }
269
270 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
271 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
272 const ubyte4& backgroundColor) {
273 const Rect casterRect(castingLayer.geometry.boundaries);
274 Region casterRegion = Region(casterRect);
275 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
276 if (casterCornerRadius > 0.0f) {
277 // ignore the corners if a corner radius is set
278 Rect cornerRect(casterCornerRadius, casterCornerRadius);
279 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
280 casterRegion.subtractSelf(
281 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
282 casterRegion.subtractSelf(
283 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
284 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
285 casterRect.bottom - casterCornerRadius));
286 }
287
288 const float shadowInset = shadow.length * -1.0f;
289 const Rect casterWithShadow =
290 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
291 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
292 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
293
294 // verify casting layer
295 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
296
297 // verify shadows by testing just the alpha since its difficult to validate the shadow color
298 size_t c;
299 Rect const* r = shadowRegion.getArray(&c);
300 for (size_t i = 0; i < c; i++, r++) {
301 expectAlpha(*r, 255);
302 }
303
304 // verify background
305 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
306 backgroundColor.a);
307 }
308
Alec Mouribd17b3b2020-12-17 11:08:30 -0800309 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
310 const renderengine::ShadowSettings& shadow,
311 const ubyte4& backgroundColor) {
312 const float shadowInset = shadow.length * -1.0f;
313 const Rect casterRect(casterBounds);
314 const Rect shadowRect =
315 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
316
317 const Region backgroundRegion =
318 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
319
320 expectAlpha(shadowRect, 255);
321 // (0, 0, 0) fill on the bounds of the layer should be ignored.
322 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
323
324 // verify background
325 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
326 backgroundColor.a);
327 }
328
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800329 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
330 bool casterIsTranslucent) {
331 renderengine::ShadowSettings shadow;
332 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
333 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
334 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
335 shadow.lightRadius = 0.0f;
336 shadow.length = shadowLength;
337 shadow.casterIsTranslucent = casterIsTranslucent;
338 return shadow;
339 }
340
Alec Mouri1089aed2018-10-25 21:33:57 -0700341 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
342
343 static Rect offsetRect() {
344 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
345 DEFAULT_DISPLAY_HEIGHT);
346 }
347
348 static Rect offsetRectAtZero() {
349 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
350 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
351 }
352
Alec Mourid43ccab2019-03-13 12:23:45 -0700353 void invokeDraw(renderengine::DisplaySettings settings,
Vishnu Nair9b079a22020-01-21 14:36:08 -0800354 std::vector<const renderengine::LayerSettings*> layers,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800355 sp<GraphicBuffer> buffer) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700356 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800357 status_t status =
358 mRE->drawLayers(settings, layers, buffer, true, base::unique_fd(), &fence);
359 mCurrentBuffer = buffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700360
361 int fd = fence.release();
362 if (fd >= 0) {
363 sync_wait(fd, -1);
364 close(fd);
365 }
366
367 ASSERT_EQ(NO_ERROR, status);
Alec Mourid43ccab2019-03-13 12:23:45 -0700368 if (layers.size() > 0) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800369 ASSERT_TRUE(mRE->isFramebufferImageCachedForTesting(buffer->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700370 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700371 }
372
Alec Mourid43ccab2019-03-13 12:23:45 -0700373 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700374 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800375 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri6e57f682018-09-29 20:45:08 -0700376 // Meaningless buffer since we don't do any drawing
377 sp<GraphicBuffer> buffer = new GraphicBuffer();
Alec Mouri1089aed2018-10-25 21:33:57 -0700378 invokeDraw(settings, layers, buffer);
Alec Mouri6e57f682018-09-29 20:45:08 -0700379 }
380
Alec Mouri1089aed2018-10-25 21:33:57 -0700381 template <typename SourceVariant>
382 void fillBuffer(half r, half g, half b, half a);
383
384 template <typename SourceVariant>
385 void fillRedBuffer();
386
387 template <typename SourceVariant>
388 void fillGreenBuffer();
389
390 template <typename SourceVariant>
391 void fillBlueBuffer();
392
393 template <typename SourceVariant>
394 void fillRedTransparentBuffer();
395
396 template <typename SourceVariant>
397 void fillRedOffsetBuffer();
398
399 template <typename SourceVariant>
400 void fillBufferPhysicalOffset();
401
402 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700403 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700404
405 template <typename SourceVariant>
406 void fillBufferCheckersRotate0();
407
408 template <typename SourceVariant>
409 void fillBufferCheckersRotate90();
410
411 template <typename SourceVariant>
412 void fillBufferCheckersRotate180();
413
414 template <typename SourceVariant>
415 void fillBufferCheckersRotate270();
416
417 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800418 void fillBufferWithLayerTransform();
419
420 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700421 void fillBufferLayerTransform();
422
423 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800424 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800425
426 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700427 void fillBufferColorTransform();
428
Alec Mouri7c94edb2018-12-03 21:23:26 -0800429 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800430 void fillBufferWithColorTransformZeroLayerAlpha();
431
432 template <typename SourceVariant>
433 void fillBufferColorTransformZeroLayerAlpha();
434
435 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800436 void fillRedBufferWithRoundedCorners();
437
438 template <typename SourceVariant>
439 void fillBufferWithRoundedCorners();
440
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000441 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800442 void fillBufferAndBlurBackground();
443
444 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000445 void overlayCorners();
446
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800447 void fillRedBufferTextureTransform();
448
449 void fillBufferTextureTransform();
450
451 void fillRedBufferWithPremultiplyAlpha();
452
453 void fillBufferWithPremultiplyAlpha();
454
455 void fillRedBufferWithoutPremultiplyAlpha();
456
457 void fillBufferWithoutPremultiplyAlpha();
458
Alec Mouriac335532018-11-12 15:01:33 -0800459 void fillGreenColorBufferThenClearRegion();
460
461 void clearLeftRegion();
462
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000463 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800464
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800465 template <typename SourceVariant>
466 void drawShadow(const renderengine::LayerSettings& castingLayer,
467 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
468 const ubyte4& backgroundColor);
469
Alec Mouribd17b3b2020-12-17 11:08:30 -0800470 void drawShadowWithoutCaster(const FloatRect& castingBounds,
471 const renderengine::ShadowSettings& shadow,
472 const ubyte4& backgroundColor);
473
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800474 std::unique_ptr<renderengine::gl::GLESRenderEngine> mRE;
475
Alec Mourid43ccab2019-03-13 12:23:45 -0700476 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to
477 // be freed *after* RenderEngine is destroyed, so that the EGL image is
478 // destroyed first.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800479 sp<GraphicBuffer> mCurrentBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700480
481 sp<GraphicBuffer> mBuffer;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800482
483 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700484};
485
Alec Mouri1089aed2018-10-25 21:33:57 -0700486struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800487 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800488 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700489 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800490 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700491 }
492};
493
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800494struct RelaxOpaqueBufferVariant {
495 static void setOpaqueBit(renderengine::LayerSettings& layer) {
496 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800497 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800498 }
499
500 static uint8_t getAlphaChannel() { return 255; }
501};
502
503struct ForceOpaqueBufferVariant {
504 static void setOpaqueBit(renderengine::LayerSettings& layer) {
505 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800506 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800507 }
508
509 static uint8_t getAlphaChannel() {
510 // The isOpaque bit will override the alpha channel, so this should be
511 // arbitrary.
512 return 10;
513 }
514};
515
516template <typename OpaquenessVariant>
517struct BufferSourceVariant {
518 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800519 RenderEngineTest* fixture) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800520 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1);
521 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800522 fixture->mRE->genTextures(1, &texName);
523 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800524
525 uint8_t* pixels;
526 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
527 reinterpret_cast<void**>(&pixels));
528
529 for (int32_t j = 0; j < buf->getHeight(); j++) {
530 uint8_t* iter = pixels + (buf->getStride() * j) * 4;
531 for (int32_t i = 0; i < buf->getWidth(); i++) {
532 iter[0] = uint8_t(r * 255);
533 iter[1] = uint8_t(g * 255);
534 iter[2] = uint8_t(b * 255);
535 iter[3] = OpaquenessVariant::getAlphaChannel();
536 iter += 4;
537 }
538 }
539
540 buf->unlock();
541
542 layer.source.buffer.buffer = buf;
543 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800544 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800545 OpaquenessVariant::setOpaqueBit(layer);
546 }
547};
548
Alec Mouri1089aed2018-10-25 21:33:57 -0700549template <typename SourceVariant>
550void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
551 renderengine::DisplaySettings settings;
552 settings.physicalDisplay = fullscreenRect();
553 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800554 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700555
Vishnu Nair9b079a22020-01-21 14:36:08 -0800556 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700557
558 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800559 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700560 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800561 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700562 layer.alpha = a;
563
Vishnu Nair9b079a22020-01-21 14:36:08 -0800564 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700565
566 invokeDraw(settings, layers, mBuffer);
567}
568
569template <typename SourceVariant>
570void RenderEngineTest::fillRedBuffer() {
571 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
572 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
573}
574
575template <typename SourceVariant>
576void RenderEngineTest::fillGreenBuffer() {
577 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
578 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
579}
580
581template <typename SourceVariant>
582void RenderEngineTest::fillBlueBuffer() {
583 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
584 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
585}
586
587template <typename SourceVariant>
588void RenderEngineTest::fillRedTransparentBuffer() {
589 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
590 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
591}
592
593template <typename SourceVariant>
594void RenderEngineTest::fillRedOffsetBuffer() {
595 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800596 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700597 settings.physicalDisplay = offsetRect();
598 settings.clip = offsetRectAtZero();
599
Vishnu Nair9b079a22020-01-21 14:36:08 -0800600 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700601
602 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800603 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700604 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800605 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700606 layer.alpha = 1.0f;
607
Vishnu Nair9b079a22020-01-21 14:36:08 -0800608 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700609 invokeDraw(settings, layers, mBuffer);
610}
611
612template <typename SourceVariant>
613void RenderEngineTest::fillBufferPhysicalOffset() {
614 fillRedOffsetBuffer<SourceVariant>();
615
616 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
617 DEFAULT_DISPLAY_HEIGHT),
618 255, 0, 0, 255);
619 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
620 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
621
622 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
623 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
624}
625
626template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700627void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700628 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800629 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700630 settings.physicalDisplay = fullscreenRect();
631 // Here logical space is 2x2
632 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700633 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700634
Vishnu Nair9b079a22020-01-21 14:36:08 -0800635 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700636
637 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800638 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700639 Rect rectOne(0, 0, 1, 1);
640 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800641 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700642 layerOne.alpha = 1.0f;
643
644 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800645 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700646 Rect rectTwo(0, 1, 1, 2);
647 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800648 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700649 layerTwo.alpha = 1.0f;
650
651 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800652 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700653 Rect rectThree(1, 0, 2, 1);
654 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800655 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700656 layerThree.alpha = 1.0f;
657
Vishnu Nair9b079a22020-01-21 14:36:08 -0800658 layers.push_back(&layerOne);
659 layers.push_back(&layerTwo);
660 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700661
662 invokeDraw(settings, layers, mBuffer);
663}
664
665template <typename SourceVariant>
666void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700667 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700668 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
669 255);
670 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
671 DEFAULT_DISPLAY_HEIGHT / 2),
672 0, 0, 255, 255);
673 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
674 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
675 0, 0, 0, 0);
676 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
677 DEFAULT_DISPLAY_HEIGHT),
678 0, 255, 0, 255);
679}
680
681template <typename SourceVariant>
682void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700683 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700684 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
685 255);
686 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
687 DEFAULT_DISPLAY_HEIGHT / 2),
688 255, 0, 0, 255);
689 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
690 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
691 0, 0, 255, 255);
692 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
693 DEFAULT_DISPLAY_HEIGHT),
694 0, 0, 0, 0);
695}
696
697template <typename SourceVariant>
698void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700699 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700700 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
701 0);
702 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
703 DEFAULT_DISPLAY_HEIGHT / 2),
704 0, 255, 0, 255);
705 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
706 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
707 255, 0, 0, 255);
708 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
709 DEFAULT_DISPLAY_HEIGHT),
710 0, 0, 255, 255);
711}
712
713template <typename SourceVariant>
714void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700715 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700716 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
717 255);
718 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
719 DEFAULT_DISPLAY_HEIGHT / 2),
720 0, 0, 0, 0);
721 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
722 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
723 0, 255, 0, 255);
724 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
725 DEFAULT_DISPLAY_HEIGHT),
726 255, 0, 0, 255);
727}
728
729template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800730void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700731 renderengine::DisplaySettings settings;
732 settings.physicalDisplay = fullscreenRect();
733 // Here logical space is 2x2
734 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800735 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700736
Vishnu Nair9b079a22020-01-21 14:36:08 -0800737 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700738
739 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800740 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700741 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
742 // Translate one pixel diagonally
743 layer.geometry.positionTransform = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800744 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700745 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
746 layer.alpha = 1.0f;
747
Vishnu Nair9b079a22020-01-21 14:36:08 -0800748 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700749
750 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800751}
Alec Mouri1089aed2018-10-25 21:33:57 -0700752
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800753template <typename SourceVariant>
754void RenderEngineTest::fillBufferLayerTransform() {
755 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700756 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
757 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
758 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
759 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
760 255, 0, 0, 255);
761}
762
763template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800764void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700765 renderengine::DisplaySettings settings;
766 settings.physicalDisplay = fullscreenRect();
767 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800768 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700769
Vishnu Nair9b079a22020-01-21 14:36:08 -0800770 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700771
772 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800773 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700774 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800775 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700776 layer.alpha = 1.0f;
777
778 // construct a fake color matrix
779 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800780 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700781 // set red channel to red + green
782 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
783
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800784 layer.alpha = 1.0f;
785 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
786
Vishnu Nair9b079a22020-01-21 14:36:08 -0800787 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700788
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800789 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800790}
Alec Mouri1089aed2018-10-25 21:33:57 -0700791
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800792template <typename SourceVariant>
793void RenderEngineTest::fillBufferColorTransform() {
794 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800795 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
796}
797
798template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800799void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
800 renderengine::DisplaySettings settings;
801 settings.physicalDisplay = fullscreenRect();
802 settings.clip = Rect(1, 1);
803
804 std::vector<const renderengine::LayerSettings*> layers;
805
806 renderengine::LayerSettings layer;
807 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
808 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
809 layer.alpha = 0;
810
811 // construct a fake color matrix
812 // simple inverse color
813 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
814
815 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
816
817 layers.push_back(&layer);
818
819 invokeDraw(settings, layers, mBuffer);
820}
821
822template <typename SourceVariant>
823void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
824 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
825 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
826}
827
828template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800829void RenderEngineTest::fillRedBufferWithRoundedCorners() {
830 renderengine::DisplaySettings settings;
831 settings.physicalDisplay = fullscreenRect();
832 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800833 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800834
Vishnu Nair9b079a22020-01-21 14:36:08 -0800835 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800836
837 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800838 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800839 layer.geometry.boundaries = fullscreenRect().toFloatRect();
840 layer.geometry.roundedCornersRadius = 5.0f;
841 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
842 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
843 layer.alpha = 1.0f;
844
Vishnu Nair9b079a22020-01-21 14:36:08 -0800845 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800846
847 invokeDraw(settings, layers, mBuffer);
848}
849
850template <typename SourceVariant>
851void RenderEngineTest::fillBufferWithRoundedCorners() {
852 fillRedBufferWithRoundedCorners<SourceVariant>();
853 // Corners should be ignored...
854 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
855 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
856 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
857 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
858 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
859 0, 0, 0, 0);
860 // ...And the non-rounded portion should be red.
861 // Other pixels may be anti-aliased, so let's not check those.
862 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
863 255);
864}
865
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000866template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800867void RenderEngineTest::fillBufferAndBlurBackground() {
868 char value[PROPERTY_VALUE_MAX];
869 property_get("ro.surface_flinger.supports_background_blur", value, "0");
870 if (!atoi(value)) {
871 // This device doesn't support blurs, no-op.
872 return;
873 }
874
875 auto blurRadius = 50;
876 auto center = DEFAULT_DISPLAY_WIDTH / 2;
877
878 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800879 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800880 settings.physicalDisplay = fullscreenRect();
881 settings.clip = fullscreenRect();
882
Vishnu Nair9b079a22020-01-21 14:36:08 -0800883 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800884
885 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800886 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800887 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
888 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
889 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800890 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800891
892 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800893 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800894 leftLayer.geometry.boundaries =
895 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
896 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
897 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800898 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800899
900 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800901 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800902 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
903 blurLayer.backgroundBlurRadius = blurRadius;
904 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800905 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800906
907 invokeDraw(settings, layers, mBuffer);
908
909 expectBufferColor(Rect(center - 1, center - 5, center, center + 5), 150, 150, 0, 255,
910 50 /* tolerance */);
911 expectBufferColor(Rect(center, center - 5, center + 1, center + 5), 150, 150, 0, 255,
912 50 /* tolerance */);
913}
914
915template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000916void RenderEngineTest::overlayCorners() {
917 renderengine::DisplaySettings settings;
918 settings.physicalDisplay = fullscreenRect();
919 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800920 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000921
Vishnu Nair9b079a22020-01-21 14:36:08 -0800922 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000923
924 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800925 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000926 layerOne.geometry.boundaries =
927 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
928 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
929 layerOne.alpha = 0.2;
930
Vishnu Nair9b079a22020-01-21 14:36:08 -0800931 layersFirst.push_back(&layerOne);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000932 invokeDraw(settings, layersFirst, mBuffer);
933 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
934 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
935 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
936 0, 0, 0, 0);
937
Vishnu Nair9b079a22020-01-21 14:36:08 -0800938 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000939 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800940 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000941 layerTwo.geometry.boundaries =
942 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
943 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
944 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
945 layerTwo.alpha = 1.0f;
946
Vishnu Nair9b079a22020-01-21 14:36:08 -0800947 layersSecond.push_back(&layerTwo);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000948 invokeDraw(settings, layersSecond, mBuffer);
949
950 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
951 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
952 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
953 0, 255, 0, 255);
954}
955
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800956void RenderEngineTest::fillRedBufferTextureTransform() {
957 renderengine::DisplaySettings settings;
958 settings.physicalDisplay = fullscreenRect();
959 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800960 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800961
Vishnu Nair9b079a22020-01-21 14:36:08 -0800962 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800963
964 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800965 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800966 // Here will allocate a checker board texture, but transform texture
967 // coordinates so that only the upper left is applied.
968 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2);
969 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800970 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800971 this->mTexNames.push_back(texName);
972
973 uint8_t* pixels;
974 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
975 reinterpret_cast<void**>(&pixels));
976 // Red top left, Green top right, Blue bottom left, Black bottom right
977 pixels[0] = 255;
978 pixels[1] = 0;
979 pixels[2] = 0;
980 pixels[3] = 255;
981 pixels[4] = 0;
982 pixels[5] = 255;
983 pixels[6] = 0;
984 pixels[7] = 255;
985 pixels[8] = 0;
986 pixels[9] = 0;
987 pixels[10] = 255;
988 pixels[11] = 255;
989 buf->unlock();
990
991 layer.source.buffer.buffer = buf;
992 layer.source.buffer.textureName = texName;
993 // Transform coordinates to only be inside the red quadrant.
994 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
995 layer.alpha = 1.0f;
996 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
997
Vishnu Nair9b079a22020-01-21 14:36:08 -0800998 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800999
1000 invokeDraw(settings, layers, mBuffer);
1001}
1002
1003void RenderEngineTest::fillBufferTextureTransform() {
1004 fillRedBufferTextureTransform();
1005 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1006}
1007
1008void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1009 renderengine::DisplaySettings settings;
1010 settings.physicalDisplay = fullscreenRect();
1011 // Here logical space is 1x1
1012 settings.clip = Rect(1, 1);
1013
Vishnu Nair9b079a22020-01-21 14:36:08 -08001014 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001015
1016 renderengine::LayerSettings layer;
1017 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1018 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001019 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001020 this->mTexNames.push_back(texName);
1021
1022 uint8_t* pixels;
1023 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1024 reinterpret_cast<void**>(&pixels));
1025 pixels[0] = 255;
1026 pixels[1] = 0;
1027 pixels[2] = 0;
1028 pixels[3] = 255;
1029 buf->unlock();
1030
1031 layer.source.buffer.buffer = buf;
1032 layer.source.buffer.textureName = texName;
1033 layer.source.buffer.usePremultipliedAlpha = true;
1034 layer.alpha = 0.5f;
1035 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1036
Vishnu Nair9b079a22020-01-21 14:36:08 -08001037 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001038
1039 invokeDraw(settings, layers, mBuffer);
1040}
1041
1042void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1043 fillRedBufferWithPremultiplyAlpha();
1044 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1045}
1046
1047void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1048 renderengine::DisplaySettings settings;
1049 settings.physicalDisplay = fullscreenRect();
1050 // Here logical space is 1x1
1051 settings.clip = Rect(1, 1);
1052
Vishnu Nair9b079a22020-01-21 14:36:08 -08001053 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001054
1055 renderengine::LayerSettings layer;
1056 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1057 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001058 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001059 this->mTexNames.push_back(texName);
1060
1061 uint8_t* pixels;
1062 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1063 reinterpret_cast<void**>(&pixels));
1064 pixels[0] = 255;
1065 pixels[1] = 0;
1066 pixels[2] = 0;
1067 pixels[3] = 255;
1068 buf->unlock();
1069
1070 layer.source.buffer.buffer = buf;
1071 layer.source.buffer.textureName = texName;
1072 layer.source.buffer.usePremultipliedAlpha = false;
1073 layer.alpha = 0.5f;
1074 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1075
Vishnu Nair9b079a22020-01-21 14:36:08 -08001076 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001077
1078 invokeDraw(settings, layers, mBuffer);
1079}
1080
1081void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1082 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001083 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001084}
1085
Alec Mouriac335532018-11-12 15:01:33 -08001086void RenderEngineTest::clearLeftRegion() {
1087 renderengine::DisplaySettings settings;
1088 settings.physicalDisplay = fullscreenRect();
1089 // Here logical space is 4x4
1090 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001091 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001092 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001093 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001094 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001095 layers.push_back(&layer);
Alec Mouriac335532018-11-12 15:01:33 -08001096 invokeDraw(settings, layers, mBuffer);
1097}
1098
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001099void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001100 // Reuse mBuffer
1101 clearLeftRegion();
1102 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1103 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1104 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001105 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001106}
1107
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001108template <typename SourceVariant>
1109void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1110 const renderengine::ShadowSettings& shadow,
1111 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1112 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001113 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001114 settings.physicalDisplay = fullscreenRect();
1115 settings.clip = fullscreenRect();
1116
Vishnu Nair9b079a22020-01-21 14:36:08 -08001117 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001118
1119 // add background layer
1120 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001121 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001122 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1123 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1124 backgroundColor.b / 255.0f, this);
1125 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001126 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001127
1128 // add shadow layer
1129 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001130 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001131 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1132 shadowLayer.alpha = castingLayer.alpha;
1133 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001134 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001135
1136 // add layer casting the shadow
1137 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001138 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001139 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1140 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001141 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001142
1143 invokeDraw(settings, layers, mBuffer);
1144}
1145
Alec Mouribd17b3b2020-12-17 11:08:30 -08001146void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1147 const renderengine::ShadowSettings& shadow,
1148 const ubyte4& backgroundColor) {
1149 renderengine::DisplaySettings settings;
1150 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1151 settings.physicalDisplay = fullscreenRect();
1152 settings.clip = fullscreenRect();
1153
1154 std::vector<const renderengine::LayerSettings*> layers;
1155
1156 // add background layer
1157 renderengine::LayerSettings bgLayer;
1158 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1159 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1160 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1161 backgroundColor.b / 255.0f, this);
1162 bgLayer.alpha = backgroundColor.a / 255.0f;
1163 layers.push_back(&bgLayer);
1164
1165 // add shadow layer
1166 renderengine::LayerSettings shadowLayer;
1167 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1168 shadowLayer.geometry.boundaries = castingBounds;
1169 shadowLayer.alpha = 1.0f;
1170 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1171 shadowLayer.shadow = shadow;
1172 layers.push_back(&shadowLayer);
1173
1174 invokeDraw(settings, layers, mBuffer);
1175}
1176
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001177INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001178 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001179 std::make_shared<GLESCMRenderEngineFactory>(),
1180 std::make_shared<SkiaGLESRenderEngineFactory>(),
1181 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001182
1183TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
1184 const auto& renderEngineFactory = GetParam();
1185 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001186 drawEmptyLayers();
1187}
1188
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001189TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
1190 const auto& renderEngineFactory = GetParam();
1191 mRE = renderEngineFactory->createRenderEngine();
1192
Alec Mourid43ccab2019-03-13 12:23:45 -07001193 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001194 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001195 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001196 renderengine::LayerSettings layer;
1197 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1198 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001199 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001200 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001201 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001202
1203 ASSERT_EQ(BAD_VALUE, status);
1204}
1205
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001206TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
1207 const auto& renderEngineFactory = GetParam();
1208 mRE = renderEngineFactory->createRenderEngine();
1209
Alec Mourid43ccab2019-03-13 12:23:45 -07001210 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001211 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001212 settings.physicalDisplay = fullscreenRect();
1213 settings.clip = fullscreenRect();
1214
Vishnu Nair9b079a22020-01-21 14:36:08 -08001215 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001216 renderengine::LayerSettings layer;
1217 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1218 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1219 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001220 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001221
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001222 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
1223 mCurrentBuffer = mBuffer;
Alec Mourid43ccab2019-03-13 12:23:45 -07001224 ASSERT_EQ(NO_ERROR, status);
1225 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1226}
1227
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001228TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1229 const auto& renderEngineFactory = GetParam();
1230 mRE = renderEngineFactory->createRenderEngine();
1231
Alec Mourife0d72b2019-03-21 14:05:56 -07001232 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001233 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001234 settings.physicalDisplay = fullscreenRect();
1235 settings.clip = fullscreenRect();
1236
Vishnu Nair9b079a22020-01-21 14:36:08 -08001237 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001238 renderengine::LayerSettings layer;
1239 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1240 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1241 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001242 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001243
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001244 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
1245 mCurrentBuffer = mBuffer;
Alec Mourife0d72b2019-03-21 14:05:56 -07001246 ASSERT_EQ(NO_ERROR, status);
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001247 ASSERT_FALSE(mRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001248 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1249}
1250
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001251TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
1252 const auto& renderEngineFactory = GetParam();
1253 mRE = renderEngineFactory->createRenderEngine();
1254
Alec Mouri1089aed2018-10-25 21:33:57 -07001255 fillRedBuffer<ColorSourceVariant>();
1256}
1257
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001258TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
1259 const auto& renderEngineFactory = GetParam();
1260 mRE = renderEngineFactory->createRenderEngine();
1261
Alec Mouri1089aed2018-10-25 21:33:57 -07001262 fillGreenBuffer<ColorSourceVariant>();
1263}
1264
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001265TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
1266 const auto& renderEngineFactory = GetParam();
1267 mRE = renderEngineFactory->createRenderEngine();
1268
Alec Mouri1089aed2018-10-25 21:33:57 -07001269 fillBlueBuffer<ColorSourceVariant>();
1270}
1271
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001272TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
1273 const auto& renderEngineFactory = GetParam();
1274 mRE = renderEngineFactory->createRenderEngine();
1275
Alec Mouri1089aed2018-10-25 21:33:57 -07001276 fillRedTransparentBuffer<ColorSourceVariant>();
1277}
1278
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001279TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
1280 const auto& renderEngineFactory = GetParam();
1281 mRE = renderEngineFactory->createRenderEngine();
1282
Alec Mouri1089aed2018-10-25 21:33:57 -07001283 fillBufferPhysicalOffset<ColorSourceVariant>();
1284}
1285
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001286TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
1287 const auto& renderEngineFactory = GetParam();
1288 mRE = renderEngineFactory->createRenderEngine();
1289
Alec Mouri1089aed2018-10-25 21:33:57 -07001290 fillBufferCheckersRotate0<ColorSourceVariant>();
1291}
1292
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001293TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
1294 const auto& renderEngineFactory = GetParam();
1295 mRE = renderEngineFactory->createRenderEngine();
1296
Alec Mouri1089aed2018-10-25 21:33:57 -07001297 fillBufferCheckersRotate90<ColorSourceVariant>();
1298}
1299
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001300TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
1301 const auto& renderEngineFactory = GetParam();
1302 mRE = renderEngineFactory->createRenderEngine();
1303
Alec Mouri1089aed2018-10-25 21:33:57 -07001304 fillBufferCheckersRotate180<ColorSourceVariant>();
1305}
1306
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001307TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
1308 const auto& renderEngineFactory = GetParam();
1309 mRE = renderEngineFactory->createRenderEngine();
1310
Alec Mouri1089aed2018-10-25 21:33:57 -07001311 fillBufferCheckersRotate270<ColorSourceVariant>();
1312}
1313
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001314TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
1315 const auto& renderEngineFactory = GetParam();
1316 mRE = renderEngineFactory->createRenderEngine();
1317
Alec Mouri1089aed2018-10-25 21:33:57 -07001318 fillBufferLayerTransform<ColorSourceVariant>();
1319}
1320
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001321TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
1322 const auto& renderEngineFactory = GetParam();
1323 mRE = renderEngineFactory->createRenderEngine();
1324
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001325 fillBufferColorTransform<ColorSourceVariant>();
1326}
1327
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001328TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
1329 const auto& renderEngineFactory = GetParam();
1330 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri6e57f682018-09-29 20:45:08 -07001331
Alec Mouri7c94edb2018-12-03 21:23:26 -08001332 fillBufferWithRoundedCorners<ColorSourceVariant>();
1333}
1334
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001335TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
1336 const auto& renderEngineFactory = GetParam();
1337 mRE = renderEngineFactory->createRenderEngine();
1338
1339 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1340}
1341
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
1343 const auto& renderEngineFactory = GetParam();
1344 mRE = renderEngineFactory->createRenderEngine();
1345
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001346 fillBufferAndBlurBackground<ColorSourceVariant>();
1347}
1348
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001349TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
1350 const auto& renderEngineFactory = GetParam();
1351 mRE = renderEngineFactory->createRenderEngine();
1352
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001353 overlayCorners<ColorSourceVariant>();
1354}
1355
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001356TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
1357 const auto& renderEngineFactory = GetParam();
1358 mRE = renderEngineFactory->createRenderEngine();
1359
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001360 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1361}
1362
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001363TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
1364 const auto& renderEngineFactory = GetParam();
1365 mRE = renderEngineFactory->createRenderEngine();
1366
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001367 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1368}
1369
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001370TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
1371 const auto& renderEngineFactory = GetParam();
1372 mRE = renderEngineFactory->createRenderEngine();
1373
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001374 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1375}
1376
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001377TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
1378 const auto& renderEngineFactory = GetParam();
1379 mRE = renderEngineFactory->createRenderEngine();
1380
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001381 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1382}
1383
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001384TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
1385 const auto& renderEngineFactory = GetParam();
1386 mRE = renderEngineFactory->createRenderEngine();
1387
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001388 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1389}
1390
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001391TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
1392 const auto& renderEngineFactory = GetParam();
1393 mRE = renderEngineFactory->createRenderEngine();
1394
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001395 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1396}
1397
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001398TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
1399 const auto& renderEngineFactory = GetParam();
1400 mRE = renderEngineFactory->createRenderEngine();
1401
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001402 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1403}
1404
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001405TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
1406 const auto& renderEngineFactory = GetParam();
1407 mRE = renderEngineFactory->createRenderEngine();
1408
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001409 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
1413 const auto& renderEngineFactory = GetParam();
1414 mRE = renderEngineFactory->createRenderEngine();
1415
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001416 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1417}
1418
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001419TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
1420 const auto& renderEngineFactory = GetParam();
1421 mRE = renderEngineFactory->createRenderEngine();
1422
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001423 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1424}
1425
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
1427 const auto& renderEngineFactory = GetParam();
1428 mRE = renderEngineFactory->createRenderEngine();
1429
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001430 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1431}
1432
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001433TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
1434 const auto& renderEngineFactory = GetParam();
1435 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001436
Alec Mouri7c94edb2018-12-03 21:23:26 -08001437 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1438}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001439TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1440 const auto& renderEngineFactory = GetParam();
1441 mRE = renderEngineFactory->createRenderEngine();
1442
1443 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1444}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001445
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001446TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
1447 const auto& renderEngineFactory = GetParam();
1448 mRE = renderEngineFactory->createRenderEngine();
1449
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001450 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1451}
1452
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001453TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
1454 const auto& renderEngineFactory = GetParam();
1455 mRE = renderEngineFactory->createRenderEngine();
1456
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001457 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1458}
1459
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001460TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
1461 const auto& renderEngineFactory = GetParam();
1462 mRE = renderEngineFactory->createRenderEngine();
1463
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001464 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1465}
1466
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001467TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
1468 const auto& renderEngineFactory = GetParam();
1469 mRE = renderEngineFactory->createRenderEngine();
1470
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001471 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1472}
1473
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001474TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
1475 const auto& renderEngineFactory = GetParam();
1476 mRE = renderEngineFactory->createRenderEngine();
1477
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001478 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1479}
1480
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001481TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
1482 const auto& renderEngineFactory = GetParam();
1483 mRE = renderEngineFactory->createRenderEngine();
1484
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001485 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1486}
1487
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001488TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
1489 const auto& renderEngineFactory = GetParam();
1490 mRE = renderEngineFactory->createRenderEngine();
1491
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001492 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1493}
1494
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001495TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
1496 const auto& renderEngineFactory = GetParam();
1497 mRE = renderEngineFactory->createRenderEngine();
1498
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
1503 const auto& renderEngineFactory = GetParam();
1504 mRE = renderEngineFactory->createRenderEngine();
1505
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001506 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1507}
1508
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001509TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
1510 const auto& renderEngineFactory = GetParam();
1511 mRE = renderEngineFactory->createRenderEngine();
1512
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001513 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1514}
1515
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001516TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
1517 const auto& renderEngineFactory = GetParam();
1518 mRE = renderEngineFactory->createRenderEngine();
1519
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001520 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1521}
1522
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001523TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
1524 const auto& renderEngineFactory = GetParam();
1525 mRE = renderEngineFactory->createRenderEngine();
1526
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001527 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1528}
1529
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001530TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
1531 const auto& renderEngineFactory = GetParam();
1532 mRE = renderEngineFactory->createRenderEngine();
1533
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001534 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1535}
1536
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001537TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
1538 const auto& renderEngineFactory = GetParam();
1539 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001540
Alec Mouri7c94edb2018-12-03 21:23:26 -08001541 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1542}
1543
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001544TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
1545 const auto& renderEngineFactory = GetParam();
1546 mRE = renderEngineFactory->createRenderEngine();
1547
1548 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1549}
1550
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001551TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
1552 const auto& renderEngineFactory = GetParam();
1553 mRE = renderEngineFactory->createRenderEngine();
1554
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001555 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1556}
1557
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001558TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
1559 const auto& renderEngineFactory = GetParam();
1560 mRE = renderEngineFactory->createRenderEngine();
1561
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001562 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1563}
1564
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001565TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
1566 const auto& renderEngineFactory = GetParam();
1567 mRE = renderEngineFactory->createRenderEngine();
1568
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001569 fillBufferTextureTransform();
1570}
1571
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001572TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
1573 const auto& renderEngineFactory = GetParam();
1574 mRE = renderEngineFactory->createRenderEngine();
1575
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001576 fillBufferWithPremultiplyAlpha();
1577}
1578
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001579TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
1580 const auto& renderEngineFactory = GetParam();
1581 mRE = renderEngineFactory->createRenderEngine();
1582
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001583 fillBufferWithoutPremultiplyAlpha();
1584}
1585
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001586TEST_P(RenderEngineTest, drawLayers_clearRegion) {
1587 const auto& renderEngineFactory = GetParam();
1588 mRE = renderEngineFactory->createRenderEngine();
1589
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001590 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001591}
1592
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001593TEST_P(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) {
1594 const auto& renderEngineFactory = GetParam();
1595 mRE = renderEngineFactory->createRenderEngine();
1596
Alec Mourid43ccab2019-03-13 12:23:45 -07001597 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001598 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001599 settings.physicalDisplay = fullscreenRect();
1600 settings.clip = fullscreenRect();
1601
Vishnu Nair9b079a22020-01-21 14:36:08 -08001602 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001603
1604 renderengine::LayerSettings layer;
1605 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1606 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1607
Vishnu Nair9b079a22020-01-21 14:36:08 -08001608 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001609 invokeDraw(settings, layers, mBuffer);
1610 uint64_t bufferId = layer.source.buffer.buffer->getId();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001611 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001612 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001613 mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001614 std::lock_guard<std::mutex> lock(barrier->mutex);
1615 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1616 [&]() REQUIRES(barrier->mutex) {
1617 return barrier->isOpen;
1618 }));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001619 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001620 EXPECT_EQ(NO_ERROR, barrier->result);
Alec Mourid43ccab2019-03-13 12:23:45 -07001621}
1622
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001623TEST_P(RenderEngineTest, cacheExternalBuffer_withNullBuffer) {
1624 const auto& renderEngineFactory = GetParam();
1625 mRE = renderEngineFactory->createRenderEngine();
1626
Alec Mouri16a99402019-07-29 16:37:30 -07001627 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001628 mRE->cacheExternalTextureBufferForTesting(nullptr);
Alec Mouri16a99402019-07-29 16:37:30 -07001629 std::lock_guard<std::mutex> lock(barrier->mutex);
1630 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1631 [&]() REQUIRES(barrier->mutex) {
1632 return barrier->isOpen;
1633 }));
1634 EXPECT_TRUE(barrier->isOpen);
1635 EXPECT_EQ(BAD_VALUE, barrier->result);
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001636}
1637
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001638TEST_P(RenderEngineTest, cacheExternalBuffer_cachesImages) {
1639 const auto& renderEngineFactory = GetParam();
1640 mRE = renderEngineFactory->createRenderEngine();
1641
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001642 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1643 uint64_t bufferId = buf->getId();
Alec Mouri16a99402019-07-29 16:37:30 -07001644 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001645 mRE->cacheExternalTextureBufferForTesting(buf);
Alec Mouri16a99402019-07-29 16:37:30 -07001646 {
1647 std::lock_guard<std::mutex> lock(barrier->mutex);
1648 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1649 [&]() REQUIRES(barrier->mutex) {
1650 return barrier->isOpen;
1651 }));
1652 EXPECT_EQ(NO_ERROR, barrier->result);
1653 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001654 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1655 barrier = mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001656 {
1657 std::lock_guard<std::mutex> lock(barrier->mutex);
1658 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1659 [&]() REQUIRES(barrier->mutex) {
1660 return barrier->isOpen;
1661 }));
1662 EXPECT_EQ(NO_ERROR, barrier->result);
1663 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001664 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001665}
1666
Alec Mouribd17b3b2020-12-17 11:08:30 -08001667TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
1668 const auto& renderEngineFactory = GetParam();
1669 mRE = renderEngineFactory->createRenderEngine();
1670
1671 const ubyte4 backgroundColor(255, 255, 255, 255);
1672 const float shadowLength = 5.0f;
1673 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1674 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1675 renderengine::ShadowSettings settings =
1676 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1677 false /* casterIsTranslucent */);
1678
1679 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1680 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1681}
1682
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001683TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
1684 const auto& renderEngineFactory = GetParam();
1685 mRE = renderEngineFactory->createRenderEngine();
1686
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001687 const ubyte4 casterColor(255, 0, 0, 255);
1688 const ubyte4 backgroundColor(255, 255, 255, 255);
1689 const float shadowLength = 5.0f;
1690 Rect casterBounds(1, 1);
1691 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1692 renderengine::LayerSettings castingLayer;
1693 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1694 castingLayer.alpha = 1.0f;
1695 renderengine::ShadowSettings settings =
1696 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1697 false /* casterIsTranslucent */);
1698
1699 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1700 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1701}
1702
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001703TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
1704 const auto& renderEngineFactory = GetParam();
1705 mRE = renderEngineFactory->createRenderEngine();
1706
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001707 const ubyte4 casterColor(255, 0, 0, 255);
1708 const ubyte4 backgroundColor(255, 255, 255, 255);
1709 const float shadowLength = 5.0f;
1710 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1711 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1712 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001713 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001714 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1715 castingLayer.alpha = 1.0f;
1716 renderengine::ShadowSettings settings =
1717 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1718 false /* casterIsTranslucent */);
1719
1720 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1721 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1722}
1723
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001724TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
1725 const auto& renderEngineFactory = GetParam();
1726 mRE = renderEngineFactory->createRenderEngine();
1727
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001728 const ubyte4 casterColor(255, 0, 0, 255);
1729 const ubyte4 backgroundColor(255, 255, 255, 255);
1730 const float shadowLength = 5.0f;
1731 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1732 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1733 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001734 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001735 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1736 castingLayer.alpha = 1.0f;
1737 renderengine::ShadowSettings settings =
1738 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1739 false /* casterIsTranslucent */);
1740
1741 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1742 backgroundColor);
1743 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1744}
1745
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001746TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
1747 const auto& renderEngineFactory = GetParam();
1748 mRE = renderEngineFactory->createRenderEngine();
1749
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001750 const ubyte4 casterColor(255, 0, 0, 255);
1751 const ubyte4 backgroundColor(255, 255, 255, 255);
1752 const float shadowLength = 5.0f;
1753 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1754 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1755 renderengine::LayerSettings castingLayer;
1756 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1757 castingLayer.geometry.roundedCornersRadius = 3.0f;
1758 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1759 castingLayer.alpha = 1.0f;
1760 renderengine::ShadowSettings settings =
1761 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1762 false /* casterIsTranslucent */);
1763
1764 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1765 backgroundColor);
1766 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1767}
1768
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001769TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
1770 const auto& renderEngineFactory = GetParam();
1771 mRE = renderEngineFactory->createRenderEngine();
1772
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001773 const ubyte4 casterColor(255, 0, 0, 255);
1774 const ubyte4 backgroundColor(255, 255, 255, 255);
1775 const float shadowLength = 5.0f;
1776 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1777 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1778 renderengine::LayerSettings castingLayer;
1779 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1780 castingLayer.alpha = 0.5f;
1781 renderengine::ShadowSettings settings =
1782 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1783 true /* casterIsTranslucent */);
1784
1785 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1786 backgroundColor);
1787
1788 // verify only the background since the shadow will draw behind the caster
1789 const float shadowInset = settings.length * -1.0f;
1790 const Rect casterWithShadow =
1791 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1792 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1793 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1794 backgroundColor.a);
1795}
1796
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001797TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1798 const auto& renderEngineFactory = GetParam();
1799 mRE = renderEngineFactory->createRenderEngine();
1800
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001801 renderengine::DisplaySettings settings;
1802 settings.physicalDisplay = fullscreenRect();
1803 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001804 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001805
1806 std::vector<const renderengine::LayerSettings*> layers;
1807 renderengine::LayerSettings layer;
1808 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1809 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1810 layer.alpha = 1.0;
1811 layers.push_back(&layer);
1812
1813 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001814 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001815 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001816 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001817
1818 const int fd = fenceTwo.get();
1819 if (fd >= 0) {
1820 sync_wait(fd, -1);
1821 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001822 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001823 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001824 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001825 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001826 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1827}
1828
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001829TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1830 const auto& renderEngineFactory = GetParam();
1831 mRE = renderEngineFactory->createRenderEngine();
1832
Alec Mouri368e1582020-08-13 10:14:29 -07001833 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001834 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001835 settings.physicalDisplay = fullscreenRect();
1836 settings.clip = fullscreenRect();
1837
1838 std::vector<const renderengine::LayerSettings*> layers;
1839 renderengine::LayerSettings layer;
1840 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1841 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1842 layer.alpha = 1.0;
1843 layers.push_back(&layer);
1844
1845 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001846 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001847
1848 const int fd = fence.get();
1849 if (fd >= 0) {
1850 sync_wait(fd, -1);
1851 }
1852
1853 uint64_t bufferId = layer.source.buffer.buffer->getId();
1854 uint32_t texName = layer.source.buffer.textureName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001855 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1856 EXPECT_EQ(bufferId, mRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001857
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001858 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001859
1860 // Now check that our view of memory is good.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001861 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
1862 EXPECT_EQ(std::nullopt, mRE->getBufferIdForTextureNameForTesting(bufferId));
1863 EXPECT_TRUE(mRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001864}
1865
Ana Krulecf9a15d92020-12-11 08:35:00 -08001866TEST_P(RenderEngineTest, testRoundedCornersCrop) {
1867 const auto& renderEngineFactory = GetParam();
1868 mRE = renderEngineFactory->createRenderEngine();
1869
1870 renderengine::DisplaySettings settings;
1871 settings.physicalDisplay = fullscreenRect();
1872 settings.clip = fullscreenRect();
1873 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1874
1875 std::vector<const renderengine::LayerSettings*> layers;
1876
1877 renderengine::LayerSettings redLayer;
1878 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1879 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1880 redLayer.geometry.roundedCornersRadius = 5.0f;
1881 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1882 // Red background.
1883 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1884 redLayer.alpha = 1.0f;
1885
1886 layers.push_back(&redLayer);
1887
1888 // Green layer with 1/3 size.
1889 renderengine::LayerSettings greenLayer;
1890 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1891 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1892 greenLayer.geometry.roundedCornersRadius = 5.0f;
1893 // Bottom right corner is not going to be rounded.
1894 greenLayer.geometry.roundedCornersCrop =
1895 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1896 DEFAULT_DISPLAY_HEIGHT)
1897 .toFloatRect();
1898 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1899 greenLayer.alpha = 1.0f;
1900
1901 layers.push_back(&greenLayer);
1902
1903 invokeDraw(settings, layers, mBuffer);
1904
1905 // Corners should be ignored...
1906 // Screen size: width is 128, height is 256.
1907 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1908 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1909 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1910 // Bottom right corner is kept out of the clipping, and it's green.
1911 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1912 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1913 0, 255, 0, 255);
1914}
1915
Alec Mouri6e57f682018-09-29 20:45:08 -07001916} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001917
1918// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001919#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"