blob: 33e3773d502c4d026c76b3a2541086790a821fb0 [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 {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040046namespace renderengine {
Alec Mouri6e57f682018-09-29 20:45:08 -070047
Ana Krulec82ba2ec2020-11-21 13:33:20 -080048class RenderEngineFactory {
49public:
50 virtual ~RenderEngineFactory() = default;
51
52 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080053 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
54 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
55 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
56 return nullptr;
57 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040058 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -080059};
60
61class GLESRenderEngineFactory : public RenderEngineFactory {
62public:
63 std::string name() override { return "GLESRenderEngineFactory"; }
64
Alec Mouric0aae732021-01-12 13:32:18 -080065 renderengine::RenderEngine::RenderEngineType type() {
66 return renderengine::RenderEngine::RenderEngineType::GLES;
67 }
68
69 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
70 return createGLESRenderEngine();
71 }
72
73 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080074 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070075 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080076 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
77 .setImageCacheSize(1)
78 .setUseColorManagerment(false)
79 .setEnableProtectedContext(false)
80 .setPrecacheToneMapperShaderOnly(false)
81 .setSupportsBackgroundBlur(true)
82 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080083 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -070084 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080085 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080086 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070087 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040088
89 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080090};
Alec Mourid43ccab2019-03-13 12:23:45 -070091
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080092class GLESCMRenderEngineFactory : public RenderEngineFactory {
93public:
94 std::string name() override { return "GLESCMRenderEngineFactory"; }
95
Alec Mouric0aae732021-01-12 13:32:18 -080096 renderengine::RenderEngine::RenderEngineType type() {
97 return renderengine::RenderEngine::RenderEngineType::GLES;
98 }
99
100 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
101 return createGLESRenderEngine();
102 }
103
104 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800105 renderengine::RenderEngineCreationArgs reCreationArgs =
106 renderengine::RenderEngineCreationArgs::Builder()
107 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
108 .setImageCacheSize(1)
109 .setEnableProtectedContext(false)
110 .setPrecacheToneMapperShaderOnly(false)
111 .setSupportsBackgroundBlur(true)
112 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800113 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700114 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800115 .build();
116 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
117 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400118
119 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800120};
121
Alec Mouri0eab3e82020-12-08 18:10:27 -0800122class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
123public:
Alec Mouric0aae732021-01-12 13:32:18 -0800124 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800125
Alec Mouric0aae732021-01-12 13:32:18 -0800126 renderengine::RenderEngine::RenderEngineType type() {
127 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
128 }
129
130 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800131 renderengine::RenderEngineCreationArgs reCreationArgs =
132 renderengine::RenderEngineCreationArgs::Builder()
133 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
134 .setImageCacheSize(1)
135 .setEnableProtectedContext(false)
136 .setPrecacheToneMapperShaderOnly(false)
137 .setSupportsBackgroundBlur(true)
138 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800139 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700140 .setUseColorManagerment(useColorManagement())
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
Alec Mourid2bcbae2021-06-28 17:02:17 -0700145 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800146};
147
148class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
149public:
Alec Mouric0aae732021-01-12 13:32:18 -0800150 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800151
Alec Mouric0aae732021-01-12 13:32:18 -0800152 renderengine::RenderEngine::RenderEngineType type() {
153 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
154 }
155
156 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800157 renderengine::RenderEngineCreationArgs reCreationArgs =
158 renderengine::RenderEngineCreationArgs::Builder()
159 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
160 .setImageCacheSize(1)
161 .setEnableProtectedContext(false)
162 .setPrecacheToneMapperShaderOnly(false)
163 .setSupportsBackgroundBlur(true)
164 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800165 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700166 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800167 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800168 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800169 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400170
171 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800172};
173
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800174class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
175public:
Alec Mouria90a5702021-04-16 16:36:21 +0000176 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
177 return std::make_shared<
178 renderengine::
179 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
180 DEFAULT_DISPLAY_HEIGHT,
181 HAL_PIXEL_FORMAT_RGBA_8888, 1,
182 GRALLOC_USAGE_SW_READ_OFTEN |
183 GRALLOC_USAGE_SW_WRITE_OFTEN |
184 GRALLOC_USAGE_HW_RENDER |
185 GRALLOC_USAGE_HW_TEXTURE,
186 "output"),
187 *mRE,
188 renderengine::ExternalTexture::Usage::READABLE |
189 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700190 }
191
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800192 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000193 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
194 uint32_t height) {
195 return std::make_shared<
196 renderengine::
197 ExternalTexture>(new GraphicBuffer(width, height,
198 HAL_PIXEL_FORMAT_RGBA_8888, 1,
199 GRALLOC_USAGE_SW_READ_OFTEN |
200 GRALLOC_USAGE_SW_WRITE_OFTEN |
201 GRALLOC_USAGE_HW_TEXTURE,
202 "input"),
203 *mRE,
204 renderengine::ExternalTexture::Usage::READABLE |
205 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800206 }
207
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800208 RenderEngineTest() {
209 const ::testing::TestInfo* const test_info =
210 ::testing::UnitTest::GetInstance()->current_test_info();
211 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800212 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700213
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800214 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800215 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
216 writeBufferToFile("/data/texture_out_");
217 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800218 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800219 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800220 if (mGLESRE != nullptr) {
221 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
222 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800223 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800224 const ::testing::TestInfo* const test_info =
225 ::testing::UnitTest::GetInstance()->current_test_info();
226 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800227 }
228
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800229 void writeBufferToFile(const char* basename) {
230 std::string filename(basename);
231 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
232 filename.append(".ppm");
233 std::ofstream file(filename.c_str(), std::ios::binary);
234 if (!file.is_open()) {
235 ALOGE("Unable to open file: %s", filename.c_str());
236 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
237 "surfaceflinger to write debug images");
238 return;
239 }
240
Alec Mouri1089aed2018-10-25 21:33:57 -0700241 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000242 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
243 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700244
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800245 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000246 file << mBuffer->getBuffer()->getWidth() << "\n";
247 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800248 file << 255 << "\n";
249
Alec Mouria90a5702021-04-16 16:36:21 +0000250 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
251 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800252 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
253
Alec Mouria90a5702021-04-16 16:36:21 +0000254 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
255 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
256 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800257 // Only copy R, G and B components
258 outPtr[0] = src[0];
259 outPtr[1] = src[1];
260 outPtr[2] = src[2];
261 outPtr += 3;
262
263 src += 4;
264 }
265 }
266 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000267 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800268 }
269
270 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
271 size_t c;
272 Rect const* rect = region.getArray(&c);
273 for (size_t i = 0; i < c; i++, rect++) {
274 expectBufferColor(*rect, r, g, b, a);
275 }
276 }
277
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400278 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
279 uint8_t tolerance = 0) {
280 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
281 }
282
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800283 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
284 uint8_t tolerance = 0) {
285 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
286 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
287 uint8_t tmp = a >= b ? a - b : b - a;
288 return tmp <= tolerance;
289 };
290 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700291 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800292
293 expectBufferColor(rect, r, g, b, a, colorCompare);
294 }
295
296 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
297 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
298 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000299 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
300 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700301 int32_t maxFails = 10;
302 int32_t fails = 0;
303 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000304 const uint8_t* src = pixels +
305 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700306 for (int32_t i = 0; i < region.getWidth(); i++) {
307 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800308 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700309 EXPECT_TRUE(equal)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400310 << GetParam()->name().c_str() << ": "
Alec Mouri1089aed2018-10-25 21:33:57 -0700311 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
312 << "expected (" << static_cast<uint32_t>(r) << ", "
313 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
314 << static_cast<uint32_t>(a) << "), "
315 << "got (" << static_cast<uint32_t>(src[0]) << ", "
316 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
317 << ", " << static_cast<uint32_t>(src[3]) << ")";
318 src += 4;
319 if (!equal && ++fails >= maxFails) {
320 break;
321 }
322 }
323 if (fails >= maxFails) {
324 break;
325 }
326 }
Alec Mouria90a5702021-04-16 16:36:21 +0000327 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700328 }
329
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800330 void expectAlpha(const Rect& rect, uint8_t a) {
331 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
332 return colorA[3] == colorB[3];
333 };
334 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
335 }
336
337 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
338 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
339 const ubyte4& backgroundColor) {
340 const Rect casterRect(castingLayer.geometry.boundaries);
341 Region casterRegion = Region(casterRect);
342 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
343 if (casterCornerRadius > 0.0f) {
344 // ignore the corners if a corner radius is set
345 Rect cornerRect(casterCornerRadius, casterCornerRadius);
346 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
347 casterRegion.subtractSelf(
348 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
349 casterRegion.subtractSelf(
350 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
351 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
352 casterRect.bottom - casterCornerRadius));
353 }
354
355 const float shadowInset = shadow.length * -1.0f;
356 const Rect casterWithShadow =
357 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
358 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
359 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
360
361 // verify casting layer
362 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
363
364 // verify shadows by testing just the alpha since its difficult to validate the shadow color
365 size_t c;
366 Rect const* r = shadowRegion.getArray(&c);
367 for (size_t i = 0; i < c; i++, r++) {
368 expectAlpha(*r, 255);
369 }
370
371 // verify background
372 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
373 backgroundColor.a);
374 }
375
Alec Mouribd17b3b2020-12-17 11:08:30 -0800376 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
377 const renderengine::ShadowSettings& shadow,
378 const ubyte4& backgroundColor) {
379 const float shadowInset = shadow.length * -1.0f;
380 const Rect casterRect(casterBounds);
381 const Rect shadowRect =
382 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
383
384 const Region backgroundRegion =
385 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
386
387 expectAlpha(shadowRect, 255);
388 // (0, 0, 0) fill on the bounds of the layer should be ignored.
389 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
390
391 // verify background
392 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
393 backgroundColor.a);
394 }
395
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800396 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
397 bool casterIsTranslucent) {
398 renderengine::ShadowSettings shadow;
399 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
400 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
401 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
402 shadow.lightRadius = 0.0f;
403 shadow.length = shadowLength;
404 shadow.casterIsTranslucent = casterIsTranslucent;
405 return shadow;
406 }
407
Alec Mouri1089aed2018-10-25 21:33:57 -0700408 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
409
410 static Rect offsetRect() {
411 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
412 DEFAULT_DISPLAY_HEIGHT);
413 }
414
415 static Rect offsetRectAtZero() {
416 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
417 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
418 }
419
Alec Mourid43ccab2019-03-13 12:23:45 -0700420 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800421 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700422 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800423 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800424 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700425
426 int fd = fence.release();
427 if (fd >= 0) {
428 sync_wait(fd, -1);
429 close(fd);
430 }
431
432 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800433 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000434 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700435 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700436 }
437
Alec Mourid43ccab2019-03-13 12:23:45 -0700438 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700439 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800440 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800441 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700442 }
443
Alec Mouri1089aed2018-10-25 21:33:57 -0700444 template <typename SourceVariant>
445 void fillBuffer(half r, half g, half b, half a);
446
447 template <typename SourceVariant>
448 void fillRedBuffer();
449
450 template <typename SourceVariant>
451 void fillGreenBuffer();
452
453 template <typename SourceVariant>
454 void fillBlueBuffer();
455
456 template <typename SourceVariant>
457 void fillRedTransparentBuffer();
458
459 template <typename SourceVariant>
460 void fillRedOffsetBuffer();
461
462 template <typename SourceVariant>
463 void fillBufferPhysicalOffset();
464
465 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700466 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700467
468 template <typename SourceVariant>
469 void fillBufferCheckersRotate0();
470
471 template <typename SourceVariant>
472 void fillBufferCheckersRotate90();
473
474 template <typename SourceVariant>
475 void fillBufferCheckersRotate180();
476
477 template <typename SourceVariant>
478 void fillBufferCheckersRotate270();
479
480 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800481 void fillBufferWithLayerTransform();
482
483 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700484 void fillBufferLayerTransform();
485
486 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800487 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800488
489 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700490 void fillBufferColorTransform();
491
Alec Mouri7c94edb2018-12-03 21:23:26 -0800492 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800493 void fillBufferWithColorTransformZeroLayerAlpha();
494
495 template <typename SourceVariant>
496 void fillBufferColorTransformZeroLayerAlpha();
497
498 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800499 void fillRedBufferWithRoundedCorners();
500
501 template <typename SourceVariant>
502 void fillBufferWithRoundedCorners();
503
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000504 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800505 void fillBufferAndBlurBackground();
506
507 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700508 void fillSmallLayerAndBlurBackground();
509
510 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000511 void overlayCorners();
512
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800513 void fillRedBufferTextureTransform();
514
515 void fillBufferTextureTransform();
516
517 void fillRedBufferWithPremultiplyAlpha();
518
519 void fillBufferWithPremultiplyAlpha();
520
521 void fillRedBufferWithoutPremultiplyAlpha();
522
523 void fillBufferWithoutPremultiplyAlpha();
524
Alec Mouriac335532018-11-12 15:01:33 -0800525 void fillGreenColorBufferThenClearRegion();
526
527 void clearLeftRegion();
528
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000529 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800530
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800531 template <typename SourceVariant>
532 void drawShadow(const renderengine::LayerSettings& castingLayer,
533 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
534 const ubyte4& backgroundColor);
535
Alec Mouribd17b3b2020-12-17 11:08:30 -0800536 void drawShadowWithoutCaster(const FloatRect& castingBounds,
537 const renderengine::ShadowSettings& shadow,
538 const ubyte4& backgroundColor);
539
Alec Mouric0aae732021-01-12 13:32:18 -0800540 void initializeRenderEngine();
541
542 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000543 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800544 // GLESRenderEngine for testing GLES-specific behavior.
545 // Owened by mRE, but this is downcasted.
546 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800547
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800548 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700549};
550
Alec Mouric0aae732021-01-12 13:32:18 -0800551void RenderEngineTest::initializeRenderEngine() {
552 const auto& renderEngineFactory = GetParam();
553 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
554 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
555 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
556 // every time.
557 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
558 renderEngineFactory->createGLESRenderEngine();
559 mGLESRE = renderEngine.get();
560 mRE = std::move(renderEngine);
561 } else {
562 mRE = renderEngineFactory->createRenderEngine();
563 }
Alec Mouria90a5702021-04-16 16:36:21 +0000564 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800565}
566
Alec Mouri1089aed2018-10-25 21:33:57 -0700567struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800568 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800569 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700570 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800571 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700572 }
573};
574
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800575struct RelaxOpaqueBufferVariant {
576 static void setOpaqueBit(renderengine::LayerSettings& layer) {
577 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800578 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800579 }
580
581 static uint8_t getAlphaChannel() { return 255; }
582};
583
584struct ForceOpaqueBufferVariant {
585 static void setOpaqueBit(renderengine::LayerSettings& layer) {
586 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800587 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800588 }
589
590 static uint8_t getAlphaChannel() {
591 // The isOpaque bit will override the alpha channel, so this should be
592 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800593 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800594 }
595};
596
597template <typename OpaquenessVariant>
598struct BufferSourceVariant {
599 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800600 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000601 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800602 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800603 fixture->mRE->genTextures(1, &texName);
604 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800605
606 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000607 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
608 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800609
Alec Mouria90a5702021-04-16 16:36:21 +0000610 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
611 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
612 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800613 iter[0] = uint8_t(r * 255);
614 iter[1] = uint8_t(g * 255);
615 iter[2] = uint8_t(b * 255);
616 iter[3] = OpaquenessVariant::getAlphaChannel();
617 iter += 4;
618 }
619 }
620
Alec Mouria90a5702021-04-16 16:36:21 +0000621 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800622
623 layer.source.buffer.buffer = buf;
624 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800625 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800626 OpaquenessVariant::setOpaqueBit(layer);
627 }
628};
629
Alec Mouri1089aed2018-10-25 21:33:57 -0700630template <typename SourceVariant>
631void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
632 renderengine::DisplaySettings settings;
633 settings.physicalDisplay = fullscreenRect();
634 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800635 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700636
Vishnu Nair9b079a22020-01-21 14:36:08 -0800637 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700638
639 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800640 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700641 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800642 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700643 layer.alpha = a;
644
Vishnu Nair9b079a22020-01-21 14:36:08 -0800645 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700646
Alec Mouric0aae732021-01-12 13:32:18 -0800647 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700648}
649
650template <typename SourceVariant>
651void RenderEngineTest::fillRedBuffer() {
652 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
653 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
654}
655
656template <typename SourceVariant>
657void RenderEngineTest::fillGreenBuffer() {
658 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
659 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
660}
661
662template <typename SourceVariant>
663void RenderEngineTest::fillBlueBuffer() {
664 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
665 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
666}
667
668template <typename SourceVariant>
669void RenderEngineTest::fillRedTransparentBuffer() {
670 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
671 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
672}
673
674template <typename SourceVariant>
675void RenderEngineTest::fillRedOffsetBuffer() {
676 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800677 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700678 settings.physicalDisplay = offsetRect();
679 settings.clip = offsetRectAtZero();
680
Vishnu Nair9b079a22020-01-21 14:36:08 -0800681 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700682
683 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800684 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700685 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800686 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700687 layer.alpha = 1.0f;
688
Vishnu Nair9b079a22020-01-21 14:36:08 -0800689 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800690 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700691}
692
693template <typename SourceVariant>
694void RenderEngineTest::fillBufferPhysicalOffset() {
695 fillRedOffsetBuffer<SourceVariant>();
696
697 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
698 DEFAULT_DISPLAY_HEIGHT),
699 255, 0, 0, 255);
700 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
701 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
702
703 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
704 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
705}
706
707template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700708void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700709 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800710 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700711 settings.physicalDisplay = fullscreenRect();
712 // Here logical space is 2x2
713 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700714 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700715
Vishnu Nair9b079a22020-01-21 14:36:08 -0800716 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700717
718 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800719 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700720 Rect rectOne(0, 0, 1, 1);
721 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800722 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700723 layerOne.alpha = 1.0f;
724
725 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800726 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700727 Rect rectTwo(0, 1, 1, 2);
728 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800729 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700730 layerTwo.alpha = 1.0f;
731
732 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800733 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700734 Rect rectThree(1, 0, 2, 1);
735 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800736 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700737 layerThree.alpha = 1.0f;
738
Vishnu Nair9b079a22020-01-21 14:36:08 -0800739 layers.push_back(&layerOne);
740 layers.push_back(&layerTwo);
741 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700742
Alec Mouric0aae732021-01-12 13:32:18 -0800743 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700744}
745
746template <typename SourceVariant>
747void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700748 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700749 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
750 255);
751 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
752 DEFAULT_DISPLAY_HEIGHT / 2),
753 0, 0, 255, 255);
754 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
755 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
756 0, 0, 0, 0);
757 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
758 DEFAULT_DISPLAY_HEIGHT),
759 0, 255, 0, 255);
760}
761
762template <typename SourceVariant>
763void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700764 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700765 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
766 255);
767 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
768 DEFAULT_DISPLAY_HEIGHT / 2),
769 255, 0, 0, 255);
770 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
771 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
772 0, 0, 255, 255);
773 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
774 DEFAULT_DISPLAY_HEIGHT),
775 0, 0, 0, 0);
776}
777
778template <typename SourceVariant>
779void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700780 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700781 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
782 0);
783 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
784 DEFAULT_DISPLAY_HEIGHT / 2),
785 0, 255, 0, 255);
786 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
787 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
788 255, 0, 0, 255);
789 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
790 DEFAULT_DISPLAY_HEIGHT),
791 0, 0, 255, 255);
792}
793
794template <typename SourceVariant>
795void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700796 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700797 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
798 255);
799 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
800 DEFAULT_DISPLAY_HEIGHT / 2),
801 0, 0, 0, 0);
802 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
803 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
804 0, 255, 0, 255);
805 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
806 DEFAULT_DISPLAY_HEIGHT),
807 255, 0, 0, 255);
808}
809
810template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800811void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700812 renderengine::DisplaySettings settings;
813 settings.physicalDisplay = fullscreenRect();
814 // Here logical space is 2x2
815 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800816 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700817
Vishnu Nair9b079a22020-01-21 14:36:08 -0800818 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700819
820 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800821 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700822 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
823 // Translate one pixel diagonally
824 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 -0800825 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700826 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
827 layer.alpha = 1.0f;
828
Vishnu Nair9b079a22020-01-21 14:36:08 -0800829 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700830
Alec Mouric0aae732021-01-12 13:32:18 -0800831 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800832}
Alec Mouri1089aed2018-10-25 21:33:57 -0700833
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800834template <typename SourceVariant>
835void RenderEngineTest::fillBufferLayerTransform() {
836 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700837 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
838 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
839 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
840 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
841 255, 0, 0, 255);
842}
843
844template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800845void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700846 renderengine::DisplaySettings settings;
847 settings.physicalDisplay = fullscreenRect();
848 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800849 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700850
Vishnu Nair9b079a22020-01-21 14:36:08 -0800851 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700852
853 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800854 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700855 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800856 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700857 layer.alpha = 1.0f;
858
859 // construct a fake color matrix
860 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800861 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700862 // set red channel to red + green
863 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
864
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800865 layer.alpha = 1.0f;
866 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
867
Vishnu Nair9b079a22020-01-21 14:36:08 -0800868 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700869
Alec Mouric0aae732021-01-12 13:32:18 -0800870 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800871}
Alec Mouri1089aed2018-10-25 21:33:57 -0700872
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800873template <typename SourceVariant>
874void RenderEngineTest::fillBufferColorTransform() {
875 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800876 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
877}
878
879template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800880void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
881 renderengine::DisplaySettings settings;
882 settings.physicalDisplay = fullscreenRect();
883 settings.clip = Rect(1, 1);
884
885 std::vector<const renderengine::LayerSettings*> layers;
886
887 renderengine::LayerSettings layer;
888 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
889 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
890 layer.alpha = 0;
891
892 // construct a fake color matrix
893 // simple inverse color
894 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
895
896 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
897
898 layers.push_back(&layer);
899
Alec Mouric0aae732021-01-12 13:32:18 -0800900 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800901}
902
903template <typename SourceVariant>
904void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
905 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
906 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
907}
908
909template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800910void RenderEngineTest::fillRedBufferWithRoundedCorners() {
911 renderengine::DisplaySettings settings;
912 settings.physicalDisplay = fullscreenRect();
913 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800914 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800915
Vishnu Nair9b079a22020-01-21 14:36:08 -0800916 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800917
918 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800919 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800920 layer.geometry.boundaries = fullscreenRect().toFloatRect();
921 layer.geometry.roundedCornersRadius = 5.0f;
922 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
923 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
924 layer.alpha = 1.0f;
925
Vishnu Nair9b079a22020-01-21 14:36:08 -0800926 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800927
Alec Mouric0aae732021-01-12 13:32:18 -0800928 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800929}
930
931template <typename SourceVariant>
932void RenderEngineTest::fillBufferWithRoundedCorners() {
933 fillRedBufferWithRoundedCorners<SourceVariant>();
934 // Corners should be ignored...
935 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
936 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
937 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
938 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
939 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
940 0, 0, 0, 0);
941 // ...And the non-rounded portion should be red.
942 // Other pixels may be anti-aliased, so let's not check those.
943 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
944 255);
945}
946
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000947template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800948void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800949 auto blurRadius = 50;
950 auto center = DEFAULT_DISPLAY_WIDTH / 2;
951
952 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800953 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800954 settings.physicalDisplay = fullscreenRect();
955 settings.clip = fullscreenRect();
956
Vishnu Nair9b079a22020-01-21 14:36:08 -0800957 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800958
959 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800960 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800961 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
962 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
963 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800964 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800965
966 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800967 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800968 leftLayer.geometry.boundaries =
969 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
970 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
971 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800972 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800973
974 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800975 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800976 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
977 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500978 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800979 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800980 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800981
Alec Mouric0aae732021-01-12 13:32:18 -0800982 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800983
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500984 // solid color
985 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
986
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500987 if (mRE->supportsBackgroundBlur()) {
988 // blurred color (downsampling should result in the center color being close to 128)
989 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400990 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500991 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800992}
993
994template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700995void RenderEngineTest::fillSmallLayerAndBlurBackground() {
996 auto blurRadius = 50;
997 renderengine::DisplaySettings settings;
998 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
999 settings.physicalDisplay = fullscreenRect();
1000 settings.clip = fullscreenRect();
1001
1002 std::vector<const renderengine::LayerSettings*> layers;
1003
1004 renderengine::LayerSettings backgroundLayer;
1005 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1006 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1007 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1008 backgroundLayer.alpha = 1.0f;
1009 layers.push_back(&backgroundLayer);
1010
1011 renderengine::LayerSettings blurLayer;
1012 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1013 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1014 blurLayer.backgroundBlurRadius = blurRadius;
1015 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1016 blurLayer.alpha = 0;
1017 layers.push_back(&blurLayer);
1018
1019 invokeDraw(settings, layers);
1020
1021 // Give a generous tolerance - the blur rectangle is very small and this test is
1022 // mainly concerned with ensuring that there's no device failure.
1023 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1024 40 /* tolerance */);
1025}
1026
1027template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001028void RenderEngineTest::overlayCorners() {
1029 renderengine::DisplaySettings settings;
1030 settings.physicalDisplay = fullscreenRect();
1031 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001032 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001033
Vishnu Nair9b079a22020-01-21 14:36:08 -08001034 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001035
1036 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001037 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001038 layerOne.geometry.boundaries =
1039 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1040 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1041 layerOne.alpha = 0.2;
1042
Vishnu Nair9b079a22020-01-21 14:36:08 -08001043 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001044 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001045 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1046 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1047 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1048 0, 0, 0, 0);
1049
Vishnu Nair9b079a22020-01-21 14:36:08 -08001050 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001051 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001052 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001053 layerTwo.geometry.boundaries =
1054 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1055 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1056 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1057 layerTwo.alpha = 1.0f;
1058
Vishnu Nair9b079a22020-01-21 14:36:08 -08001059 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001060 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001061
1062 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1063 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1064 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1065 0, 255, 0, 255);
1066}
1067
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001068void RenderEngineTest::fillRedBufferTextureTransform() {
1069 renderengine::DisplaySettings settings;
1070 settings.physicalDisplay = fullscreenRect();
1071 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001072 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001073
Vishnu Nair9b079a22020-01-21 14:36:08 -08001074 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001075
1076 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001077 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001078 // Here will allocate a checker board texture, but transform texture
1079 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001080 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001081 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001082 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001083 this->mTexNames.push_back(texName);
1084
1085 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001086 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1087 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001088 // Red top left, Green top right, Blue bottom left, Black bottom right
1089 pixels[0] = 255;
1090 pixels[1] = 0;
1091 pixels[2] = 0;
1092 pixels[3] = 255;
1093 pixels[4] = 0;
1094 pixels[5] = 255;
1095 pixels[6] = 0;
1096 pixels[7] = 255;
1097 pixels[8] = 0;
1098 pixels[9] = 0;
1099 pixels[10] = 255;
1100 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001101 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001102
1103 layer.source.buffer.buffer = buf;
1104 layer.source.buffer.textureName = texName;
1105 // Transform coordinates to only be inside the red quadrant.
1106 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1107 layer.alpha = 1.0f;
1108 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1109
Vishnu Nair9b079a22020-01-21 14:36:08 -08001110 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001111
Alec Mouric0aae732021-01-12 13:32:18 -08001112 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001113}
1114
1115void RenderEngineTest::fillBufferTextureTransform() {
1116 fillRedBufferTextureTransform();
1117 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1118}
1119
1120void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1121 renderengine::DisplaySettings settings;
1122 settings.physicalDisplay = fullscreenRect();
1123 // Here logical space is 1x1
1124 settings.clip = Rect(1, 1);
1125
Vishnu Nair9b079a22020-01-21 14:36:08 -08001126 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001127
1128 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001129 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001130 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001131 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001132 this->mTexNames.push_back(texName);
1133
1134 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001135 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1136 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001137 pixels[0] = 255;
1138 pixels[1] = 0;
1139 pixels[2] = 0;
1140 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001141 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001142
1143 layer.source.buffer.buffer = buf;
1144 layer.source.buffer.textureName = texName;
1145 layer.source.buffer.usePremultipliedAlpha = true;
1146 layer.alpha = 0.5f;
1147 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1148
Vishnu Nair9b079a22020-01-21 14:36:08 -08001149 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001150
Alec Mouric0aae732021-01-12 13:32:18 -08001151 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001152}
1153
1154void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1155 fillRedBufferWithPremultiplyAlpha();
1156 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1157}
1158
1159void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1160 renderengine::DisplaySettings settings;
1161 settings.physicalDisplay = fullscreenRect();
1162 // Here logical space is 1x1
1163 settings.clip = Rect(1, 1);
1164
Vishnu Nair9b079a22020-01-21 14:36:08 -08001165 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001166
1167 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001168 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001169 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001170 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001171 this->mTexNames.push_back(texName);
1172
1173 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001174 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1175 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001176 pixels[0] = 255;
1177 pixels[1] = 0;
1178 pixels[2] = 0;
1179 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001180 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001181
1182 layer.source.buffer.buffer = buf;
1183 layer.source.buffer.textureName = texName;
1184 layer.source.buffer.usePremultipliedAlpha = false;
1185 layer.alpha = 0.5f;
1186 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1187
Vishnu Nair9b079a22020-01-21 14:36:08 -08001188 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001189
Alec Mouric0aae732021-01-12 13:32:18 -08001190 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001191}
1192
1193void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1194 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001195 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001196}
1197
Alec Mouriac335532018-11-12 15:01:33 -08001198void RenderEngineTest::clearLeftRegion() {
1199 renderengine::DisplaySettings settings;
1200 settings.physicalDisplay = fullscreenRect();
1201 // Here logical space is 4x4
1202 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001203 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001204 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001205 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001206 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001207 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001208 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001209}
1210
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001211void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001212 // Reuse mBuffer
1213 clearLeftRegion();
1214 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1215 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1216 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001217 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001218}
1219
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001220template <typename SourceVariant>
1221void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1222 const renderengine::ShadowSettings& shadow,
1223 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1224 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001225 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001226 settings.physicalDisplay = fullscreenRect();
1227 settings.clip = fullscreenRect();
1228
Vishnu Nair9b079a22020-01-21 14:36:08 -08001229 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001230
1231 // add background layer
1232 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001233 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001234 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1235 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1236 backgroundColor.b / 255.0f, this);
1237 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001238 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001239
1240 // add shadow layer
1241 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001242 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001243 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1244 shadowLayer.alpha = castingLayer.alpha;
1245 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001246 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001247
1248 // add layer casting the shadow
1249 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001250 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001251 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1252 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001253 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001254
Alec Mouric0aae732021-01-12 13:32:18 -08001255 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001256}
1257
Alec Mouribd17b3b2020-12-17 11:08:30 -08001258void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1259 const renderengine::ShadowSettings& shadow,
1260 const ubyte4& backgroundColor) {
1261 renderengine::DisplaySettings settings;
1262 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1263 settings.physicalDisplay = fullscreenRect();
1264 settings.clip = fullscreenRect();
1265
1266 std::vector<const renderengine::LayerSettings*> layers;
1267
1268 // add background layer
1269 renderengine::LayerSettings bgLayer;
1270 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1271 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1272 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1273 backgroundColor.b / 255.0f, this);
1274 bgLayer.alpha = backgroundColor.a / 255.0f;
1275 layers.push_back(&bgLayer);
1276
1277 // add shadow layer
1278 renderengine::LayerSettings shadowLayer;
1279 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1280 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001281 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001282 shadowLayer.alpha = 1.0f;
1283 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1284 shadowLayer.shadow = shadow;
1285 layers.push_back(&shadowLayer);
1286
Alec Mouric0aae732021-01-12 13:32:18 -08001287 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001288}
1289
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001290INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001291 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001292 std::make_shared<GLESCMRenderEngineFactory>(),
1293 std::make_shared<SkiaGLESRenderEngineFactory>(),
1294 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001295
1296TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001297 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001298 drawEmptyLayers();
1299}
1300
Ana Krulec07b98df2021-01-07 14:38:40 -08001301TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001302 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001303
1304 renderengine::DisplaySettings settings;
1305 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1306 settings.physicalDisplay = fullscreenRect();
1307 settings.clip = fullscreenRect();
1308
1309 // 255, 255, 255, 255 is full opaque white.
1310 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1311 // Create layer with given color.
1312 renderengine::LayerSettings bgLayer;
1313 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1314 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1315 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1316 backgroundColor.b / 255.0f);
1317 bgLayer.alpha = backgroundColor.a / 255.0f;
1318 // Transform the red color.
1319 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1320
1321 std::vector<const renderengine::LayerSettings*> layers;
1322 layers.push_back(&bgLayer);
1323
Alec Mouric0aae732021-01-12 13:32:18 -08001324 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001325
1326 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001327 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001328 backgroundColor.a);
1329}
1330
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001331TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001332 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001333
Alec Mourid43ccab2019-03-13 12:23:45 -07001334 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001335 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001336 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001337 renderengine::LayerSettings layer;
1338 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1339 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001340 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001341 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001343
1344 ASSERT_EQ(BAD_VALUE, status);
1345}
1346
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001347TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001348 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001349
Alec Mourid43ccab2019-03-13 12:23:45 -07001350 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001351 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001352 settings.physicalDisplay = fullscreenRect();
1353 settings.clip = fullscreenRect();
1354
Vishnu Nair9b079a22020-01-21 14:36:08 -08001355 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001356 renderengine::LayerSettings layer;
1357 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1358 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1359 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001360 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001361
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001362 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001363 ASSERT_EQ(NO_ERROR, status);
1364 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1365}
1366
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001367TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1368 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001369
1370 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1371 // GLES-specific test
1372 return;
1373 }
1374
1375 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001376
Alec Mourife0d72b2019-03-21 14:05:56 -07001377 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001378 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001379 settings.physicalDisplay = fullscreenRect();
1380 settings.clip = fullscreenRect();
1381
Vishnu Nair9b079a22020-01-21 14:36:08 -08001382 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001383 renderengine::LayerSettings layer;
1384 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1385 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1386 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001387 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001388
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001389 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001390 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001391 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001392 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1393}
1394
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001395TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001396 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001397 fillRedBuffer<ColorSourceVariant>();
1398}
1399
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001400TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001401 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001402 fillGreenBuffer<ColorSourceVariant>();
1403}
1404
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001405TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001406 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001407 fillBlueBuffer<ColorSourceVariant>();
1408}
1409
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001410TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001411 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001412 fillRedTransparentBuffer<ColorSourceVariant>();
1413}
1414
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001415TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001416 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001417 fillBufferPhysicalOffset<ColorSourceVariant>();
1418}
1419
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001420TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001421 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001422 fillBufferCheckersRotate0<ColorSourceVariant>();
1423}
1424
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001425TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001426 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001427 fillBufferCheckersRotate90<ColorSourceVariant>();
1428}
1429
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001430TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001431 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001432 fillBufferCheckersRotate180<ColorSourceVariant>();
1433}
1434
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001435TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001436 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001437 fillBufferCheckersRotate270<ColorSourceVariant>();
1438}
1439
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001440TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001441 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001442 fillBufferLayerTransform<ColorSourceVariant>();
1443}
1444
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001445TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001446 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001447 fillBufferColorTransform<ColorSourceVariant>();
1448}
1449
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001450TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001451 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001452 fillBufferWithRoundedCorners<ColorSourceVariant>();
1453}
1454
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001455TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001456 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001457 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1458}
1459
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001460TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001461 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001462 fillBufferAndBlurBackground<ColorSourceVariant>();
1463}
1464
Alec Mourie8489fd2021-04-29 16:08:56 -07001465TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1466 initializeRenderEngine();
1467 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1468}
1469
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001470TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001471 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001472 overlayCorners<ColorSourceVariant>();
1473}
1474
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001475TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001476 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001477 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1478}
1479
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001480TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001481 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001482 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1483}
1484
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001485TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001486 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001487 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1488}
1489
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001490TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001491 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001492 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1493}
1494
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001495TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001496 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001497 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1498}
1499
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001500TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001501 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001502 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1503}
1504
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001505TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001506 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001507 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1508}
1509
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001510TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001511 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001512 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1513}
1514
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001515TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001516 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001517 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1518}
1519
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001520TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001521 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001522 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1523}
1524
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001525TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001526 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001527 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1528}
1529
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001530TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001531 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001532 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1533}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001534
Alec Mouric0aae732021-01-12 13:32:18 -08001535TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1536 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001537 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1538}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001539
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001540TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001541 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001542 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1543}
1544
Alec Mourie8489fd2021-04-29 16:08:56 -07001545TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1546 initializeRenderEngine();
1547 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1548}
1549
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001550TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001551 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001552 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1553}
1554
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001555TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001556 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001557 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1558}
1559
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001560TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001561 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001562 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1563}
1564
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001565TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001566 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001567 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1568}
1569
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001570TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001571 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001572 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1573}
1574
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001575TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001576 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001577 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1578}
1579
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001580TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001581 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001582 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1583}
1584
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001585TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001586 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001587 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1588}
1589
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001590TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001591 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001592 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1593}
1594
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001595TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001596 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001597 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1598}
1599
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001600TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001601 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001602 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1603}
1604
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001605TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001606 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001607 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1608}
1609
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001610TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001611 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001612 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1613}
1614
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001615TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001616 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001617 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1618}
1619
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001620TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001621 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001622 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1623}
1624
Alec Mourie8489fd2021-04-29 16:08:56 -07001625TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1626 initializeRenderEngine();
1627 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1628}
1629
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001630TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001631 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001632 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1633}
1634
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001635TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001636 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001637 fillBufferTextureTransform();
1638}
1639
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001640TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001641 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001642 fillBufferWithPremultiplyAlpha();
1643}
1644
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001645TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001646 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001647 fillBufferWithoutPremultiplyAlpha();
1648}
1649
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001650TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001651 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001652 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001653}
1654
Alec Mouribd17b3b2020-12-17 11:08:30 -08001655TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001656 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001657
1658 const ubyte4 backgroundColor(255, 255, 255, 255);
1659 const float shadowLength = 5.0f;
1660 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1661 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1662 renderengine::ShadowSettings settings =
1663 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1664 false /* casterIsTranslucent */);
1665
1666 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1667 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1668}
1669
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001670TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001671 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001672
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001673 const ubyte4 casterColor(255, 0, 0, 255);
1674 const ubyte4 backgroundColor(255, 255, 255, 255);
1675 const float shadowLength = 5.0f;
1676 Rect casterBounds(1, 1);
1677 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1678 renderengine::LayerSettings castingLayer;
1679 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1680 castingLayer.alpha = 1.0f;
1681 renderengine::ShadowSettings settings =
1682 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1683 false /* casterIsTranslucent */);
1684
1685 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1686 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1687}
1688
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001690 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001691
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001692 const ubyte4 casterColor(255, 0, 0, 255);
1693 const ubyte4 backgroundColor(255, 255, 255, 255);
1694 const float shadowLength = 5.0f;
1695 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1696 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1697 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001698 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001699 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1700 castingLayer.alpha = 1.0f;
1701 renderengine::ShadowSettings settings =
1702 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1703 false /* casterIsTranslucent */);
1704
1705 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1706 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1707}
1708
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001709TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001710 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001711
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001712 const ubyte4 casterColor(255, 0, 0, 255);
1713 const ubyte4 backgroundColor(255, 255, 255, 255);
1714 const float shadowLength = 5.0f;
1715 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1716 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1717 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001718 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001719 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1720 castingLayer.alpha = 1.0f;
1721 renderengine::ShadowSettings settings =
1722 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1723 false /* casterIsTranslucent */);
1724
1725 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1726 backgroundColor);
1727 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1728}
1729
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001730TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001731 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001732
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001733 const ubyte4 casterColor(255, 0, 0, 255);
1734 const ubyte4 backgroundColor(255, 255, 255, 255);
1735 const float shadowLength = 5.0f;
1736 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1737 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1738 renderengine::LayerSettings castingLayer;
1739 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1740 castingLayer.geometry.roundedCornersRadius = 3.0f;
1741 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1742 castingLayer.alpha = 1.0f;
1743 renderengine::ShadowSettings settings =
1744 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1745 false /* casterIsTranslucent */);
1746
1747 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1748 backgroundColor);
1749 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1750}
1751
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001752TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001753 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001754
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001755 const ubyte4 casterColor(255, 0, 0, 255);
1756 const ubyte4 backgroundColor(255, 255, 255, 255);
1757 const float shadowLength = 5.0f;
1758 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1759 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1760 renderengine::LayerSettings castingLayer;
1761 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1762 castingLayer.alpha = 0.5f;
1763 renderengine::ShadowSettings settings =
1764 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1765 true /* casterIsTranslucent */);
1766
1767 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1768 backgroundColor);
1769
1770 // verify only the background since the shadow will draw behind the caster
1771 const float shadowInset = settings.length * -1.0f;
1772 const Rect casterWithShadow =
1773 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1774 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1775 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1776 backgroundColor.a);
1777}
1778
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001779TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08001780 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001781
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001782 renderengine::DisplaySettings settings;
1783 settings.physicalDisplay = fullscreenRect();
1784 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001785 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001786
1787 std::vector<const renderengine::LayerSettings*> layers;
1788 renderengine::LayerSettings layer;
1789 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1790 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1791 layer.alpha = 1.0;
1792 layers.push_back(&layer);
1793
1794 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001795 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001796 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001797 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001798
1799 const int fd = fenceTwo.get();
1800 if (fd >= 0) {
1801 sync_wait(fd, -1);
1802 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001803 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04001804 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
1805 mRE->cleanupPostRender();
1806 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001807}
1808
Ana Krulecf9a15d92020-12-11 08:35:00 -08001809TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001810 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001811
1812 renderengine::DisplaySettings settings;
1813 settings.physicalDisplay = fullscreenRect();
1814 settings.clip = fullscreenRect();
1815 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1816
1817 std::vector<const renderengine::LayerSettings*> layers;
1818
1819 renderengine::LayerSettings redLayer;
1820 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1821 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1822 redLayer.geometry.roundedCornersRadius = 5.0f;
1823 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1824 // Red background.
1825 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1826 redLayer.alpha = 1.0f;
1827
1828 layers.push_back(&redLayer);
1829
1830 // Green layer with 1/3 size.
1831 renderengine::LayerSettings greenLayer;
1832 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1833 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1834 greenLayer.geometry.roundedCornersRadius = 5.0f;
1835 // Bottom right corner is not going to be rounded.
1836 greenLayer.geometry.roundedCornersCrop =
1837 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1838 DEFAULT_DISPLAY_HEIGHT)
1839 .toFloatRect();
1840 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1841 greenLayer.alpha = 1.0f;
1842
1843 layers.push_back(&greenLayer);
1844
Alec Mouric0aae732021-01-12 13:32:18 -08001845 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001846
1847 // Corners should be ignored...
1848 // Screen size: width is 128, height is 256.
1849 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1850 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1851 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1852 // Bottom right corner is kept out of the clipping, and it's green.
1853 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1854 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1855 0, 255, 0, 255);
1856}
1857
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001858TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1859 initializeRenderEngine();
1860
1861 renderengine::DisplaySettings settings;
1862 settings.physicalDisplay = fullscreenRect();
1863 settings.clip = fullscreenRect();
1864 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1865
1866 std::vector<const renderengine::LayerSettings*> layers;
1867
1868 renderengine::LayerSettings redLayer;
1869 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1870 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1871 redLayer.geometry.roundedCornersRadius = 5.0f;
1872 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1873 // Red background.
1874 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1875 redLayer.alpha = 1.0f;
1876
1877 layers.push_back(&redLayer);
1878
1879 // Green layer with 1/2 size with parent crop rect.
1880 renderengine::LayerSettings greenLayer = redLayer;
1881 greenLayer.geometry.boundaries =
1882 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1883 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1884
1885 layers.push_back(&greenLayer);
1886
1887 invokeDraw(settings, layers);
1888
1889 // Due to roundedCornersRadius, the corners are untouched.
1890 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1891 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1892 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1893 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1894
1895 // top middle should be green and the bottom middle red
1896 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1897 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1898
1899 // the bottom edge of the green layer should not be rounded
1900 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1901}
1902
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001903TEST_P(RenderEngineTest, testClear) {
1904 initializeRenderEngine();
1905
1906 const auto rect = fullscreenRect();
1907 const renderengine::DisplaySettings display{
1908 .physicalDisplay = rect,
1909 .clip = rect,
1910 };
1911
1912 const renderengine::LayerSettings redLayer{
1913 .geometry.boundaries = rect.toFloatRect(),
1914 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1915 .alpha = 1.0f,
1916 };
1917
1918 // This mimics prepareClearClientComposition. This layer should overwrite
1919 // the redLayer, so that the buffer is transparent, rather than red.
1920 const renderengine::LayerSettings clearLayer{
1921 .geometry.boundaries = rect.toFloatRect(),
1922 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1923 .alpha = 0.0f,
1924 .disableBlending = true,
1925 };
1926
1927 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1928 invokeDraw(display, layers);
1929 expectBufferColor(rect, 0, 0, 0, 0);
1930}
1931
1932TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1933 initializeRenderEngine();
1934
1935 const auto rect = Rect(0, 0, 1, 1);
1936 const renderengine::DisplaySettings display{
1937 .physicalDisplay = rect,
1938 .clip = rect,
1939 };
1940
1941 const renderengine::LayerSettings redLayer{
1942 .geometry.boundaries = rect.toFloatRect(),
1943 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1944 .alpha = 1.0f,
1945 };
1946
1947 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1948 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001949 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001950 {
1951 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001952 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1953 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001954 pixels[0] = 0;
1955 pixels[1] = 255;
1956 pixels[2] = 0;
1957 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001958 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001959 }
1960
1961 const renderengine::LayerSettings greenLayer{
1962 .geometry.boundaries = rect.toFloatRect(),
1963 .source =
1964 renderengine::PixelSource{
1965 .buffer =
1966 renderengine::Buffer{
1967 .buffer = buf,
1968 .usePremultipliedAlpha = true,
1969 },
1970 },
1971 .alpha = 0.5f,
1972 .disableBlending = true,
1973 };
1974
1975 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1976 invokeDraw(display, layers);
1977 expectBufferColor(rect, 0, 128, 0, 128);
1978}
1979
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04001980TEST_P(RenderEngineTest, test_isOpaque) {
1981 initializeRenderEngine();
1982
1983 const auto rect = Rect(0, 0, 1, 1);
1984 const renderengine::DisplaySettings display{
1985 .physicalDisplay = rect,
1986 .clip = rect,
1987 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1988 };
1989
1990 // Create an unpremul buffer that is green with no alpha. Using isOpaque
1991 // should make the green show.
1992 const auto buf = allocateSourceBuffer(1, 1);
1993 {
1994 uint8_t* pixels;
1995 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1996 reinterpret_cast<void**>(&pixels));
1997 pixels[0] = 0;
1998 pixels[1] = 255;
1999 pixels[2] = 0;
2000 pixels[3] = 0;
2001 buf->getBuffer()->unlock();
2002 }
2003
2004 const renderengine::LayerSettings greenLayer{
2005 .geometry.boundaries = rect.toFloatRect(),
2006 .source =
2007 renderengine::PixelSource{
2008 .buffer =
2009 renderengine::Buffer{
2010 .buffer = buf,
2011 // Although the pixels are not
2012 // premultiplied in practice, this
2013 // matches the input we see.
2014 .usePremultipliedAlpha = true,
2015 .isOpaque = true,
2016 },
2017 },
2018 .alpha = 1.0f,
2019 };
2020
2021 std::vector<const renderengine::LayerSettings*> layers{&greenLayer};
2022 invokeDraw(display, layers);
2023
2024 if (GetParam()->useColorManagement()) {
2025 expectBufferColor(rect, 117, 251, 76, 255);
2026 } else {
2027 expectBufferColor(rect, 0, 255, 0, 255);
2028 }
2029}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002030} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002031} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002032
2033// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002034#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"