blob: b3b726de5f8b149f8b089e444d9b2738eb1821b7 [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) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700422 std::future<renderengine::RenderEngineResult> result =
423 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
424 ASSERT_TRUE(result.valid());
425 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700426
427 int fd = fence.release();
428 if (fd >= 0) {
429 sync_wait(fd, -1);
430 close(fd);
431 }
432
433 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800434 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000435 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700436 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700437 }
438
Alec Mourid43ccab2019-03-13 12:23:45 -0700439 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700440 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800441 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800442 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700443 }
444
Alec Mouri1089aed2018-10-25 21:33:57 -0700445 template <typename SourceVariant>
446 void fillBuffer(half r, half g, half b, half a);
447
448 template <typename SourceVariant>
449 void fillRedBuffer();
450
451 template <typename SourceVariant>
452 void fillGreenBuffer();
453
454 template <typename SourceVariant>
455 void fillBlueBuffer();
456
457 template <typename SourceVariant>
458 void fillRedTransparentBuffer();
459
460 template <typename SourceVariant>
461 void fillRedOffsetBuffer();
462
463 template <typename SourceVariant>
464 void fillBufferPhysicalOffset();
465
466 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700467 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700468
469 template <typename SourceVariant>
470 void fillBufferCheckersRotate0();
471
472 template <typename SourceVariant>
473 void fillBufferCheckersRotate90();
474
475 template <typename SourceVariant>
476 void fillBufferCheckersRotate180();
477
478 template <typename SourceVariant>
479 void fillBufferCheckersRotate270();
480
481 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800482 void fillBufferWithLayerTransform();
483
484 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700485 void fillBufferLayerTransform();
486
487 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800488 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800489
490 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700491 void fillBufferColorTransform();
492
Alec Mouri7c94edb2018-12-03 21:23:26 -0800493 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800494 void fillBufferWithColorTransformZeroLayerAlpha();
495
496 template <typename SourceVariant>
497 void fillBufferColorTransformZeroLayerAlpha();
498
499 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800500 void fillRedBufferWithRoundedCorners();
501
502 template <typename SourceVariant>
503 void fillBufferWithRoundedCorners();
504
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000505 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800506 void fillBufferAndBlurBackground();
507
508 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700509 void fillSmallLayerAndBlurBackground();
510
511 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000512 void overlayCorners();
513
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800514 void fillRedBufferTextureTransform();
515
516 void fillBufferTextureTransform();
517
518 void fillRedBufferWithPremultiplyAlpha();
519
520 void fillBufferWithPremultiplyAlpha();
521
522 void fillRedBufferWithoutPremultiplyAlpha();
523
524 void fillBufferWithoutPremultiplyAlpha();
525
Alec Mouriac335532018-11-12 15:01:33 -0800526 void fillGreenColorBufferThenClearRegion();
527
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800528 template <typename SourceVariant>
529 void drawShadow(const renderengine::LayerSettings& castingLayer,
530 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
531 const ubyte4& backgroundColor);
532
Alec Mouribd17b3b2020-12-17 11:08:30 -0800533 void drawShadowWithoutCaster(const FloatRect& castingBounds,
534 const renderengine::ShadowSettings& shadow,
535 const ubyte4& backgroundColor);
536
Alec Mouric0aae732021-01-12 13:32:18 -0800537 void initializeRenderEngine();
538
539 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000540 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800541 // GLESRenderEngine for testing GLES-specific behavior.
542 // Owened by mRE, but this is downcasted.
543 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800544
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800545 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700546};
547
Alec Mouric0aae732021-01-12 13:32:18 -0800548void RenderEngineTest::initializeRenderEngine() {
549 const auto& renderEngineFactory = GetParam();
550 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
551 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
552 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
553 // every time.
554 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
555 renderEngineFactory->createGLESRenderEngine();
556 mGLESRE = renderEngine.get();
557 mRE = std::move(renderEngine);
558 } else {
559 mRE = renderEngineFactory->createRenderEngine();
560 }
Alec Mouria90a5702021-04-16 16:36:21 +0000561 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800562}
563
Alec Mouri1089aed2018-10-25 21:33:57 -0700564struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800565 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800566 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700567 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800568 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700569 }
570};
571
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800572struct RelaxOpaqueBufferVariant {
573 static void setOpaqueBit(renderengine::LayerSettings& layer) {
574 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800575 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800576 }
577
578 static uint8_t getAlphaChannel() { return 255; }
579};
580
581struct ForceOpaqueBufferVariant {
582 static void setOpaqueBit(renderengine::LayerSettings& layer) {
583 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800584 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800585 }
586
587 static uint8_t getAlphaChannel() {
588 // The isOpaque bit will override the alpha channel, so this should be
589 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800590 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800591 }
592};
593
594template <typename OpaquenessVariant>
595struct BufferSourceVariant {
596 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800597 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000598 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800599 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800600 fixture->mRE->genTextures(1, &texName);
601 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800602
603 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000604 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
605 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800606
Alec Mouria90a5702021-04-16 16:36:21 +0000607 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
608 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
609 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800610 iter[0] = uint8_t(r * 255);
611 iter[1] = uint8_t(g * 255);
612 iter[2] = uint8_t(b * 255);
613 iter[3] = OpaquenessVariant::getAlphaChannel();
614 iter += 4;
615 }
616 }
617
Alec Mouria90a5702021-04-16 16:36:21 +0000618 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800619
620 layer.source.buffer.buffer = buf;
621 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800622 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800623 OpaquenessVariant::setOpaqueBit(layer);
624 }
625};
626
Alec Mouri1089aed2018-10-25 21:33:57 -0700627template <typename SourceVariant>
628void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
629 renderengine::DisplaySettings settings;
630 settings.physicalDisplay = fullscreenRect();
631 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800632 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700633
Vishnu Nair9b079a22020-01-21 14:36:08 -0800634 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700635
636 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800637 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700638 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800639 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700640 layer.alpha = a;
641
Vishnu Nair9b079a22020-01-21 14:36:08 -0800642 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700643
Alec Mouric0aae732021-01-12 13:32:18 -0800644 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700645}
646
647template <typename SourceVariant>
648void RenderEngineTest::fillRedBuffer() {
649 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
650 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
651}
652
653template <typename SourceVariant>
654void RenderEngineTest::fillGreenBuffer() {
655 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
656 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
657}
658
659template <typename SourceVariant>
660void RenderEngineTest::fillBlueBuffer() {
661 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
662 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
663}
664
665template <typename SourceVariant>
666void RenderEngineTest::fillRedTransparentBuffer() {
667 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
668 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
669}
670
671template <typename SourceVariant>
672void RenderEngineTest::fillRedOffsetBuffer() {
673 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800674 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700675 settings.physicalDisplay = offsetRect();
676 settings.clip = offsetRectAtZero();
677
Vishnu Nair9b079a22020-01-21 14:36:08 -0800678 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700679
680 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800681 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700682 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800683 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700684 layer.alpha = 1.0f;
685
Vishnu Nair9b079a22020-01-21 14:36:08 -0800686 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800687 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700688}
689
690template <typename SourceVariant>
691void RenderEngineTest::fillBufferPhysicalOffset() {
692 fillRedOffsetBuffer<SourceVariant>();
693
694 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
695 DEFAULT_DISPLAY_HEIGHT),
696 255, 0, 0, 255);
697 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
698 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
699
700 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
701 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
702}
703
704template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700705void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700706 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800707 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700708 settings.physicalDisplay = fullscreenRect();
709 // Here logical space is 2x2
710 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700711 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700712
Vishnu Nair9b079a22020-01-21 14:36:08 -0800713 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700714
715 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800716 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700717 Rect rectOne(0, 0, 1, 1);
718 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800719 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700720 layerOne.alpha = 1.0f;
721
722 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800723 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700724 Rect rectTwo(0, 1, 1, 2);
725 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800726 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700727 layerTwo.alpha = 1.0f;
728
729 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800730 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700731 Rect rectThree(1, 0, 2, 1);
732 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800733 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700734 layerThree.alpha = 1.0f;
735
Vishnu Nair9b079a22020-01-21 14:36:08 -0800736 layers.push_back(&layerOne);
737 layers.push_back(&layerTwo);
738 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700739
Alec Mouric0aae732021-01-12 13:32:18 -0800740 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700741}
742
743template <typename SourceVariant>
744void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700745 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700746 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
747 255);
748 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
749 DEFAULT_DISPLAY_HEIGHT / 2),
750 0, 0, 255, 255);
751 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
752 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
753 0, 0, 0, 0);
754 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
755 DEFAULT_DISPLAY_HEIGHT),
756 0, 255, 0, 255);
757}
758
759template <typename SourceVariant>
760void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700761 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700762 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
763 255);
764 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
765 DEFAULT_DISPLAY_HEIGHT / 2),
766 255, 0, 0, 255);
767 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
768 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
769 0, 0, 255, 255);
770 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
771 DEFAULT_DISPLAY_HEIGHT),
772 0, 0, 0, 0);
773}
774
775template <typename SourceVariant>
776void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700777 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700778 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
779 0);
780 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
781 DEFAULT_DISPLAY_HEIGHT / 2),
782 0, 255, 0, 255);
783 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
784 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
785 255, 0, 0, 255);
786 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
787 DEFAULT_DISPLAY_HEIGHT),
788 0, 0, 255, 255);
789}
790
791template <typename SourceVariant>
792void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700793 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700794 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
795 255);
796 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
797 DEFAULT_DISPLAY_HEIGHT / 2),
798 0, 0, 0, 0);
799 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
800 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
801 0, 255, 0, 255);
802 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
803 DEFAULT_DISPLAY_HEIGHT),
804 255, 0, 0, 255);
805}
806
807template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800808void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700809 renderengine::DisplaySettings settings;
810 settings.physicalDisplay = fullscreenRect();
811 // Here logical space is 2x2
812 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800813 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700814
Vishnu Nair9b079a22020-01-21 14:36:08 -0800815 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700816
817 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800818 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700819 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
820 // Translate one pixel diagonally
821 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 -0800822 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700823 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
824 layer.alpha = 1.0f;
825
Vishnu Nair9b079a22020-01-21 14:36:08 -0800826 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700827
Alec Mouric0aae732021-01-12 13:32:18 -0800828 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800829}
Alec Mouri1089aed2018-10-25 21:33:57 -0700830
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800831template <typename SourceVariant>
832void RenderEngineTest::fillBufferLayerTransform() {
833 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700834 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
835 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
836 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
837 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
838 255, 0, 0, 255);
839}
840
841template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800842void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700843 renderengine::DisplaySettings settings;
844 settings.physicalDisplay = fullscreenRect();
845 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800846 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700847
Vishnu Nair9b079a22020-01-21 14:36:08 -0800848 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700849
850 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800851 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700852 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800853 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700854 layer.alpha = 1.0f;
855
856 // construct a fake color matrix
857 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800858 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700859 // set red channel to red + green
860 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
861
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800862 layer.alpha = 1.0f;
863 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
864
Vishnu Nair9b079a22020-01-21 14:36:08 -0800865 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700866
Alec Mouric0aae732021-01-12 13:32:18 -0800867 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800868}
Alec Mouri1089aed2018-10-25 21:33:57 -0700869
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800870template <typename SourceVariant>
871void RenderEngineTest::fillBufferColorTransform() {
872 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800873 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
874}
875
876template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800877void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
878 renderengine::DisplaySettings settings;
879 settings.physicalDisplay = fullscreenRect();
880 settings.clip = Rect(1, 1);
881
882 std::vector<const renderengine::LayerSettings*> layers;
883
884 renderengine::LayerSettings layer;
885 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
886 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
887 layer.alpha = 0;
888
889 // construct a fake color matrix
890 // simple inverse color
891 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
892
893 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
894
895 layers.push_back(&layer);
896
Alec Mouric0aae732021-01-12 13:32:18 -0800897 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800898}
899
900template <typename SourceVariant>
901void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
902 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
903 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
904}
905
906template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800907void RenderEngineTest::fillRedBufferWithRoundedCorners() {
908 renderengine::DisplaySettings settings;
909 settings.physicalDisplay = fullscreenRect();
910 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800911 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800912
Vishnu Nair9b079a22020-01-21 14:36:08 -0800913 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800914
915 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800916 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800917 layer.geometry.boundaries = fullscreenRect().toFloatRect();
918 layer.geometry.roundedCornersRadius = 5.0f;
919 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
920 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
921 layer.alpha = 1.0f;
922
Vishnu Nair9b079a22020-01-21 14:36:08 -0800923 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800924
Alec Mouric0aae732021-01-12 13:32:18 -0800925 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800926}
927
928template <typename SourceVariant>
929void RenderEngineTest::fillBufferWithRoundedCorners() {
930 fillRedBufferWithRoundedCorners<SourceVariant>();
931 // Corners should be ignored...
932 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
933 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
934 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
935 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
936 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
937 0, 0, 0, 0);
938 // ...And the non-rounded portion should be red.
939 // Other pixels may be anti-aliased, so let's not check those.
940 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
941 255);
942}
943
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000944template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800945void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800946 auto blurRadius = 50;
947 auto center = DEFAULT_DISPLAY_WIDTH / 2;
948
949 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800950 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800951 settings.physicalDisplay = fullscreenRect();
952 settings.clip = fullscreenRect();
953
Vishnu Nair9b079a22020-01-21 14:36:08 -0800954 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800955
956 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800957 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800958 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
959 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
960 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800961 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800962
963 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800964 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800965 leftLayer.geometry.boundaries =
966 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
967 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
968 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800969 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800970
971 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800972 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800973 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
974 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500975 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800976 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800977 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800978
Alec Mouric0aae732021-01-12 13:32:18 -0800979 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800980
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500981 // solid color
982 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
983
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500984 if (mRE->supportsBackgroundBlur()) {
985 // blurred color (downsampling should result in the center color being close to 128)
986 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400987 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500988 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800989}
990
991template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700992void RenderEngineTest::fillSmallLayerAndBlurBackground() {
993 auto blurRadius = 50;
994 renderengine::DisplaySettings settings;
995 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
996 settings.physicalDisplay = fullscreenRect();
997 settings.clip = fullscreenRect();
998
999 std::vector<const renderengine::LayerSettings*> layers;
1000
1001 renderengine::LayerSettings backgroundLayer;
1002 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1003 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1004 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1005 backgroundLayer.alpha = 1.0f;
1006 layers.push_back(&backgroundLayer);
1007
1008 renderengine::LayerSettings blurLayer;
1009 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1010 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1011 blurLayer.backgroundBlurRadius = blurRadius;
1012 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1013 blurLayer.alpha = 0;
1014 layers.push_back(&blurLayer);
1015
1016 invokeDraw(settings, layers);
1017
1018 // Give a generous tolerance - the blur rectangle is very small and this test is
1019 // mainly concerned with ensuring that there's no device failure.
1020 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1021 40 /* tolerance */);
1022}
1023
1024template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001025void RenderEngineTest::overlayCorners() {
1026 renderengine::DisplaySettings settings;
1027 settings.physicalDisplay = fullscreenRect();
1028 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001029 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001030
Vishnu Nair9b079a22020-01-21 14:36:08 -08001031 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001032
1033 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001034 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001035 layerOne.geometry.boundaries =
1036 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1037 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1038 layerOne.alpha = 0.2;
1039
Vishnu Nair9b079a22020-01-21 14:36:08 -08001040 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001041 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001042 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1043 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1044 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1045 0, 0, 0, 0);
1046
Vishnu Nair9b079a22020-01-21 14:36:08 -08001047 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001048 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001049 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001050 layerTwo.geometry.boundaries =
1051 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1052 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1053 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1054 layerTwo.alpha = 1.0f;
1055
Vishnu Nair9b079a22020-01-21 14:36:08 -08001056 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001057 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001058
1059 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1060 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1061 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1062 0, 255, 0, 255);
1063}
1064
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001065void RenderEngineTest::fillRedBufferTextureTransform() {
1066 renderengine::DisplaySettings settings;
1067 settings.physicalDisplay = fullscreenRect();
1068 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001069 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070
Vishnu Nair9b079a22020-01-21 14:36:08 -08001071 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001072
1073 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001074 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001075 // Here will allocate a checker board texture, but transform texture
1076 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001077 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001078 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001079 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001080 this->mTexNames.push_back(texName);
1081
1082 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001083 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1084 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001085 // Red top left, Green top right, Blue bottom left, Black bottom right
1086 pixels[0] = 255;
1087 pixels[1] = 0;
1088 pixels[2] = 0;
1089 pixels[3] = 255;
1090 pixels[4] = 0;
1091 pixels[5] = 255;
1092 pixels[6] = 0;
1093 pixels[7] = 255;
1094 pixels[8] = 0;
1095 pixels[9] = 0;
1096 pixels[10] = 255;
1097 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001098 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001099
1100 layer.source.buffer.buffer = buf;
1101 layer.source.buffer.textureName = texName;
1102 // Transform coordinates to only be inside the red quadrant.
1103 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1104 layer.alpha = 1.0f;
1105 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1106
Vishnu Nair9b079a22020-01-21 14:36:08 -08001107 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001108
Alec Mouric0aae732021-01-12 13:32:18 -08001109 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001110}
1111
1112void RenderEngineTest::fillBufferTextureTransform() {
1113 fillRedBufferTextureTransform();
1114 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1115}
1116
1117void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1118 renderengine::DisplaySettings settings;
1119 settings.physicalDisplay = fullscreenRect();
1120 // Here logical space is 1x1
1121 settings.clip = Rect(1, 1);
1122
Vishnu Nair9b079a22020-01-21 14:36:08 -08001123 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001124
1125 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001126 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001127 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001128 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001129 this->mTexNames.push_back(texName);
1130
1131 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001132 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1133 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001134 pixels[0] = 255;
1135 pixels[1] = 0;
1136 pixels[2] = 0;
1137 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001138 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001139
1140 layer.source.buffer.buffer = buf;
1141 layer.source.buffer.textureName = texName;
1142 layer.source.buffer.usePremultipliedAlpha = true;
1143 layer.alpha = 0.5f;
1144 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1145
Vishnu Nair9b079a22020-01-21 14:36:08 -08001146 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001147
Alec Mouric0aae732021-01-12 13:32:18 -08001148 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001149}
1150
1151void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1152 fillRedBufferWithPremultiplyAlpha();
1153 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1154}
1155
1156void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1157 renderengine::DisplaySettings settings;
1158 settings.physicalDisplay = fullscreenRect();
1159 // Here logical space is 1x1
1160 settings.clip = Rect(1, 1);
1161
Vishnu Nair9b079a22020-01-21 14:36:08 -08001162 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001163
1164 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001165 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001166 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001167 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001168 this->mTexNames.push_back(texName);
1169
1170 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001171 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1172 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001173 pixels[0] = 255;
1174 pixels[1] = 0;
1175 pixels[2] = 0;
1176 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001177 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001178
1179 layer.source.buffer.buffer = buf;
1180 layer.source.buffer.textureName = texName;
1181 layer.source.buffer.usePremultipliedAlpha = false;
1182 layer.alpha = 0.5f;
1183 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1184
Vishnu Nair9b079a22020-01-21 14:36:08 -08001185 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001186
Alec Mouric0aae732021-01-12 13:32:18 -08001187 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001188}
1189
1190void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1191 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001192 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001193}
1194
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001195template <typename SourceVariant>
1196void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1197 const renderengine::ShadowSettings& shadow,
1198 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1199 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001200 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001201 settings.physicalDisplay = fullscreenRect();
1202 settings.clip = fullscreenRect();
1203
Vishnu Nair9b079a22020-01-21 14:36:08 -08001204 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001205
1206 // add background layer
1207 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001208 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001209 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1210 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1211 backgroundColor.b / 255.0f, this);
1212 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001213 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001214
1215 // add shadow layer
1216 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001217 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001218 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1219 shadowLayer.alpha = castingLayer.alpha;
1220 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001221 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001222
1223 // add layer casting the shadow
1224 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001225 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001226 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1227 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001228 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001229
Alec Mouric0aae732021-01-12 13:32:18 -08001230 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001231}
1232
Alec Mouribd17b3b2020-12-17 11:08:30 -08001233void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1234 const renderengine::ShadowSettings& shadow,
1235 const ubyte4& backgroundColor) {
1236 renderengine::DisplaySettings settings;
1237 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1238 settings.physicalDisplay = fullscreenRect();
1239 settings.clip = fullscreenRect();
1240
1241 std::vector<const renderengine::LayerSettings*> layers;
1242
1243 // add background layer
1244 renderengine::LayerSettings bgLayer;
1245 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1246 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1247 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1248 backgroundColor.b / 255.0f, this);
1249 bgLayer.alpha = backgroundColor.a / 255.0f;
1250 layers.push_back(&bgLayer);
1251
1252 // add shadow layer
1253 renderengine::LayerSettings shadowLayer;
1254 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1255 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001256 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001257 shadowLayer.alpha = 1.0f;
1258 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1259 shadowLayer.shadow = shadow;
1260 layers.push_back(&shadowLayer);
1261
Alec Mouric0aae732021-01-12 13:32:18 -08001262 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001263}
1264
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001265INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001266 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001267 std::make_shared<GLESCMRenderEngineFactory>(),
1268 std::make_shared<SkiaGLESRenderEngineFactory>(),
1269 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001270
1271TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001272 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001273 drawEmptyLayers();
1274}
1275
Ana Krulec07b98df2021-01-07 14:38:40 -08001276TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001277 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001278
1279 renderengine::DisplaySettings settings;
1280 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1281 settings.physicalDisplay = fullscreenRect();
1282 settings.clip = fullscreenRect();
1283
1284 // 255, 255, 255, 255 is full opaque white.
1285 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1286 // Create layer with given color.
1287 renderengine::LayerSettings bgLayer;
1288 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1289 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1290 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1291 backgroundColor.b / 255.0f);
1292 bgLayer.alpha = backgroundColor.a / 255.0f;
1293 // Transform the red color.
1294 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1295
1296 std::vector<const renderengine::LayerSettings*> layers;
1297 layers.push_back(&bgLayer);
1298
Alec Mouric0aae732021-01-12 13:32:18 -08001299 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001300
1301 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001302 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001303 backgroundColor.a);
1304}
1305
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001306TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001307 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001308
Alec Mourid43ccab2019-03-13 12:23:45 -07001309 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001310 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001311 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001312 renderengine::LayerSettings layer;
1313 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1314 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001315 layers.push_back(&layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001316 std::future<renderengine::RenderEngineResult> result =
1317 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001318
Sally Qi4cabdd02021-08-05 16:45:57 -07001319 ASSERT_TRUE(result.valid());
1320 auto [status, _] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001321 ASSERT_EQ(BAD_VALUE, status);
1322}
1323
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001324TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001325 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001326
Alec Mourid43ccab2019-03-13 12:23:45 -07001327 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001328 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001329 settings.physicalDisplay = fullscreenRect();
1330 settings.clip = fullscreenRect();
1331
Vishnu Nair9b079a22020-01-21 14:36:08 -08001332 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001333 renderengine::LayerSettings layer;
1334 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1335 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1336 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001337 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001338
Sally Qi4cabdd02021-08-05 16:45:57 -07001339 std::future<renderengine::RenderEngineResult> result =
1340 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
1341 ASSERT_TRUE(result.valid());
1342 auto [status, _] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001343 ASSERT_EQ(NO_ERROR, status);
1344 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1345}
1346
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001347TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1348 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001349
1350 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1351 // GLES-specific test
1352 return;
1353 }
1354
1355 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001356
Alec Mourife0d72b2019-03-21 14:05:56 -07001357 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001358 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001359 settings.physicalDisplay = fullscreenRect();
1360 settings.clip = fullscreenRect();
1361
Vishnu Nair9b079a22020-01-21 14:36:08 -08001362 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001363 renderengine::LayerSettings layer;
1364 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1365 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1366 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001367 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001368
Sally Qi4cabdd02021-08-05 16:45:57 -07001369 std::future<renderengine::RenderEngineResult> result =
1370 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1371 ASSERT_TRUE(result.valid());
1372 auto [status, _] = result.get();
Alec Mourife0d72b2019-03-21 14:05:56 -07001373 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001374 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001375 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1376}
1377
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001378TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001379 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001380 fillRedBuffer<ColorSourceVariant>();
1381}
1382
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001383TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001384 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001385 fillGreenBuffer<ColorSourceVariant>();
1386}
1387
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001388TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001389 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001390 fillBlueBuffer<ColorSourceVariant>();
1391}
1392
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001393TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001394 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001395 fillRedTransparentBuffer<ColorSourceVariant>();
1396}
1397
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001398TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001399 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001400 fillBufferPhysicalOffset<ColorSourceVariant>();
1401}
1402
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001403TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001404 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001405 fillBufferCheckersRotate0<ColorSourceVariant>();
1406}
1407
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001408TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001409 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001410 fillBufferCheckersRotate90<ColorSourceVariant>();
1411}
1412
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001413TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001414 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001415 fillBufferCheckersRotate180<ColorSourceVariant>();
1416}
1417
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001418TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001419 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001420 fillBufferCheckersRotate270<ColorSourceVariant>();
1421}
1422
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001423TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001424 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001425 fillBufferLayerTransform<ColorSourceVariant>();
1426}
1427
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001428TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001429 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001430 fillBufferColorTransform<ColorSourceVariant>();
1431}
1432
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001433TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001434 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001435 fillBufferWithRoundedCorners<ColorSourceVariant>();
1436}
1437
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001438TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001439 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001440 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1441}
1442
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001443TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001444 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001445 fillBufferAndBlurBackground<ColorSourceVariant>();
1446}
1447
Alec Mourie8489fd2021-04-29 16:08:56 -07001448TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1449 initializeRenderEngine();
1450 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1451}
1452
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001453TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001454 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001455 overlayCorners<ColorSourceVariant>();
1456}
1457
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001458TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001459 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001460 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1461}
1462
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001463TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001464 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001465 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1466}
1467
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001468TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001469 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001470 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1471}
1472
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001473TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001474 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001475 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1476}
1477
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001478TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001479 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001480 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1481}
1482
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001483TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001484 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001485 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1486}
1487
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001488TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001489 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001490 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1491}
1492
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001493TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001494 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001495 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1496}
1497
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001498TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001499 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001500 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1501}
1502
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001503TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001504 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001505 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1506}
1507
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001508TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001509 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001510 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1511}
1512
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001513TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001514 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001515 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1516}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001517
Alec Mouric0aae732021-01-12 13:32:18 -08001518TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1519 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001520 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1521}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001522
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001523TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001524 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001525 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1526}
1527
Alec Mourie8489fd2021-04-29 16:08:56 -07001528TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1529 initializeRenderEngine();
1530 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1531}
1532
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001533TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001534 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001535 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1536}
1537
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001538TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001539 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001540 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1541}
1542
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001543TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001544 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001545 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1546}
1547
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001548TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001549 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001550 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1551}
1552
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001553TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001554 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001555 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1556}
1557
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001558TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001559 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001560 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1561}
1562
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001563TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001564 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001565 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1566}
1567
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001568TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001569 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001570 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1571}
1572
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001573TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001574 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001575 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1576}
1577
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001578TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001579 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001580 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1581}
1582
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001583TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001584 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001585 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1586}
1587
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001588TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001589 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001590 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1591}
1592
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001593TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001594 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001595 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1596}
1597
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001598TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001599 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001600 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1601}
1602
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001603TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001604 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001605 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1606}
1607
Alec Mourie8489fd2021-04-29 16:08:56 -07001608TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1609 initializeRenderEngine();
1610 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1611}
1612
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001613TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001614 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001615 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1616}
1617
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001618TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001619 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001620 fillBufferTextureTransform();
1621}
1622
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001623TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001624 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001625 fillBufferWithPremultiplyAlpha();
1626}
1627
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001628TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001629 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001630 fillBufferWithoutPremultiplyAlpha();
1631}
1632
Alec Mouribd17b3b2020-12-17 11:08:30 -08001633TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001634 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001635
1636 const ubyte4 backgroundColor(255, 255, 255, 255);
1637 const float shadowLength = 5.0f;
1638 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1639 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1640 renderengine::ShadowSettings settings =
1641 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1642 false /* casterIsTranslucent */);
1643
1644 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1645 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1646}
1647
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001648TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001649 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001650
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001651 const ubyte4 casterColor(255, 0, 0, 255);
1652 const ubyte4 backgroundColor(255, 255, 255, 255);
1653 const float shadowLength = 5.0f;
1654 Rect casterBounds(1, 1);
1655 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1656 renderengine::LayerSettings castingLayer;
1657 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1658 castingLayer.alpha = 1.0f;
1659 renderengine::ShadowSettings settings =
1660 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1661 false /* casterIsTranslucent */);
1662
1663 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1664 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1665}
1666
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001667TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001668 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001669
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001670 const ubyte4 casterColor(255, 0, 0, 255);
1671 const ubyte4 backgroundColor(255, 255, 255, 255);
1672 const float shadowLength = 5.0f;
1673 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1674 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1675 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001676 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001677 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1678 castingLayer.alpha = 1.0f;
1679 renderengine::ShadowSettings settings =
1680 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1681 false /* casterIsTranslucent */);
1682
1683 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1684 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1685}
1686
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001687TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001688 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001690 const ubyte4 casterColor(255, 0, 0, 255);
1691 const ubyte4 backgroundColor(255, 255, 255, 255);
1692 const float shadowLength = 5.0f;
1693 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1694 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1695 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001696 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001697 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1698 castingLayer.alpha = 1.0f;
1699 renderengine::ShadowSettings settings =
1700 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1701 false /* casterIsTranslucent */);
1702
1703 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1704 backgroundColor);
1705 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1706}
1707
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001708TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001709 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001710
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001711 const ubyte4 casterColor(255, 0, 0, 255);
1712 const ubyte4 backgroundColor(255, 255, 255, 255);
1713 const float shadowLength = 5.0f;
1714 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1715 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1716 renderengine::LayerSettings castingLayer;
1717 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1718 castingLayer.geometry.roundedCornersRadius = 3.0f;
1719 castingLayer.geometry.roundedCornersCrop = 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_translucentCasterWithAlpha) {
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.alpha = 0.5f;
1741 renderengine::ShadowSettings settings =
1742 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1743 true /* casterIsTranslucent */);
1744
1745 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1746 backgroundColor);
1747
1748 // verify only the background since the shadow will draw behind the caster
1749 const float shadowInset = settings.length * -1.0f;
1750 const Rect casterWithShadow =
1751 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1752 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1753 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1754 backgroundColor.a);
1755}
1756
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001757TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08001758 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001759
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001760 renderengine::DisplaySettings settings;
1761 settings.physicalDisplay = fullscreenRect();
1762 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001763 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001764
1765 std::vector<const renderengine::LayerSettings*> layers;
1766 renderengine::LayerSettings layer;
1767 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1768 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1769 layer.alpha = 1.0;
1770 layers.push_back(&layer);
1771
Sally Qi4cabdd02021-08-05 16:45:57 -07001772 std::future<renderengine::RenderEngineResult> resultOne =
1773 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
1774 ASSERT_TRUE(resultOne.valid());
1775 auto [statusOne, fenceOne] = resultOne.get();
1776 ASSERT_EQ(NO_ERROR, statusOne);
1777
1778 std::future<renderengine::RenderEngineResult> resultTwo =
1779 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
1780 ASSERT_TRUE(resultTwo.valid());
1781 auto [statusTwo, fenceTwo] = resultTwo.get();
1782 ASSERT_EQ(NO_ERROR, statusTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001783
1784 const int fd = fenceTwo.get();
1785 if (fd >= 0) {
1786 sync_wait(fd, -1);
1787 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001788 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04001789 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
1790 mRE->cleanupPostRender();
1791 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001792}
1793
Ana Krulecf9a15d92020-12-11 08:35:00 -08001794TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001795 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001796
1797 renderengine::DisplaySettings settings;
1798 settings.physicalDisplay = fullscreenRect();
1799 settings.clip = fullscreenRect();
1800 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1801
1802 std::vector<const renderengine::LayerSettings*> layers;
1803
1804 renderengine::LayerSettings redLayer;
1805 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1806 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1807 redLayer.geometry.roundedCornersRadius = 5.0f;
1808 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1809 // Red background.
1810 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1811 redLayer.alpha = 1.0f;
1812
1813 layers.push_back(&redLayer);
1814
1815 // Green layer with 1/3 size.
1816 renderengine::LayerSettings greenLayer;
1817 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1818 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1819 greenLayer.geometry.roundedCornersRadius = 5.0f;
1820 // Bottom right corner is not going to be rounded.
1821 greenLayer.geometry.roundedCornersCrop =
1822 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1823 DEFAULT_DISPLAY_HEIGHT)
1824 .toFloatRect();
1825 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1826 greenLayer.alpha = 1.0f;
1827
1828 layers.push_back(&greenLayer);
1829
Alec Mouric0aae732021-01-12 13:32:18 -08001830 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001831
1832 // Corners should be ignored...
1833 // Screen size: width is 128, height is 256.
1834 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1835 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1836 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1837 // Bottom right corner is kept out of the clipping, and it's green.
1838 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1839 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1840 0, 255, 0, 255);
1841}
1842
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001843TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1844 initializeRenderEngine();
1845
1846 renderengine::DisplaySettings settings;
1847 settings.physicalDisplay = fullscreenRect();
1848 settings.clip = fullscreenRect();
1849 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1850
1851 std::vector<const renderengine::LayerSettings*> layers;
1852
1853 renderengine::LayerSettings redLayer;
1854 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1855 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1856 redLayer.geometry.roundedCornersRadius = 5.0f;
1857 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1858 // Red background.
1859 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1860 redLayer.alpha = 1.0f;
1861
1862 layers.push_back(&redLayer);
1863
1864 // Green layer with 1/2 size with parent crop rect.
1865 renderengine::LayerSettings greenLayer = redLayer;
1866 greenLayer.geometry.boundaries =
1867 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1868 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1869
1870 layers.push_back(&greenLayer);
1871
1872 invokeDraw(settings, layers);
1873
1874 // Due to roundedCornersRadius, the corners are untouched.
1875 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1876 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1877 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1878 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1879
1880 // top middle should be green and the bottom middle red
1881 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1882 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1883
1884 // the bottom edge of the green layer should not be rounded
1885 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1886}
1887
Derek Sollenberger547d0a62021-07-27 14:09:17 -04001888TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
1889 initializeRenderEngine();
1890
1891 renderengine::DisplaySettings settings;
1892 settings.physicalDisplay = fullscreenRect();
1893 settings.clip = fullscreenRect();
1894 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1895
1896 std::vector<const renderengine::LayerSettings*> layers;
1897
1898 renderengine::LayerSettings redLayer;
1899 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1900 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
1901 redLayer.geometry.roundedCornersRadius = 64;
1902 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
1903 // Red background.
1904 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1905 redLayer.alpha = 1.0f;
1906
1907 layers.push_back(&redLayer);
1908 invokeDraw(settings, layers);
1909
1910 // Due to roundedCornersRadius, the top corners are untouched.
1911 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1912 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1913
1914 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
1915 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
1916 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
1917
1918 // the bottom middle should be red
1919 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
1920}
1921
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001922TEST_P(RenderEngineTest, testClear) {
1923 initializeRenderEngine();
1924
1925 const auto rect = fullscreenRect();
1926 const renderengine::DisplaySettings display{
1927 .physicalDisplay = rect,
1928 .clip = rect,
1929 };
1930
1931 const renderengine::LayerSettings redLayer{
1932 .geometry.boundaries = rect.toFloatRect(),
1933 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1934 .alpha = 1.0f,
1935 };
1936
1937 // This mimics prepareClearClientComposition. This layer should overwrite
1938 // the redLayer, so that the buffer is transparent, rather than red.
1939 const renderengine::LayerSettings clearLayer{
1940 .geometry.boundaries = rect.toFloatRect(),
1941 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1942 .alpha = 0.0f,
1943 .disableBlending = true,
1944 };
1945
1946 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1947 invokeDraw(display, layers);
1948 expectBufferColor(rect, 0, 0, 0, 0);
1949}
1950
1951TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1952 initializeRenderEngine();
1953
1954 const auto rect = Rect(0, 0, 1, 1);
1955 const renderengine::DisplaySettings display{
1956 .physicalDisplay = rect,
1957 .clip = rect,
1958 };
1959
1960 const renderengine::LayerSettings redLayer{
1961 .geometry.boundaries = rect.toFloatRect(),
1962 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1963 .alpha = 1.0f,
1964 };
1965
1966 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1967 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001968 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001969 {
1970 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001971 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1972 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001973 pixels[0] = 0;
1974 pixels[1] = 255;
1975 pixels[2] = 0;
1976 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001977 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001978 }
1979
1980 const renderengine::LayerSettings greenLayer{
1981 .geometry.boundaries = rect.toFloatRect(),
1982 .source =
1983 renderengine::PixelSource{
1984 .buffer =
1985 renderengine::Buffer{
1986 .buffer = buf,
1987 .usePremultipliedAlpha = true,
1988 },
1989 },
1990 .alpha = 0.5f,
1991 .disableBlending = true,
1992 };
1993
1994 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1995 invokeDraw(display, layers);
1996 expectBufferColor(rect, 0, 128, 0, 128);
1997}
1998
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04001999TEST_P(RenderEngineTest, test_isOpaque) {
2000 initializeRenderEngine();
2001
2002 const auto rect = Rect(0, 0, 1, 1);
2003 const renderengine::DisplaySettings display{
2004 .physicalDisplay = rect,
2005 .clip = rect,
2006 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2007 };
2008
2009 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2010 // should make the green show.
2011 const auto buf = allocateSourceBuffer(1, 1);
2012 {
2013 uint8_t* pixels;
2014 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2015 reinterpret_cast<void**>(&pixels));
2016 pixels[0] = 0;
2017 pixels[1] = 255;
2018 pixels[2] = 0;
2019 pixels[3] = 0;
2020 buf->getBuffer()->unlock();
2021 }
2022
2023 const renderengine::LayerSettings greenLayer{
2024 .geometry.boundaries = rect.toFloatRect(),
2025 .source =
2026 renderengine::PixelSource{
2027 .buffer =
2028 renderengine::Buffer{
2029 .buffer = buf,
2030 // Although the pixels are not
2031 // premultiplied in practice, this
2032 // matches the input we see.
2033 .usePremultipliedAlpha = true,
2034 .isOpaque = true,
2035 },
2036 },
2037 .alpha = 1.0f,
2038 };
2039
2040 std::vector<const renderengine::LayerSettings*> layers{&greenLayer};
2041 invokeDraw(display, layers);
2042
2043 if (GetParam()->useColorManagement()) {
2044 expectBufferColor(rect, 117, 251, 76, 255);
2045 } else {
2046 expectBufferColor(rect, 0, 255, 0, 255);
2047 }
2048}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002049} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002050} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002051
2052// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002053#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"