blob: dfab6e8cd232024f6470a8aaee6394cf5fc2f7ee [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
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080025#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080026#include <gtest/gtest.h>
Alec Mouria90a5702021-04-16 16:36:21 +000027#include <renderengine/ExternalTexture.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070028#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070029#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070030#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080031
32#include <chrono>
33#include <condition_variable>
34#include <fstream>
35
Alec Mourid43ccab2019-03-13 12:23:45 -070036#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080037#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080038#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070039
Alec Mouri1089aed2018-10-25 21:33:57 -070040constexpr int DEFAULT_DISPLAY_WIDTH = 128;
41constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
42constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080043constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070044
Alec Mouri6e57f682018-09-29 20:45:08 -070045namespace android {
46
Ana Krulec82ba2ec2020-11-21 13:33:20 -080047class RenderEngineFactory {
48public:
49 virtual ~RenderEngineFactory() = default;
50
51 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080052 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
53 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
54 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
55 return nullptr;
56 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040057 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -080058};
59
60class GLESRenderEngineFactory : public RenderEngineFactory {
61public:
62 std::string name() override { return "GLESRenderEngineFactory"; }
63
Alec Mouric0aae732021-01-12 13:32:18 -080064 renderengine::RenderEngine::RenderEngineType type() {
65 return renderengine::RenderEngine::RenderEngineType::GLES;
66 }
67
68 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
69 return createGLESRenderEngine();
70 }
71
72 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080073 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070074 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080075 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
76 .setImageCacheSize(1)
77 .setUseColorManagerment(false)
78 .setEnableProtectedContext(false)
79 .setPrecacheToneMapperShaderOnly(false)
80 .setSupportsBackgroundBlur(true)
81 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080082 .setRenderEngineType(type())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080083 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080084 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070085 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040086
87 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080088};
Alec Mourid43ccab2019-03-13 12:23:45 -070089
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080090class GLESCMRenderEngineFactory : public RenderEngineFactory {
91public:
92 std::string name() override { return "GLESCMRenderEngineFactory"; }
93
Alec Mouric0aae732021-01-12 13:32:18 -080094 renderengine::RenderEngine::RenderEngineType type() {
95 return renderengine::RenderEngine::RenderEngineType::GLES;
96 }
97
98 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
99 return createGLESRenderEngine();
100 }
101
102 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800103 renderengine::RenderEngineCreationArgs reCreationArgs =
104 renderengine::RenderEngineCreationArgs::Builder()
105 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
106 .setImageCacheSize(1)
107 .setEnableProtectedContext(false)
108 .setPrecacheToneMapperShaderOnly(false)
109 .setSupportsBackgroundBlur(true)
110 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800111 .setRenderEngineType(type())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800112 .setUseColorManagerment(true)
113 .build();
114 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
115 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400116
117 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800118};
119
Alec Mouri0eab3e82020-12-08 18:10:27 -0800120class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
121public:
Alec Mouric0aae732021-01-12 13:32:18 -0800122 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800123
Alec Mouric0aae732021-01-12 13:32:18 -0800124 renderengine::RenderEngine::RenderEngineType type() {
125 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
126 }
127
128 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800129 renderengine::RenderEngineCreationArgs reCreationArgs =
130 renderengine::RenderEngineCreationArgs::Builder()
131 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
132 .setImageCacheSize(1)
133 .setEnableProtectedContext(false)
134 .setPrecacheToneMapperShaderOnly(false)
135 .setSupportsBackgroundBlur(true)
136 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800137 .setRenderEngineType(type())
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400138 // FIXME (b/189935602): This version is currently color managed.
139 // We should change it and fix the tests that fail.
140 //.setUseColorManagerment(false)
Alec Mouri0eab3e82020-12-08 18:10:27 -0800141 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800142 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800143 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400144
145 // FIXME (b/189935602): This version is currently color managed.
146 // We should change it and fix the tests that fail.
147 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800148};
149
150class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
151public:
Alec Mouric0aae732021-01-12 13:32:18 -0800152 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800153
Alec Mouric0aae732021-01-12 13:32:18 -0800154 renderengine::RenderEngine::RenderEngineType type() {
155 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
156 }
157
158 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800159 renderengine::RenderEngineCreationArgs reCreationArgs =
160 renderengine::RenderEngineCreationArgs::Builder()
161 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
162 .setImageCacheSize(1)
163 .setEnableProtectedContext(false)
164 .setPrecacheToneMapperShaderOnly(false)
165 .setSupportsBackgroundBlur(true)
166 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800167 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800168 .setUseColorManagerment(true)
169 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800170 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800171 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400172
173 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800174};
175
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800176class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
177public:
Alec Mouria90a5702021-04-16 16:36:21 +0000178 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
179 return std::make_shared<
180 renderengine::
181 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
182 DEFAULT_DISPLAY_HEIGHT,
183 HAL_PIXEL_FORMAT_RGBA_8888, 1,
184 GRALLOC_USAGE_SW_READ_OFTEN |
185 GRALLOC_USAGE_SW_WRITE_OFTEN |
186 GRALLOC_USAGE_HW_RENDER |
187 GRALLOC_USAGE_HW_TEXTURE,
188 "output"),
189 *mRE,
190 renderengine::ExternalTexture::Usage::READABLE |
191 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700192 }
193
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800194 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000195 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
196 uint32_t height) {
197 return std::make_shared<
198 renderengine::
199 ExternalTexture>(new GraphicBuffer(width, height,
200 HAL_PIXEL_FORMAT_RGBA_8888, 1,
201 GRALLOC_USAGE_SW_READ_OFTEN |
202 GRALLOC_USAGE_SW_WRITE_OFTEN |
203 GRALLOC_USAGE_HW_TEXTURE,
204 "input"),
205 *mRE,
206 renderengine::ExternalTexture::Usage::READABLE |
207 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800208 }
209
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800210 RenderEngineTest() {
211 const ::testing::TestInfo* const test_info =
212 ::testing::UnitTest::GetInstance()->current_test_info();
213 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800214 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700215
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800216 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800217 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
218 writeBufferToFile("/data/texture_out_");
219 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800220 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800221 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800222 if (mGLESRE != nullptr) {
223 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
224 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800225 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800226 const ::testing::TestInfo* const test_info =
227 ::testing::UnitTest::GetInstance()->current_test_info();
228 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800229 }
230
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800231 void writeBufferToFile(const char* basename) {
232 std::string filename(basename);
233 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
234 filename.append(".ppm");
235 std::ofstream file(filename.c_str(), std::ios::binary);
236 if (!file.is_open()) {
237 ALOGE("Unable to open file: %s", filename.c_str());
238 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
239 "surfaceflinger to write debug images");
240 return;
241 }
242
Alec Mouri1089aed2018-10-25 21:33:57 -0700243 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000244 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
245 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700246
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800247 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000248 file << mBuffer->getBuffer()->getWidth() << "\n";
249 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800250 file << 255 << "\n";
251
Alec Mouria90a5702021-04-16 16:36:21 +0000252 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
253 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800254 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
255
Alec Mouria90a5702021-04-16 16:36:21 +0000256 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
257 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
258 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800259 // Only copy R, G and B components
260 outPtr[0] = src[0];
261 outPtr[1] = src[1];
262 outPtr[2] = src[2];
263 outPtr += 3;
264
265 src += 4;
266 }
267 }
268 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000269 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800270 }
271
272 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
273 size_t c;
274 Rect const* rect = region.getArray(&c);
275 for (size_t i = 0; i < c; i++, rect++) {
276 expectBufferColor(*rect, r, g, b, a);
277 }
278 }
279
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400280 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
281 uint8_t tolerance = 0) {
282 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
283 }
284
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800285 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
286 uint8_t tolerance = 0) {
287 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
288 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
289 uint8_t tmp = a >= b ? a - b : b - a;
290 return tmp <= tolerance;
291 };
292 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700293 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800294
295 expectBufferColor(rect, r, g, b, a, colorCompare);
296 }
297
298 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
299 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
300 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000301 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
302 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700303 int32_t maxFails = 10;
304 int32_t fails = 0;
305 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000306 const uint8_t* src = pixels +
307 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700308 for (int32_t i = 0; i < region.getWidth(); i++) {
309 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800310 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700311 EXPECT_TRUE(equal)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400312 << GetParam()->name().c_str() << ": "
Alec Mouri1089aed2018-10-25 21:33:57 -0700313 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
314 << "expected (" << static_cast<uint32_t>(r) << ", "
315 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
316 << static_cast<uint32_t>(a) << "), "
317 << "got (" << static_cast<uint32_t>(src[0]) << ", "
318 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
319 << ", " << static_cast<uint32_t>(src[3]) << ")";
320 src += 4;
321 if (!equal && ++fails >= maxFails) {
322 break;
323 }
324 }
325 if (fails >= maxFails) {
326 break;
327 }
328 }
Alec Mouria90a5702021-04-16 16:36:21 +0000329 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700330 }
331
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800332 void expectAlpha(const Rect& rect, uint8_t a) {
333 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
334 return colorA[3] == colorB[3];
335 };
336 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
337 }
338
339 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
340 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
341 const ubyte4& backgroundColor) {
342 const Rect casterRect(castingLayer.geometry.boundaries);
343 Region casterRegion = Region(casterRect);
344 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
345 if (casterCornerRadius > 0.0f) {
346 // ignore the corners if a corner radius is set
347 Rect cornerRect(casterCornerRadius, casterCornerRadius);
348 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
349 casterRegion.subtractSelf(
350 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
351 casterRegion.subtractSelf(
352 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
353 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
354 casterRect.bottom - casterCornerRadius));
355 }
356
357 const float shadowInset = shadow.length * -1.0f;
358 const Rect casterWithShadow =
359 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
360 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
361 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
362
363 // verify casting layer
364 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
365
366 // verify shadows by testing just the alpha since its difficult to validate the shadow color
367 size_t c;
368 Rect const* r = shadowRegion.getArray(&c);
369 for (size_t i = 0; i < c; i++, r++) {
370 expectAlpha(*r, 255);
371 }
372
373 // verify background
374 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
375 backgroundColor.a);
376 }
377
Alec Mouribd17b3b2020-12-17 11:08:30 -0800378 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
379 const renderengine::ShadowSettings& shadow,
380 const ubyte4& backgroundColor) {
381 const float shadowInset = shadow.length * -1.0f;
382 const Rect casterRect(casterBounds);
383 const Rect shadowRect =
384 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
385
386 const Region backgroundRegion =
387 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
388
389 expectAlpha(shadowRect, 255);
390 // (0, 0, 0) fill on the bounds of the layer should be ignored.
391 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
392
393 // verify background
394 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
395 backgroundColor.a);
396 }
397
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800398 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
399 bool casterIsTranslucent) {
400 renderengine::ShadowSettings shadow;
401 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
402 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
403 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
404 shadow.lightRadius = 0.0f;
405 shadow.length = shadowLength;
406 shadow.casterIsTranslucent = casterIsTranslucent;
407 return shadow;
408 }
409
Alec Mouri1089aed2018-10-25 21:33:57 -0700410 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
411
412 static Rect offsetRect() {
413 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
414 DEFAULT_DISPLAY_HEIGHT);
415 }
416
417 static Rect offsetRectAtZero() {
418 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
419 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
420 }
421
Alec Mourid43ccab2019-03-13 12:23:45 -0700422 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800423 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700424 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800425 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800426 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700427
428 int fd = fence.release();
429 if (fd >= 0) {
430 sync_wait(fd, -1);
431 close(fd);
432 }
433
434 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800435 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000436 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700437 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700438 }
439
Alec Mourid43ccab2019-03-13 12:23:45 -0700440 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700441 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800442 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800443 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700444 }
445
Alec Mouri1089aed2018-10-25 21:33:57 -0700446 template <typename SourceVariant>
447 void fillBuffer(half r, half g, half b, half a);
448
449 template <typename SourceVariant>
450 void fillRedBuffer();
451
452 template <typename SourceVariant>
453 void fillGreenBuffer();
454
455 template <typename SourceVariant>
456 void fillBlueBuffer();
457
458 template <typename SourceVariant>
459 void fillRedTransparentBuffer();
460
461 template <typename SourceVariant>
462 void fillRedOffsetBuffer();
463
464 template <typename SourceVariant>
465 void fillBufferPhysicalOffset();
466
467 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700468 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700469
470 template <typename SourceVariant>
471 void fillBufferCheckersRotate0();
472
473 template <typename SourceVariant>
474 void fillBufferCheckersRotate90();
475
476 template <typename SourceVariant>
477 void fillBufferCheckersRotate180();
478
479 template <typename SourceVariant>
480 void fillBufferCheckersRotate270();
481
482 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800483 void fillBufferWithLayerTransform();
484
485 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700486 void fillBufferLayerTransform();
487
488 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800489 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800490
491 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700492 void fillBufferColorTransform();
493
Alec Mouri7c94edb2018-12-03 21:23:26 -0800494 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800495 void fillBufferWithColorTransformZeroLayerAlpha();
496
497 template <typename SourceVariant>
498 void fillBufferColorTransformZeroLayerAlpha();
499
500 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800501 void fillRedBufferWithRoundedCorners();
502
503 template <typename SourceVariant>
504 void fillBufferWithRoundedCorners();
505
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000506 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800507 void fillBufferAndBlurBackground();
508
509 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700510 void fillSmallLayerAndBlurBackground();
511
512 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000513 void overlayCorners();
514
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800515 void fillRedBufferTextureTransform();
516
517 void fillBufferTextureTransform();
518
519 void fillRedBufferWithPremultiplyAlpha();
520
521 void fillBufferWithPremultiplyAlpha();
522
523 void fillRedBufferWithoutPremultiplyAlpha();
524
525 void fillBufferWithoutPremultiplyAlpha();
526
Alec Mouriac335532018-11-12 15:01:33 -0800527 void fillGreenColorBufferThenClearRegion();
528
529 void clearLeftRegion();
530
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000531 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800532
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800533 template <typename SourceVariant>
534 void drawShadow(const renderengine::LayerSettings& castingLayer,
535 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
536 const ubyte4& backgroundColor);
537
Alec Mouribd17b3b2020-12-17 11:08:30 -0800538 void drawShadowWithoutCaster(const FloatRect& castingBounds,
539 const renderengine::ShadowSettings& shadow,
540 const ubyte4& backgroundColor);
541
Alec Mouric0aae732021-01-12 13:32:18 -0800542 void initializeRenderEngine();
543
544 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000545 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800546 // GLESRenderEngine for testing GLES-specific behavior.
547 // Owened by mRE, but this is downcasted.
548 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800549
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800550 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700551};
552
Alec Mouric0aae732021-01-12 13:32:18 -0800553void RenderEngineTest::initializeRenderEngine() {
554 const auto& renderEngineFactory = GetParam();
555 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
556 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
557 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
558 // every time.
559 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
560 renderEngineFactory->createGLESRenderEngine();
561 mGLESRE = renderEngine.get();
562 mRE = std::move(renderEngine);
563 } else {
564 mRE = renderEngineFactory->createRenderEngine();
565 }
Alec Mouria90a5702021-04-16 16:36:21 +0000566 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800567}
568
Alec Mouri1089aed2018-10-25 21:33:57 -0700569struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800570 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800571 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700572 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800573 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700574 }
575};
576
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800577struct RelaxOpaqueBufferVariant {
578 static void setOpaqueBit(renderengine::LayerSettings& layer) {
579 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800580 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800581 }
582
583 static uint8_t getAlphaChannel() { return 255; }
584};
585
586struct ForceOpaqueBufferVariant {
587 static void setOpaqueBit(renderengine::LayerSettings& layer) {
588 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800589 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800590 }
591
592 static uint8_t getAlphaChannel() {
593 // The isOpaque bit will override the alpha channel, so this should be
594 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800595 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800596 }
597};
598
599template <typename OpaquenessVariant>
600struct BufferSourceVariant {
601 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800602 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000603 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800604 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800605 fixture->mRE->genTextures(1, &texName);
606 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800607
608 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000609 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
610 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800611
Alec Mouria90a5702021-04-16 16:36:21 +0000612 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
613 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
614 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800615 iter[0] = uint8_t(r * 255);
616 iter[1] = uint8_t(g * 255);
617 iter[2] = uint8_t(b * 255);
618 iter[3] = OpaquenessVariant::getAlphaChannel();
619 iter += 4;
620 }
621 }
622
Alec Mouria90a5702021-04-16 16:36:21 +0000623 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800624
625 layer.source.buffer.buffer = buf;
626 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800627 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800628 OpaquenessVariant::setOpaqueBit(layer);
629 }
630};
631
Alec Mouri1089aed2018-10-25 21:33:57 -0700632template <typename SourceVariant>
633void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
634 renderengine::DisplaySettings settings;
635 settings.physicalDisplay = fullscreenRect();
636 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800637 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700638
Vishnu Nair9b079a22020-01-21 14:36:08 -0800639 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700640
641 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800642 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700643 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800644 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700645 layer.alpha = a;
646
Vishnu Nair9b079a22020-01-21 14:36:08 -0800647 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700648
Alec Mouric0aae732021-01-12 13:32:18 -0800649 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700650}
651
652template <typename SourceVariant>
653void RenderEngineTest::fillRedBuffer() {
654 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
655 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
656}
657
658template <typename SourceVariant>
659void RenderEngineTest::fillGreenBuffer() {
660 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
661 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
662}
663
664template <typename SourceVariant>
665void RenderEngineTest::fillBlueBuffer() {
666 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
667 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
668}
669
670template <typename SourceVariant>
671void RenderEngineTest::fillRedTransparentBuffer() {
672 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
673 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
674}
675
676template <typename SourceVariant>
677void RenderEngineTest::fillRedOffsetBuffer() {
678 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800679 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700680 settings.physicalDisplay = offsetRect();
681 settings.clip = offsetRectAtZero();
682
Vishnu Nair9b079a22020-01-21 14:36:08 -0800683 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700684
685 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800686 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700687 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800688 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700689 layer.alpha = 1.0f;
690
Vishnu Nair9b079a22020-01-21 14:36:08 -0800691 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800692 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700693}
694
695template <typename SourceVariant>
696void RenderEngineTest::fillBufferPhysicalOffset() {
697 fillRedOffsetBuffer<SourceVariant>();
698
699 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
700 DEFAULT_DISPLAY_HEIGHT),
701 255, 0, 0, 255);
702 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
703 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
704
705 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
706 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
707}
708
709template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700710void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700711 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800712 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700713 settings.physicalDisplay = fullscreenRect();
714 // Here logical space is 2x2
715 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700716 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700717
Vishnu Nair9b079a22020-01-21 14:36:08 -0800718 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700719
720 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800721 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700722 Rect rectOne(0, 0, 1, 1);
723 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800724 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700725 layerOne.alpha = 1.0f;
726
727 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800728 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700729 Rect rectTwo(0, 1, 1, 2);
730 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800731 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700732 layerTwo.alpha = 1.0f;
733
734 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800735 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700736 Rect rectThree(1, 0, 2, 1);
737 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800738 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700739 layerThree.alpha = 1.0f;
740
Vishnu Nair9b079a22020-01-21 14:36:08 -0800741 layers.push_back(&layerOne);
742 layers.push_back(&layerTwo);
743 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700744
Alec Mouric0aae732021-01-12 13:32:18 -0800745 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700746}
747
748template <typename SourceVariant>
749void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700750 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700751 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
752 255);
753 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
754 DEFAULT_DISPLAY_HEIGHT / 2),
755 0, 0, 255, 255);
756 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
757 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
758 0, 0, 0, 0);
759 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
760 DEFAULT_DISPLAY_HEIGHT),
761 0, 255, 0, 255);
762}
763
764template <typename SourceVariant>
765void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700766 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700767 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
768 255);
769 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
770 DEFAULT_DISPLAY_HEIGHT / 2),
771 255, 0, 0, 255);
772 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
773 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
774 0, 0, 255, 255);
775 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
776 DEFAULT_DISPLAY_HEIGHT),
777 0, 0, 0, 0);
778}
779
780template <typename SourceVariant>
781void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700782 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700783 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
784 0);
785 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
786 DEFAULT_DISPLAY_HEIGHT / 2),
787 0, 255, 0, 255);
788 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
789 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
790 255, 0, 0, 255);
791 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
792 DEFAULT_DISPLAY_HEIGHT),
793 0, 0, 255, 255);
794}
795
796template <typename SourceVariant>
797void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700798 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700799 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
800 255);
801 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
802 DEFAULT_DISPLAY_HEIGHT / 2),
803 0, 0, 0, 0);
804 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
805 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
806 0, 255, 0, 255);
807 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
808 DEFAULT_DISPLAY_HEIGHT),
809 255, 0, 0, 255);
810}
811
812template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800813void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700814 renderengine::DisplaySettings settings;
815 settings.physicalDisplay = fullscreenRect();
816 // Here logical space is 2x2
817 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800818 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700819
Vishnu Nair9b079a22020-01-21 14:36:08 -0800820 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700821
822 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800823 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700824 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
825 // Translate one pixel diagonally
826 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 -0800827 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700828 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
829 layer.alpha = 1.0f;
830
Vishnu Nair9b079a22020-01-21 14:36:08 -0800831 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700832
Alec Mouric0aae732021-01-12 13:32:18 -0800833 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800834}
Alec Mouri1089aed2018-10-25 21:33:57 -0700835
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800836template <typename SourceVariant>
837void RenderEngineTest::fillBufferLayerTransform() {
838 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700839 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
840 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
841 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
842 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
843 255, 0, 0, 255);
844}
845
846template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800847void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700848 renderengine::DisplaySettings settings;
849 settings.physicalDisplay = fullscreenRect();
850 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800851 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700852
Vishnu Nair9b079a22020-01-21 14:36:08 -0800853 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700854
855 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800856 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700857 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800858 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700859 layer.alpha = 1.0f;
860
861 // construct a fake color matrix
862 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800863 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700864 // set red channel to red + green
865 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
866
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800867 layer.alpha = 1.0f;
868 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
869
Vishnu Nair9b079a22020-01-21 14:36:08 -0800870 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700871
Alec Mouric0aae732021-01-12 13:32:18 -0800872 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800873}
Alec Mouri1089aed2018-10-25 21:33:57 -0700874
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800875template <typename SourceVariant>
876void RenderEngineTest::fillBufferColorTransform() {
877 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800878 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
879}
880
881template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800882void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
883 renderengine::DisplaySettings settings;
884 settings.physicalDisplay = fullscreenRect();
885 settings.clip = Rect(1, 1);
886
887 std::vector<const renderengine::LayerSettings*> layers;
888
889 renderengine::LayerSettings layer;
890 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
891 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
892 layer.alpha = 0;
893
894 // construct a fake color matrix
895 // simple inverse color
896 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
897
898 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
899
900 layers.push_back(&layer);
901
Alec Mouric0aae732021-01-12 13:32:18 -0800902 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800903}
904
905template <typename SourceVariant>
906void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
907 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
908 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
909}
910
911template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800912void RenderEngineTest::fillRedBufferWithRoundedCorners() {
913 renderengine::DisplaySettings settings;
914 settings.physicalDisplay = fullscreenRect();
915 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800916 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800917
Vishnu Nair9b079a22020-01-21 14:36:08 -0800918 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800919
920 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800921 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800922 layer.geometry.boundaries = fullscreenRect().toFloatRect();
923 layer.geometry.roundedCornersRadius = 5.0f;
924 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
925 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
926 layer.alpha = 1.0f;
927
Vishnu Nair9b079a22020-01-21 14:36:08 -0800928 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800929
Alec Mouric0aae732021-01-12 13:32:18 -0800930 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800931}
932
933template <typename SourceVariant>
934void RenderEngineTest::fillBufferWithRoundedCorners() {
935 fillRedBufferWithRoundedCorners<SourceVariant>();
936 // Corners should be ignored...
937 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
938 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
939 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
940 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
941 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
942 0, 0, 0, 0);
943 // ...And the non-rounded portion should be red.
944 // Other pixels may be anti-aliased, so let's not check those.
945 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
946 255);
947}
948
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000949template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800950void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800951 auto blurRadius = 50;
952 auto center = DEFAULT_DISPLAY_WIDTH / 2;
953
954 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800955 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800956 settings.physicalDisplay = fullscreenRect();
957 settings.clip = fullscreenRect();
958
Vishnu Nair9b079a22020-01-21 14:36:08 -0800959 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960
961 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800962 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800963 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
964 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
965 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800966 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800967
968 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800969 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800970 leftLayer.geometry.boundaries =
971 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
972 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
973 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800974 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800975
976 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800977 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800978 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
979 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500980 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800981 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800982 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800983
Alec Mouric0aae732021-01-12 13:32:18 -0800984 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800985
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500986 // solid color
987 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
988
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500989 if (mRE->supportsBackgroundBlur()) {
990 // blurred color (downsampling should result in the center color being close to 128)
991 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400992 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500993 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800994}
995
996template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700997void RenderEngineTest::fillSmallLayerAndBlurBackground() {
998 auto blurRadius = 50;
999 renderengine::DisplaySettings settings;
1000 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1001 settings.physicalDisplay = fullscreenRect();
1002 settings.clip = fullscreenRect();
1003
1004 std::vector<const renderengine::LayerSettings*> layers;
1005
1006 renderengine::LayerSettings backgroundLayer;
1007 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1008 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1009 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1010 backgroundLayer.alpha = 1.0f;
1011 layers.push_back(&backgroundLayer);
1012
1013 renderengine::LayerSettings blurLayer;
1014 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1015 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1016 blurLayer.backgroundBlurRadius = blurRadius;
1017 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1018 blurLayer.alpha = 0;
1019 layers.push_back(&blurLayer);
1020
1021 invokeDraw(settings, layers);
1022
1023 // Give a generous tolerance - the blur rectangle is very small and this test is
1024 // mainly concerned with ensuring that there's no device failure.
1025 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1026 40 /* tolerance */);
1027}
1028
1029template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001030void RenderEngineTest::overlayCorners() {
1031 renderengine::DisplaySettings settings;
1032 settings.physicalDisplay = fullscreenRect();
1033 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001034 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001035
Vishnu Nair9b079a22020-01-21 14:36:08 -08001036 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001037
1038 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001039 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001040 layerOne.geometry.boundaries =
1041 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1042 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1043 layerOne.alpha = 0.2;
1044
Vishnu Nair9b079a22020-01-21 14:36:08 -08001045 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001046 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001047 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1048 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1049 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1050 0, 0, 0, 0);
1051
Vishnu Nair9b079a22020-01-21 14:36:08 -08001052 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001053 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001054 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001055 layerTwo.geometry.boundaries =
1056 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1057 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1058 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1059 layerTwo.alpha = 1.0f;
1060
Vishnu Nair9b079a22020-01-21 14:36:08 -08001061 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001062 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001063
1064 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1065 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1066 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1067 0, 255, 0, 255);
1068}
1069
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070void RenderEngineTest::fillRedBufferTextureTransform() {
1071 renderengine::DisplaySettings settings;
1072 settings.physicalDisplay = fullscreenRect();
1073 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001074 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001075
Vishnu Nair9b079a22020-01-21 14:36:08 -08001076 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001077
1078 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001079 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001080 // Here will allocate a checker board texture, but transform texture
1081 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001082 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001083 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001084 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001085 this->mTexNames.push_back(texName);
1086
1087 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001088 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1089 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001090 // Red top left, Green top right, Blue bottom left, Black bottom right
1091 pixels[0] = 255;
1092 pixels[1] = 0;
1093 pixels[2] = 0;
1094 pixels[3] = 255;
1095 pixels[4] = 0;
1096 pixels[5] = 255;
1097 pixels[6] = 0;
1098 pixels[7] = 255;
1099 pixels[8] = 0;
1100 pixels[9] = 0;
1101 pixels[10] = 255;
1102 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001103 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001104
1105 layer.source.buffer.buffer = buf;
1106 layer.source.buffer.textureName = texName;
1107 // Transform coordinates to only be inside the red quadrant.
1108 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1109 layer.alpha = 1.0f;
1110 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1111
Vishnu Nair9b079a22020-01-21 14:36:08 -08001112 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001113
Alec Mouric0aae732021-01-12 13:32:18 -08001114 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001115}
1116
1117void RenderEngineTest::fillBufferTextureTransform() {
1118 fillRedBufferTextureTransform();
1119 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1120}
1121
1122void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1123 renderengine::DisplaySettings settings;
1124 settings.physicalDisplay = fullscreenRect();
1125 // Here logical space is 1x1
1126 settings.clip = Rect(1, 1);
1127
Vishnu Nair9b079a22020-01-21 14:36:08 -08001128 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001129
1130 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001131 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001132 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001133 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001134 this->mTexNames.push_back(texName);
1135
1136 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001137 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1138 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001139 pixels[0] = 255;
1140 pixels[1] = 0;
1141 pixels[2] = 0;
1142 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001143 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001144
1145 layer.source.buffer.buffer = buf;
1146 layer.source.buffer.textureName = texName;
1147 layer.source.buffer.usePremultipliedAlpha = true;
1148 layer.alpha = 0.5f;
1149 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1150
Vishnu Nair9b079a22020-01-21 14:36:08 -08001151 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001152
Alec Mouric0aae732021-01-12 13:32:18 -08001153 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001154}
1155
1156void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1157 fillRedBufferWithPremultiplyAlpha();
1158 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1159}
1160
1161void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1162 renderengine::DisplaySettings settings;
1163 settings.physicalDisplay = fullscreenRect();
1164 // Here logical space is 1x1
1165 settings.clip = Rect(1, 1);
1166
Vishnu Nair9b079a22020-01-21 14:36:08 -08001167 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001168
1169 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001170 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001171 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001172 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001173 this->mTexNames.push_back(texName);
1174
1175 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001176 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1177 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001178 pixels[0] = 255;
1179 pixels[1] = 0;
1180 pixels[2] = 0;
1181 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001182 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001183
1184 layer.source.buffer.buffer = buf;
1185 layer.source.buffer.textureName = texName;
1186 layer.source.buffer.usePremultipliedAlpha = false;
1187 layer.alpha = 0.5f;
1188 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1189
Vishnu Nair9b079a22020-01-21 14:36:08 -08001190 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001191
Alec Mouric0aae732021-01-12 13:32:18 -08001192 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001193}
1194
1195void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1196 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001197 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001198}
1199
Alec Mouriac335532018-11-12 15:01:33 -08001200void RenderEngineTest::clearLeftRegion() {
1201 renderengine::DisplaySettings settings;
1202 settings.physicalDisplay = fullscreenRect();
1203 // Here logical space is 4x4
1204 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001205 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001206 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001207 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001208 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001209 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001210 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001211}
1212
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001213void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001214 // Reuse mBuffer
1215 clearLeftRegion();
1216 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1217 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1218 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001219 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001220}
1221
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001222template <typename SourceVariant>
1223void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1224 const renderengine::ShadowSettings& shadow,
1225 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1226 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001227 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001228 settings.physicalDisplay = fullscreenRect();
1229 settings.clip = fullscreenRect();
1230
Vishnu Nair9b079a22020-01-21 14:36:08 -08001231 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001232
1233 // add background layer
1234 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001235 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001236 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1237 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1238 backgroundColor.b / 255.0f, this);
1239 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001240 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001241
1242 // add shadow layer
1243 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001244 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001245 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1246 shadowLayer.alpha = castingLayer.alpha;
1247 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001248 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001249
1250 // add layer casting the shadow
1251 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001252 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001253 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1254 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001255 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001256
Alec Mouric0aae732021-01-12 13:32:18 -08001257 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001258}
1259
Alec Mouribd17b3b2020-12-17 11:08:30 -08001260void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1261 const renderengine::ShadowSettings& shadow,
1262 const ubyte4& backgroundColor) {
1263 renderengine::DisplaySettings settings;
1264 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1265 settings.physicalDisplay = fullscreenRect();
1266 settings.clip = fullscreenRect();
1267
1268 std::vector<const renderengine::LayerSettings*> layers;
1269
1270 // add background layer
1271 renderengine::LayerSettings bgLayer;
1272 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1273 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1274 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1275 backgroundColor.b / 255.0f, this);
1276 bgLayer.alpha = backgroundColor.a / 255.0f;
1277 layers.push_back(&bgLayer);
1278
1279 // add shadow layer
1280 renderengine::LayerSettings shadowLayer;
1281 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1282 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001283 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001284 shadowLayer.alpha = 1.0f;
1285 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1286 shadowLayer.shadow = shadow;
1287 layers.push_back(&shadowLayer);
1288
Alec Mouric0aae732021-01-12 13:32:18 -08001289 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001290}
1291
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001292INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001293 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001294 std::make_shared<GLESCMRenderEngineFactory>(),
1295 std::make_shared<SkiaGLESRenderEngineFactory>(),
1296 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001297
1298TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001299 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001300 drawEmptyLayers();
1301}
1302
Ana Krulec07b98df2021-01-07 14:38:40 -08001303TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001304 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001305
1306 renderengine::DisplaySettings settings;
1307 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1308 settings.physicalDisplay = fullscreenRect();
1309 settings.clip = fullscreenRect();
1310
1311 // 255, 255, 255, 255 is full opaque white.
1312 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1313 // Create layer with given color.
1314 renderengine::LayerSettings bgLayer;
1315 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1316 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1317 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1318 backgroundColor.b / 255.0f);
1319 bgLayer.alpha = backgroundColor.a / 255.0f;
1320 // Transform the red color.
1321 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1322
1323 std::vector<const renderengine::LayerSettings*> layers;
1324 layers.push_back(&bgLayer);
1325
Alec Mouric0aae732021-01-12 13:32:18 -08001326 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001327
1328 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001329 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001330 backgroundColor.a);
1331}
1332
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001333TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001334 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001335
Alec Mourid43ccab2019-03-13 12:23:45 -07001336 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001337 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001338 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001339 renderengine::LayerSettings layer;
1340 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1341 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001342 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001343 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001344 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001345
1346 ASSERT_EQ(BAD_VALUE, status);
1347}
1348
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001349TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001350 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001351
Alec Mourid43ccab2019-03-13 12:23:45 -07001352 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001353 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001354 settings.physicalDisplay = fullscreenRect();
1355 settings.clip = fullscreenRect();
1356
Vishnu Nair9b079a22020-01-21 14:36:08 -08001357 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001358 renderengine::LayerSettings layer;
1359 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1360 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1361 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001362 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001363
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001364 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001365 ASSERT_EQ(NO_ERROR, status);
1366 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1367}
1368
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001369TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1370 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001371
1372 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1373 // GLES-specific test
1374 return;
1375 }
1376
1377 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001378
Alec Mourife0d72b2019-03-21 14:05:56 -07001379 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001380 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001381 settings.physicalDisplay = fullscreenRect();
1382 settings.clip = fullscreenRect();
1383
Vishnu Nair9b079a22020-01-21 14:36:08 -08001384 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001385 renderengine::LayerSettings layer;
1386 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1387 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1388 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001389 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001390
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001391 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001392 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001393 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001394 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1395}
1396
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001397TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001398 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001399 fillRedBuffer<ColorSourceVariant>();
1400}
1401
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001402TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001403 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001404 fillGreenBuffer<ColorSourceVariant>();
1405}
1406
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001407TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001408 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001409 fillBlueBuffer<ColorSourceVariant>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001413 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001414 fillRedTransparentBuffer<ColorSourceVariant>();
1415}
1416
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001417TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001418 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001419 fillBufferPhysicalOffset<ColorSourceVariant>();
1420}
1421
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001422TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001423 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001424 fillBufferCheckersRotate0<ColorSourceVariant>();
1425}
1426
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001427TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001428 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001429 fillBufferCheckersRotate90<ColorSourceVariant>();
1430}
1431
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001432TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001433 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001434 fillBufferCheckersRotate180<ColorSourceVariant>();
1435}
1436
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001437TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001438 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001439 fillBufferCheckersRotate270<ColorSourceVariant>();
1440}
1441
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001442TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001443 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001444 fillBufferLayerTransform<ColorSourceVariant>();
1445}
1446
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001447TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001448 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001449 fillBufferColorTransform<ColorSourceVariant>();
1450}
1451
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001452TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001453 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001454 fillBufferWithRoundedCorners<ColorSourceVariant>();
1455}
1456
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001457TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001458 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001459 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1460}
1461
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001462TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001463 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001464 fillBufferAndBlurBackground<ColorSourceVariant>();
1465}
1466
Alec Mourie8489fd2021-04-29 16:08:56 -07001467TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1468 initializeRenderEngine();
1469 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1470}
1471
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001472TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001473 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001474 overlayCorners<ColorSourceVariant>();
1475}
1476
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001477TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001478 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001479 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1480}
1481
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001482TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001484 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001489 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001509 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001514 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1515}
1516
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001518 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001519 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1520}
1521
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001522TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001523 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001524 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1525}
1526
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001527TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001528 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001529 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1530}
1531
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001532TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001533 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001534 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1535}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001536
Alec Mouric0aae732021-01-12 13:32:18 -08001537TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1538 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001539 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1540}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001541
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001542TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001543 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001544 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1545}
1546
Alec Mourie8489fd2021-04-29 16:08:56 -07001547TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1548 initializeRenderEngine();
1549 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1550}
1551
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001552TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001553 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001554 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1555}
1556
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001557TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001558 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001559 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1560}
1561
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001562TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001563 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001564 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1565}
1566
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001567TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001568 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001569 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1570}
1571
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001572TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001573 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001574 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1575}
1576
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001577TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001578 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001579 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1580}
1581
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001582TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001583 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001584 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1585}
1586
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001587TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001588 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001589 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1590}
1591
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001592TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001593 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001594 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1595}
1596
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001597TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001598 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001599 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1600}
1601
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001602TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001603 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001604 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1605}
1606
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001607TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001608 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001609 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1610}
1611
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001612TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001613 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001614 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1615}
1616
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001617TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001618 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001619 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1620}
1621
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001622TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001623 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001624 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1625}
1626
Alec Mourie8489fd2021-04-29 16:08:56 -07001627TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1628 initializeRenderEngine();
1629 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1630}
1631
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001632TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001633 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001634 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1635}
1636
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001637TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001638 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001639 fillBufferTextureTransform();
1640}
1641
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001642TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001643 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001644 fillBufferWithPremultiplyAlpha();
1645}
1646
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001647TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001648 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001649 fillBufferWithoutPremultiplyAlpha();
1650}
1651
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001652TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001653 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001654 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001655}
1656
Alec Mouribd17b3b2020-12-17 11:08:30 -08001657TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001658 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001659
1660 const ubyte4 backgroundColor(255, 255, 255, 255);
1661 const float shadowLength = 5.0f;
1662 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1663 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1664 renderengine::ShadowSettings settings =
1665 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1666 false /* casterIsTranslucent */);
1667
1668 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1669 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1670}
1671
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001672TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001673 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001674
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001675 const ubyte4 casterColor(255, 0, 0, 255);
1676 const ubyte4 backgroundColor(255, 255, 255, 255);
1677 const float shadowLength = 5.0f;
1678 Rect casterBounds(1, 1);
1679 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1680 renderengine::LayerSettings castingLayer;
1681 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1682 castingLayer.alpha = 1.0f;
1683 renderengine::ShadowSettings settings =
1684 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1685 false /* casterIsTranslucent */);
1686
1687 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1688 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1689}
1690
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001691TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001692 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001693
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001694 const ubyte4 casterColor(255, 0, 0, 255);
1695 const ubyte4 backgroundColor(255, 255, 255, 255);
1696 const float shadowLength = 5.0f;
1697 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1698 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1699 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001700 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001701 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1702 castingLayer.alpha = 1.0f;
1703 renderengine::ShadowSettings settings =
1704 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1705 false /* casterIsTranslucent */);
1706
1707 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1708 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1709}
1710
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001711TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001712 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001713
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001714 const ubyte4 casterColor(255, 0, 0, 255);
1715 const ubyte4 backgroundColor(255, 255, 255, 255);
1716 const float shadowLength = 5.0f;
1717 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1718 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1719 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001720 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001721 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1722 castingLayer.alpha = 1.0f;
1723 renderengine::ShadowSettings settings =
1724 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1725 false /* casterIsTranslucent */);
1726
1727 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1728 backgroundColor);
1729 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1730}
1731
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001732TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001733 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001734
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001735 const ubyte4 casterColor(255, 0, 0, 255);
1736 const ubyte4 backgroundColor(255, 255, 255, 255);
1737 const float shadowLength = 5.0f;
1738 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1739 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1740 renderengine::LayerSettings castingLayer;
1741 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1742 castingLayer.geometry.roundedCornersRadius = 3.0f;
1743 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1744 castingLayer.alpha = 1.0f;
1745 renderengine::ShadowSettings settings =
1746 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1747 false /* casterIsTranslucent */);
1748
1749 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1750 backgroundColor);
1751 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1752}
1753
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001754TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001755 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001756
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001757 const ubyte4 casterColor(255, 0, 0, 255);
1758 const ubyte4 backgroundColor(255, 255, 255, 255);
1759 const float shadowLength = 5.0f;
1760 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1761 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1762 renderengine::LayerSettings castingLayer;
1763 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1764 castingLayer.alpha = 0.5f;
1765 renderengine::ShadowSettings settings =
1766 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1767 true /* casterIsTranslucent */);
1768
1769 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1770 backgroundColor);
1771
1772 // verify only the background since the shadow will draw behind the caster
1773 const float shadowInset = settings.length * -1.0f;
1774 const Rect casterWithShadow =
1775 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1776 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1777 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1778 backgroundColor.a);
1779}
1780
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001781TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1782 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001783
1784 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1785 // GLES-specific test
1786 return;
1787 }
1788
1789 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001790
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001791 renderengine::DisplaySettings settings;
1792 settings.physicalDisplay = fullscreenRect();
1793 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001794 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001795
1796 std::vector<const renderengine::LayerSettings*> layers;
1797 renderengine::LayerSettings layer;
1798 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1799 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1800 layer.alpha = 1.0;
1801 layers.push_back(&layer);
1802
1803 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001804 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001805 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001806 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001807
1808 const int fd = fenceTwo.get();
1809 if (fd >= 0) {
1810 sync_wait(fd, -1);
1811 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001812 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001813 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001814 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001815 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001816 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1817}
1818
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001819TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1820 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001821
1822 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1823 // GLES-specific test
1824 return;
1825 }
1826
1827 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001828
Alec Mouri368e1582020-08-13 10:14:29 -07001829 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001830 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001831 settings.physicalDisplay = fullscreenRect();
1832 settings.clip = fullscreenRect();
1833
1834 std::vector<const renderengine::LayerSettings*> layers;
1835 renderengine::LayerSettings layer;
1836 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1837 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1838 layer.alpha = 1.0;
1839 layers.push_back(&layer);
1840
1841 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001842 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001843
1844 const int fd = fence.get();
1845 if (fd >= 0) {
1846 sync_wait(fd, -1);
1847 }
1848
Alec Mouria90a5702021-04-16 16:36:21 +00001849 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001850 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001851 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1852 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001853
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001854 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001855
1856 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001857 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1858 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1859 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001860}
1861
Ana Krulecf9a15d92020-12-11 08:35:00 -08001862TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001863 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001864
1865 renderengine::DisplaySettings settings;
1866 settings.physicalDisplay = fullscreenRect();
1867 settings.clip = fullscreenRect();
1868 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1869
1870 std::vector<const renderengine::LayerSettings*> layers;
1871
1872 renderengine::LayerSettings redLayer;
1873 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1874 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1875 redLayer.geometry.roundedCornersRadius = 5.0f;
1876 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1877 // Red background.
1878 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1879 redLayer.alpha = 1.0f;
1880
1881 layers.push_back(&redLayer);
1882
1883 // Green layer with 1/3 size.
1884 renderengine::LayerSettings greenLayer;
1885 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1886 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1887 greenLayer.geometry.roundedCornersRadius = 5.0f;
1888 // Bottom right corner is not going to be rounded.
1889 greenLayer.geometry.roundedCornersCrop =
1890 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1891 DEFAULT_DISPLAY_HEIGHT)
1892 .toFloatRect();
1893 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1894 greenLayer.alpha = 1.0f;
1895
1896 layers.push_back(&greenLayer);
1897
Alec Mouric0aae732021-01-12 13:32:18 -08001898 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001899
1900 // Corners should be ignored...
1901 // Screen size: width is 128, height is 256.
1902 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1903 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1904 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1905 // Bottom right corner is kept out of the clipping, and it's green.
1906 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1907 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1908 0, 255, 0, 255);
1909}
1910
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001911TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1912 initializeRenderEngine();
1913
1914 renderengine::DisplaySettings settings;
1915 settings.physicalDisplay = fullscreenRect();
1916 settings.clip = fullscreenRect();
1917 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1918
1919 std::vector<const renderengine::LayerSettings*> layers;
1920
1921 renderengine::LayerSettings redLayer;
1922 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1923 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1924 redLayer.geometry.roundedCornersRadius = 5.0f;
1925 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1926 // Red background.
1927 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1928 redLayer.alpha = 1.0f;
1929
1930 layers.push_back(&redLayer);
1931
1932 // Green layer with 1/2 size with parent crop rect.
1933 renderengine::LayerSettings greenLayer = redLayer;
1934 greenLayer.geometry.boundaries =
1935 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1936 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1937
1938 layers.push_back(&greenLayer);
1939
1940 invokeDraw(settings, layers);
1941
1942 // Due to roundedCornersRadius, the corners are untouched.
1943 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1944 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1945 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1946 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1947
1948 // top middle should be green and the bottom middle red
1949 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1950 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1951
1952 // the bottom edge of the green layer should not be rounded
1953 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1954}
1955
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001956TEST_P(RenderEngineTest, testClear) {
1957 initializeRenderEngine();
1958
1959 const auto rect = fullscreenRect();
1960 const renderengine::DisplaySettings display{
1961 .physicalDisplay = rect,
1962 .clip = rect,
1963 };
1964
1965 const renderengine::LayerSettings redLayer{
1966 .geometry.boundaries = rect.toFloatRect(),
1967 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1968 .alpha = 1.0f,
1969 };
1970
1971 // This mimics prepareClearClientComposition. This layer should overwrite
1972 // the redLayer, so that the buffer is transparent, rather than red.
1973 const renderengine::LayerSettings clearLayer{
1974 .geometry.boundaries = rect.toFloatRect(),
1975 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1976 .alpha = 0.0f,
1977 .disableBlending = true,
1978 };
1979
1980 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1981 invokeDraw(display, layers);
1982 expectBufferColor(rect, 0, 0, 0, 0);
1983}
1984
1985TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1986 initializeRenderEngine();
1987
1988 const auto rect = Rect(0, 0, 1, 1);
1989 const renderengine::DisplaySettings display{
1990 .physicalDisplay = rect,
1991 .clip = rect,
1992 };
1993
1994 const renderengine::LayerSettings redLayer{
1995 .geometry.boundaries = rect.toFloatRect(),
1996 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1997 .alpha = 1.0f,
1998 };
1999
2000 // The next layer will overwrite redLayer with a GraphicBuffer that is green
2001 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00002002 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002003 {
2004 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00002005 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2006 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002007 pixels[0] = 0;
2008 pixels[1] = 255;
2009 pixels[2] = 0;
2010 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00002011 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002012 }
2013
2014 const renderengine::LayerSettings greenLayer{
2015 .geometry.boundaries = rect.toFloatRect(),
2016 .source =
2017 renderengine::PixelSource{
2018 .buffer =
2019 renderengine::Buffer{
2020 .buffer = buf,
2021 .usePremultipliedAlpha = true,
2022 },
2023 },
2024 .alpha = 0.5f,
2025 .disableBlending = true,
2026 };
2027
2028 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
2029 invokeDraw(display, layers);
2030 expectBufferColor(rect, 0, 128, 0, 128);
2031}
2032
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002033TEST_P(RenderEngineTest, test_isOpaque) {
2034 initializeRenderEngine();
2035
2036 const auto rect = Rect(0, 0, 1, 1);
2037 const renderengine::DisplaySettings display{
2038 .physicalDisplay = rect,
2039 .clip = rect,
2040 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2041 };
2042
2043 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2044 // should make the green show.
2045 const auto buf = allocateSourceBuffer(1, 1);
2046 {
2047 uint8_t* pixels;
2048 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2049 reinterpret_cast<void**>(&pixels));
2050 pixels[0] = 0;
2051 pixels[1] = 255;
2052 pixels[2] = 0;
2053 pixels[3] = 0;
2054 buf->getBuffer()->unlock();
2055 }
2056
2057 const renderengine::LayerSettings greenLayer{
2058 .geometry.boundaries = rect.toFloatRect(),
2059 .source =
2060 renderengine::PixelSource{
2061 .buffer =
2062 renderengine::Buffer{
2063 .buffer = buf,
2064 // Although the pixels are not
2065 // premultiplied in practice, this
2066 // matches the input we see.
2067 .usePremultipliedAlpha = true,
2068 .isOpaque = true,
2069 },
2070 },
2071 .alpha = 1.0f,
2072 };
2073
2074 std::vector<const renderengine::LayerSettings*> layers{&greenLayer};
2075 invokeDraw(display, layers);
2076
2077 if (GetParam()->useColorManagement()) {
2078 expectBufferColor(rect, 117, 251, 76, 255);
2079 } else {
2080 expectBufferColor(rect, 0, 255, 0, 255);
2081 }
2082}
Alec Mouri6e57f682018-09-29 20:45:08 -07002083} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002084
2085// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002086#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"