blob: 72e32ed9fd79f62f3f755ee377e6ae7cccfcd9a1 [file] [log] [blame]
Alec Mouri6e57f682018-09-29 20:45:08 -07001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ana Krulec82ba2ec2020-11-21 13:33:20 -080017#undef LOG_TAG
18#define LOG_TAG "RenderEngineTest"
19
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080020// TODO(b/129481165): remove the #pragma below and fix conversion issues
21#pragma clang diagnostic push
22#pragma clang diagnostic ignored "-Wconversion"
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010023#pragma clang diagnostic ignored "-Wextra"
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080024
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080025#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080026#include <gtest/gtest.h>
Alec Mouria90a5702021-04-16 16:36:21 +000027#include <renderengine/ExternalTexture.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070028#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070029#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070030#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080031
32#include <chrono>
33#include <condition_variable>
34#include <fstream>
35
Alec Mourid43ccab2019-03-13 12:23:45 -070036#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080037#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080038#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070039
Alec Mouri1089aed2018-10-25 21:33:57 -070040constexpr int DEFAULT_DISPLAY_WIDTH = 128;
41constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
42constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080043constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070044
Alec Mouri6e57f682018-09-29 20:45:08 -070045namespace android {
46
Ana Krulec82ba2ec2020-11-21 13:33:20 -080047class RenderEngineFactory {
48public:
49 virtual ~RenderEngineFactory() = default;
50
51 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080052 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
53 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
54 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
55 return nullptr;
56 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080057};
58
59class GLESRenderEngineFactory : public RenderEngineFactory {
60public:
61 std::string name() override { return "GLESRenderEngineFactory"; }
62
Alec Mouric0aae732021-01-12 13:32:18 -080063 renderengine::RenderEngine::RenderEngineType type() {
64 return renderengine::RenderEngine::RenderEngineType::GLES;
65 }
66
67 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
68 return createGLESRenderEngine();
69 }
70
71 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080072 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070073 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080074 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
75 .setImageCacheSize(1)
76 .setUseColorManagerment(false)
77 .setEnableProtectedContext(false)
78 .setPrecacheToneMapperShaderOnly(false)
79 .setSupportsBackgroundBlur(true)
80 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080081 .setRenderEngineType(type())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080082 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080083 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070084 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080085};
Alec Mourid43ccab2019-03-13 12:23:45 -070086
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080087class GLESCMRenderEngineFactory : public RenderEngineFactory {
88public:
89 std::string name() override { return "GLESCMRenderEngineFactory"; }
90
Alec Mouric0aae732021-01-12 13:32:18 -080091 renderengine::RenderEngine::RenderEngineType type() {
92 return renderengine::RenderEngine::RenderEngineType::GLES;
93 }
94
95 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
96 return createGLESRenderEngine();
97 }
98
99 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800100 renderengine::RenderEngineCreationArgs reCreationArgs =
101 renderengine::RenderEngineCreationArgs::Builder()
102 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
103 .setImageCacheSize(1)
104 .setEnableProtectedContext(false)
105 .setPrecacheToneMapperShaderOnly(false)
106 .setSupportsBackgroundBlur(true)
107 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800108 .setRenderEngineType(type())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800109 .setUseColorManagerment(true)
110 .build();
111 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
112 }
113};
114
Alec Mouri0eab3e82020-12-08 18:10:27 -0800115class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
116public:
Alec Mouric0aae732021-01-12 13:32:18 -0800117 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800118
Alec Mouric0aae732021-01-12 13:32:18 -0800119 renderengine::RenderEngine::RenderEngineType type() {
120 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
121 }
122
123 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800124 renderengine::RenderEngineCreationArgs reCreationArgs =
125 renderengine::RenderEngineCreationArgs::Builder()
126 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
127 .setImageCacheSize(1)
128 .setEnableProtectedContext(false)
129 .setPrecacheToneMapperShaderOnly(false)
130 .setSupportsBackgroundBlur(true)
131 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800132 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800133 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800134 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800135 }
136};
137
138class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
139public:
Alec Mouric0aae732021-01-12 13:32:18 -0800140 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800141
Alec Mouric0aae732021-01-12 13:32:18 -0800142 renderengine::RenderEngine::RenderEngineType type() {
143 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
144 }
145
146 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800147 renderengine::RenderEngineCreationArgs reCreationArgs =
148 renderengine::RenderEngineCreationArgs::Builder()
149 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
150 .setImageCacheSize(1)
151 .setEnableProtectedContext(false)
152 .setPrecacheToneMapperShaderOnly(false)
153 .setSupportsBackgroundBlur(true)
154 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800155 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800156 .setUseColorManagerment(true)
157 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800158 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800159 }
160};
161
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800162class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
163public:
Alec Mouria90a5702021-04-16 16:36:21 +0000164 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
165 return std::make_shared<
166 renderengine::
167 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
168 DEFAULT_DISPLAY_HEIGHT,
169 HAL_PIXEL_FORMAT_RGBA_8888, 1,
170 GRALLOC_USAGE_SW_READ_OFTEN |
171 GRALLOC_USAGE_SW_WRITE_OFTEN |
172 GRALLOC_USAGE_HW_RENDER |
173 GRALLOC_USAGE_HW_TEXTURE,
174 "output"),
175 *mRE,
176 renderengine::ExternalTexture::Usage::READABLE |
177 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700178 }
179
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800180 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000181 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
182 uint32_t height) {
183 return std::make_shared<
184 renderengine::
185 ExternalTexture>(new GraphicBuffer(width, height,
186 HAL_PIXEL_FORMAT_RGBA_8888, 1,
187 GRALLOC_USAGE_SW_READ_OFTEN |
188 GRALLOC_USAGE_SW_WRITE_OFTEN |
189 GRALLOC_USAGE_HW_TEXTURE,
190 "input"),
191 *mRE,
192 renderengine::ExternalTexture::Usage::READABLE |
193 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800194 }
195
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800196 RenderEngineTest() {
197 const ::testing::TestInfo* const test_info =
198 ::testing::UnitTest::GetInstance()->current_test_info();
199 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800200 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700201
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800202 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800203 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
204 writeBufferToFile("/data/texture_out_");
205 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800206 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800207 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800208 if (mGLESRE != nullptr) {
209 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
210 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800211 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800212 const ::testing::TestInfo* const test_info =
213 ::testing::UnitTest::GetInstance()->current_test_info();
214 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800215 }
216
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800217 void writeBufferToFile(const char* basename) {
218 std::string filename(basename);
219 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
220 filename.append(".ppm");
221 std::ofstream file(filename.c_str(), std::ios::binary);
222 if (!file.is_open()) {
223 ALOGE("Unable to open file: %s", filename.c_str());
224 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
225 "surfaceflinger to write debug images");
226 return;
227 }
228
Alec Mouri1089aed2018-10-25 21:33:57 -0700229 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000230 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
231 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700232
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800233 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000234 file << mBuffer->getBuffer()->getWidth() << "\n";
235 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800236 file << 255 << "\n";
237
Alec Mouria90a5702021-04-16 16:36:21 +0000238 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
239 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800240 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
241
Alec Mouria90a5702021-04-16 16:36:21 +0000242 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
243 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
244 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800245 // Only copy R, G and B components
246 outPtr[0] = src[0];
247 outPtr[1] = src[1];
248 outPtr[2] = src[2];
249 outPtr += 3;
250
251 src += 4;
252 }
253 }
254 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000255 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800256 }
257
258 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
259 size_t c;
260 Rect const* rect = region.getArray(&c);
261 for (size_t i = 0; i < c; i++, rect++) {
262 expectBufferColor(*rect, r, g, b, a);
263 }
264 }
265
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400266 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
267 uint8_t tolerance = 0) {
268 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
269 }
270
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800271 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
272 uint8_t tolerance = 0) {
273 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
274 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
275 uint8_t tmp = a >= b ? a - b : b - a;
276 return tmp <= tolerance;
277 };
278 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700279 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800280
281 expectBufferColor(rect, r, g, b, a, colorCompare);
282 }
283
284 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
285 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
286 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000287 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
288 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700289 int32_t maxFails = 10;
290 int32_t fails = 0;
291 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000292 const uint8_t* src = pixels +
293 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700294 for (int32_t i = 0; i < region.getWidth(); i++) {
295 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800296 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700297 EXPECT_TRUE(equal)
298 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
299 << "expected (" << static_cast<uint32_t>(r) << ", "
300 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
301 << static_cast<uint32_t>(a) << "), "
302 << "got (" << static_cast<uint32_t>(src[0]) << ", "
303 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
304 << ", " << static_cast<uint32_t>(src[3]) << ")";
305 src += 4;
306 if (!equal && ++fails >= maxFails) {
307 break;
308 }
309 }
310 if (fails >= maxFails) {
311 break;
312 }
313 }
Alec Mouria90a5702021-04-16 16:36:21 +0000314 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700315 }
316
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800317 void expectAlpha(const Rect& rect, uint8_t a) {
318 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
319 return colorA[3] == colorB[3];
320 };
321 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
322 }
323
324 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
325 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
326 const ubyte4& backgroundColor) {
327 const Rect casterRect(castingLayer.geometry.boundaries);
328 Region casterRegion = Region(casterRect);
329 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
330 if (casterCornerRadius > 0.0f) {
331 // ignore the corners if a corner radius is set
332 Rect cornerRect(casterCornerRadius, casterCornerRadius);
333 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
334 casterRegion.subtractSelf(
335 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
336 casterRegion.subtractSelf(
337 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
338 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
339 casterRect.bottom - casterCornerRadius));
340 }
341
342 const float shadowInset = shadow.length * -1.0f;
343 const Rect casterWithShadow =
344 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
345 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
346 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
347
348 // verify casting layer
349 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
350
351 // verify shadows by testing just the alpha since its difficult to validate the shadow color
352 size_t c;
353 Rect const* r = shadowRegion.getArray(&c);
354 for (size_t i = 0; i < c; i++, r++) {
355 expectAlpha(*r, 255);
356 }
357
358 // verify background
359 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
360 backgroundColor.a);
361 }
362
Alec Mouribd17b3b2020-12-17 11:08:30 -0800363 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
364 const renderengine::ShadowSettings& shadow,
365 const ubyte4& backgroundColor) {
366 const float shadowInset = shadow.length * -1.0f;
367 const Rect casterRect(casterBounds);
368 const Rect shadowRect =
369 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
370
371 const Region backgroundRegion =
372 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
373
374 expectAlpha(shadowRect, 255);
375 // (0, 0, 0) fill on the bounds of the layer should be ignored.
376 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
377
378 // verify background
379 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
380 backgroundColor.a);
381 }
382
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800383 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
384 bool casterIsTranslucent) {
385 renderengine::ShadowSettings shadow;
386 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
387 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
388 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
389 shadow.lightRadius = 0.0f;
390 shadow.length = shadowLength;
391 shadow.casterIsTranslucent = casterIsTranslucent;
392 return shadow;
393 }
394
Alec Mouri1089aed2018-10-25 21:33:57 -0700395 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
396
397 static Rect offsetRect() {
398 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
399 DEFAULT_DISPLAY_HEIGHT);
400 }
401
402 static Rect offsetRectAtZero() {
403 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
404 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
405 }
406
Alec Mourid43ccab2019-03-13 12:23:45 -0700407 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800408 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700409 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800410 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800411 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700412
413 int fd = fence.release();
414 if (fd >= 0) {
415 sync_wait(fd, -1);
416 close(fd);
417 }
418
419 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800420 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000421 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700422 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700423 }
424
Alec Mourid43ccab2019-03-13 12:23:45 -0700425 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700426 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800427 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800428 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700429 }
430
Alec Mouri1089aed2018-10-25 21:33:57 -0700431 template <typename SourceVariant>
432 void fillBuffer(half r, half g, half b, half a);
433
434 template <typename SourceVariant>
435 void fillRedBuffer();
436
437 template <typename SourceVariant>
438 void fillGreenBuffer();
439
440 template <typename SourceVariant>
441 void fillBlueBuffer();
442
443 template <typename SourceVariant>
444 void fillRedTransparentBuffer();
445
446 template <typename SourceVariant>
447 void fillRedOffsetBuffer();
448
449 template <typename SourceVariant>
450 void fillBufferPhysicalOffset();
451
452 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700453 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700454
455 template <typename SourceVariant>
456 void fillBufferCheckersRotate0();
457
458 template <typename SourceVariant>
459 void fillBufferCheckersRotate90();
460
461 template <typename SourceVariant>
462 void fillBufferCheckersRotate180();
463
464 template <typename SourceVariant>
465 void fillBufferCheckersRotate270();
466
467 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800468 void fillBufferWithLayerTransform();
469
470 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700471 void fillBufferLayerTransform();
472
473 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800474 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800475
476 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700477 void fillBufferColorTransform();
478
Alec Mouri7c94edb2018-12-03 21:23:26 -0800479 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800480 void fillBufferWithColorTransformZeroLayerAlpha();
481
482 template <typename SourceVariant>
483 void fillBufferColorTransformZeroLayerAlpha();
484
485 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800486 void fillRedBufferWithRoundedCorners();
487
488 template <typename SourceVariant>
489 void fillBufferWithRoundedCorners();
490
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000491 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800492 void fillBufferAndBlurBackground();
493
494 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700495 void fillSmallLayerAndBlurBackground();
496
497 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000498 void overlayCorners();
499
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800500 void fillRedBufferTextureTransform();
501
502 void fillBufferTextureTransform();
503
504 void fillRedBufferWithPremultiplyAlpha();
505
506 void fillBufferWithPremultiplyAlpha();
507
508 void fillRedBufferWithoutPremultiplyAlpha();
509
510 void fillBufferWithoutPremultiplyAlpha();
511
Alec Mouriac335532018-11-12 15:01:33 -0800512 void fillGreenColorBufferThenClearRegion();
513
514 void clearLeftRegion();
515
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000516 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800517
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800518 template <typename SourceVariant>
519 void drawShadow(const renderengine::LayerSettings& castingLayer,
520 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
521 const ubyte4& backgroundColor);
522
Alec Mouribd17b3b2020-12-17 11:08:30 -0800523 void drawShadowWithoutCaster(const FloatRect& castingBounds,
524 const renderengine::ShadowSettings& shadow,
525 const ubyte4& backgroundColor);
526
Alec Mouric0aae732021-01-12 13:32:18 -0800527 void initializeRenderEngine();
528
529 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000530 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800531 // GLESRenderEngine for testing GLES-specific behavior.
532 // Owened by mRE, but this is downcasted.
533 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800534
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800535 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700536};
537
Alec Mouric0aae732021-01-12 13:32:18 -0800538void RenderEngineTest::initializeRenderEngine() {
539 const auto& renderEngineFactory = GetParam();
540 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
541 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
542 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
543 // every time.
544 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
545 renderEngineFactory->createGLESRenderEngine();
546 mGLESRE = renderEngine.get();
547 mRE = std::move(renderEngine);
548 } else {
549 mRE = renderEngineFactory->createRenderEngine();
550 }
Alec Mouria90a5702021-04-16 16:36:21 +0000551 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800552}
553
Alec Mouri1089aed2018-10-25 21:33:57 -0700554struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800555 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800556 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700557 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800558 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700559 }
560};
561
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800562struct RelaxOpaqueBufferVariant {
563 static void setOpaqueBit(renderengine::LayerSettings& layer) {
564 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800565 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800566 }
567
568 static uint8_t getAlphaChannel() { return 255; }
569};
570
571struct ForceOpaqueBufferVariant {
572 static void setOpaqueBit(renderengine::LayerSettings& layer) {
573 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800574 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800575 }
576
577 static uint8_t getAlphaChannel() {
578 // The isOpaque bit will override the alpha channel, so this should be
579 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800580 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800581 }
582};
583
584template <typename OpaquenessVariant>
585struct BufferSourceVariant {
586 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800587 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000588 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800589 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800590 fixture->mRE->genTextures(1, &texName);
591 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800592
593 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000594 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
595 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800596
Alec Mouria90a5702021-04-16 16:36:21 +0000597 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
598 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
599 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800600 iter[0] = uint8_t(r * 255);
601 iter[1] = uint8_t(g * 255);
602 iter[2] = uint8_t(b * 255);
603 iter[3] = OpaquenessVariant::getAlphaChannel();
604 iter += 4;
605 }
606 }
607
Alec Mouria90a5702021-04-16 16:36:21 +0000608 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800609
610 layer.source.buffer.buffer = buf;
611 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800612 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800613 OpaquenessVariant::setOpaqueBit(layer);
614 }
615};
616
Alec Mouri1089aed2018-10-25 21:33:57 -0700617template <typename SourceVariant>
618void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
619 renderengine::DisplaySettings settings;
620 settings.physicalDisplay = fullscreenRect();
621 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800622 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700623
Vishnu Nair9b079a22020-01-21 14:36:08 -0800624 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700625
626 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800627 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700628 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800629 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700630 layer.alpha = a;
631
Vishnu Nair9b079a22020-01-21 14:36:08 -0800632 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700633
Alec Mouric0aae732021-01-12 13:32:18 -0800634 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700635}
636
637template <typename SourceVariant>
638void RenderEngineTest::fillRedBuffer() {
639 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
640 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
641}
642
643template <typename SourceVariant>
644void RenderEngineTest::fillGreenBuffer() {
645 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
646 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
647}
648
649template <typename SourceVariant>
650void RenderEngineTest::fillBlueBuffer() {
651 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
652 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
653}
654
655template <typename SourceVariant>
656void RenderEngineTest::fillRedTransparentBuffer() {
657 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
658 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
659}
660
661template <typename SourceVariant>
662void RenderEngineTest::fillRedOffsetBuffer() {
663 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800664 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700665 settings.physicalDisplay = offsetRect();
666 settings.clip = offsetRectAtZero();
667
Vishnu Nair9b079a22020-01-21 14:36:08 -0800668 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700669
670 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800671 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700672 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800673 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700674 layer.alpha = 1.0f;
675
Vishnu Nair9b079a22020-01-21 14:36:08 -0800676 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800677 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700678}
679
680template <typename SourceVariant>
681void RenderEngineTest::fillBufferPhysicalOffset() {
682 fillRedOffsetBuffer<SourceVariant>();
683
684 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
685 DEFAULT_DISPLAY_HEIGHT),
686 255, 0, 0, 255);
687 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
688 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
689
690 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
691 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
692}
693
694template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700695void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700696 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800697 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700698 settings.physicalDisplay = fullscreenRect();
699 // Here logical space is 2x2
700 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700701 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700702
Vishnu Nair9b079a22020-01-21 14:36:08 -0800703 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700704
705 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700707 Rect rectOne(0, 0, 1, 1);
708 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800709 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700710 layerOne.alpha = 1.0f;
711
712 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800713 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700714 Rect rectTwo(0, 1, 1, 2);
715 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800716 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700717 layerTwo.alpha = 1.0f;
718
719 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800720 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700721 Rect rectThree(1, 0, 2, 1);
722 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800723 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700724 layerThree.alpha = 1.0f;
725
Vishnu Nair9b079a22020-01-21 14:36:08 -0800726 layers.push_back(&layerOne);
727 layers.push_back(&layerTwo);
728 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700729
Alec Mouric0aae732021-01-12 13:32:18 -0800730 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700731}
732
733template <typename SourceVariant>
734void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700735 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700736 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
737 255);
738 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
739 DEFAULT_DISPLAY_HEIGHT / 2),
740 0, 0, 255, 255);
741 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
742 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
743 0, 0, 0, 0);
744 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
745 DEFAULT_DISPLAY_HEIGHT),
746 0, 255, 0, 255);
747}
748
749template <typename SourceVariant>
750void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700751 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700752 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
753 255);
754 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
755 DEFAULT_DISPLAY_HEIGHT / 2),
756 255, 0, 0, 255);
757 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
758 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
759 0, 0, 255, 255);
760 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
761 DEFAULT_DISPLAY_HEIGHT),
762 0, 0, 0, 0);
763}
764
765template <typename SourceVariant>
766void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700767 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700768 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
769 0);
770 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
771 DEFAULT_DISPLAY_HEIGHT / 2),
772 0, 255, 0, 255);
773 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
774 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
775 255, 0, 0, 255);
776 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
777 DEFAULT_DISPLAY_HEIGHT),
778 0, 0, 255, 255);
779}
780
781template <typename SourceVariant>
782void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700783 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700784 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
785 255);
786 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
787 DEFAULT_DISPLAY_HEIGHT / 2),
788 0, 0, 0, 0);
789 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
790 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
791 0, 255, 0, 255);
792 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
793 DEFAULT_DISPLAY_HEIGHT),
794 255, 0, 0, 255);
795}
796
797template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800798void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700799 renderengine::DisplaySettings settings;
800 settings.physicalDisplay = fullscreenRect();
801 // Here logical space is 2x2
802 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800803 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700804
Vishnu Nair9b079a22020-01-21 14:36:08 -0800805 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700806
807 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800808 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700809 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
810 // Translate one pixel diagonally
811 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 -0800812 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700813 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
814 layer.alpha = 1.0f;
815
Vishnu Nair9b079a22020-01-21 14:36:08 -0800816 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700817
Alec Mouric0aae732021-01-12 13:32:18 -0800818 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800819}
Alec Mouri1089aed2018-10-25 21:33:57 -0700820
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800821template <typename SourceVariant>
822void RenderEngineTest::fillBufferLayerTransform() {
823 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700824 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
825 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
826 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
827 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
828 255, 0, 0, 255);
829}
830
831template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800832void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700833 renderengine::DisplaySettings settings;
834 settings.physicalDisplay = fullscreenRect();
835 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800836 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700837
Vishnu Nair9b079a22020-01-21 14:36:08 -0800838 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700839
840 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800841 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700842 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800843 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700844 layer.alpha = 1.0f;
845
846 // construct a fake color matrix
847 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800848 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700849 // set red channel to red + green
850 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
851
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800852 layer.alpha = 1.0f;
853 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
854
Vishnu Nair9b079a22020-01-21 14:36:08 -0800855 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700856
Alec Mouric0aae732021-01-12 13:32:18 -0800857 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800858}
Alec Mouri1089aed2018-10-25 21:33:57 -0700859
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800860template <typename SourceVariant>
861void RenderEngineTest::fillBufferColorTransform() {
862 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800863 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
864}
865
866template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800867void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
868 renderengine::DisplaySettings settings;
869 settings.physicalDisplay = fullscreenRect();
870 settings.clip = Rect(1, 1);
871
872 std::vector<const renderengine::LayerSettings*> layers;
873
874 renderengine::LayerSettings layer;
875 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
876 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
877 layer.alpha = 0;
878
879 // construct a fake color matrix
880 // simple inverse color
881 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
882
883 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
884
885 layers.push_back(&layer);
886
Alec Mouric0aae732021-01-12 13:32:18 -0800887 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800888}
889
890template <typename SourceVariant>
891void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
892 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
893 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
894}
895
896template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800897void RenderEngineTest::fillRedBufferWithRoundedCorners() {
898 renderengine::DisplaySettings settings;
899 settings.physicalDisplay = fullscreenRect();
900 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800901 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800902
Vishnu Nair9b079a22020-01-21 14:36:08 -0800903 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800904
905 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800906 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800907 layer.geometry.boundaries = fullscreenRect().toFloatRect();
908 layer.geometry.roundedCornersRadius = 5.0f;
909 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
910 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
911 layer.alpha = 1.0f;
912
Vishnu Nair9b079a22020-01-21 14:36:08 -0800913 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800914
Alec Mouric0aae732021-01-12 13:32:18 -0800915 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800916}
917
918template <typename SourceVariant>
919void RenderEngineTest::fillBufferWithRoundedCorners() {
920 fillRedBufferWithRoundedCorners<SourceVariant>();
921 // Corners should be ignored...
922 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
923 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
924 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
925 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
926 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
927 0, 0, 0, 0);
928 // ...And the non-rounded portion should be red.
929 // Other pixels may be anti-aliased, so let's not check those.
930 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
931 255);
932}
933
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000934template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800935void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800936 auto blurRadius = 50;
937 auto center = DEFAULT_DISPLAY_WIDTH / 2;
938
939 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800940 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800941 settings.physicalDisplay = fullscreenRect();
942 settings.clip = fullscreenRect();
943
Vishnu Nair9b079a22020-01-21 14:36:08 -0800944 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800945
946 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800947 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800948 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
949 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
950 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800951 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800952
953 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800954 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800955 leftLayer.geometry.boundaries =
956 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
957 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
958 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800959 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960
961 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800962 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800963 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
964 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500965 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800966 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800967 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800968
Alec Mouric0aae732021-01-12 13:32:18 -0800969 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800970
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500971 // solid color
972 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
973
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500974 if (mRE->supportsBackgroundBlur()) {
975 // blurred color (downsampling should result in the center color being close to 128)
976 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400977 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500978 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800979}
980
981template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700982void RenderEngineTest::fillSmallLayerAndBlurBackground() {
983 auto blurRadius = 50;
984 renderengine::DisplaySettings settings;
985 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
986 settings.physicalDisplay = fullscreenRect();
987 settings.clip = fullscreenRect();
988
989 std::vector<const renderengine::LayerSettings*> layers;
990
991 renderengine::LayerSettings backgroundLayer;
992 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
993 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
994 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
995 backgroundLayer.alpha = 1.0f;
996 layers.push_back(&backgroundLayer);
997
998 renderengine::LayerSettings blurLayer;
999 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1000 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1001 blurLayer.backgroundBlurRadius = blurRadius;
1002 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1003 blurLayer.alpha = 0;
1004 layers.push_back(&blurLayer);
1005
1006 invokeDraw(settings, layers);
1007
1008 // Give a generous tolerance - the blur rectangle is very small and this test is
1009 // mainly concerned with ensuring that there's no device failure.
1010 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1011 40 /* tolerance */);
1012}
1013
1014template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001015void RenderEngineTest::overlayCorners() {
1016 renderengine::DisplaySettings settings;
1017 settings.physicalDisplay = fullscreenRect();
1018 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001019 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001020
Vishnu Nair9b079a22020-01-21 14:36:08 -08001021 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001022
1023 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001024 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001025 layerOne.geometry.boundaries =
1026 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1027 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1028 layerOne.alpha = 0.2;
1029
Vishnu Nair9b079a22020-01-21 14:36:08 -08001030 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001031 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001032 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1033 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1034 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1035 0, 0, 0, 0);
1036
Vishnu Nair9b079a22020-01-21 14:36:08 -08001037 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001038 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001039 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001040 layerTwo.geometry.boundaries =
1041 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1042 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1043 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1044 layerTwo.alpha = 1.0f;
1045
Vishnu Nair9b079a22020-01-21 14:36:08 -08001046 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001047 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001048
1049 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1050 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1051 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1052 0, 255, 0, 255);
1053}
1054
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001055void RenderEngineTest::fillRedBufferTextureTransform() {
1056 renderengine::DisplaySettings settings;
1057 settings.physicalDisplay = fullscreenRect();
1058 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001059 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001060
Vishnu Nair9b079a22020-01-21 14:36:08 -08001061 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001062
1063 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001064 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001065 // Here will allocate a checker board texture, but transform texture
1066 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001067 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001068 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001069 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070 this->mTexNames.push_back(texName);
1071
1072 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001073 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1074 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001075 // Red top left, Green top right, Blue bottom left, Black bottom right
1076 pixels[0] = 255;
1077 pixels[1] = 0;
1078 pixels[2] = 0;
1079 pixels[3] = 255;
1080 pixels[4] = 0;
1081 pixels[5] = 255;
1082 pixels[6] = 0;
1083 pixels[7] = 255;
1084 pixels[8] = 0;
1085 pixels[9] = 0;
1086 pixels[10] = 255;
1087 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001088 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001089
1090 layer.source.buffer.buffer = buf;
1091 layer.source.buffer.textureName = texName;
1092 // Transform coordinates to only be inside the red quadrant.
1093 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1094 layer.alpha = 1.0f;
1095 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1096
Vishnu Nair9b079a22020-01-21 14:36:08 -08001097 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001098
Alec Mouric0aae732021-01-12 13:32:18 -08001099 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001100}
1101
1102void RenderEngineTest::fillBufferTextureTransform() {
1103 fillRedBufferTextureTransform();
1104 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1105}
1106
1107void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1108 renderengine::DisplaySettings settings;
1109 settings.physicalDisplay = fullscreenRect();
1110 // Here logical space is 1x1
1111 settings.clip = Rect(1, 1);
1112
Vishnu Nair9b079a22020-01-21 14:36:08 -08001113 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001114
1115 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001116 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001117 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001118 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001119 this->mTexNames.push_back(texName);
1120
1121 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001122 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1123 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001124 pixels[0] = 255;
1125 pixels[1] = 0;
1126 pixels[2] = 0;
1127 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001128 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001129
1130 layer.source.buffer.buffer = buf;
1131 layer.source.buffer.textureName = texName;
1132 layer.source.buffer.usePremultipliedAlpha = true;
1133 layer.alpha = 0.5f;
1134 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1135
Vishnu Nair9b079a22020-01-21 14:36:08 -08001136 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001137
Alec Mouric0aae732021-01-12 13:32:18 -08001138 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001139}
1140
1141void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1142 fillRedBufferWithPremultiplyAlpha();
1143 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1144}
1145
1146void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1147 renderengine::DisplaySettings settings;
1148 settings.physicalDisplay = fullscreenRect();
1149 // Here logical space is 1x1
1150 settings.clip = Rect(1, 1);
1151
Vishnu Nair9b079a22020-01-21 14:36:08 -08001152 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001153
1154 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001155 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001156 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001157 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001158 this->mTexNames.push_back(texName);
1159
1160 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001161 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1162 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001163 pixels[0] = 255;
1164 pixels[1] = 0;
1165 pixels[2] = 0;
1166 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001167 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001168
1169 layer.source.buffer.buffer = buf;
1170 layer.source.buffer.textureName = texName;
1171 layer.source.buffer.usePremultipliedAlpha = false;
1172 layer.alpha = 0.5f;
1173 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1174
Vishnu Nair9b079a22020-01-21 14:36:08 -08001175 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001176
Alec Mouric0aae732021-01-12 13:32:18 -08001177 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001178}
1179
1180void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1181 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001182 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001183}
1184
Alec Mouriac335532018-11-12 15:01:33 -08001185void RenderEngineTest::clearLeftRegion() {
1186 renderengine::DisplaySettings settings;
1187 settings.physicalDisplay = fullscreenRect();
1188 // Here logical space is 4x4
1189 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001190 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001191 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001192 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001193 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001194 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001195 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001196}
1197
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001198void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001199 // Reuse mBuffer
1200 clearLeftRegion();
1201 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1202 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1203 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001204 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001205}
1206
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001207template <typename SourceVariant>
1208void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1209 const renderengine::ShadowSettings& shadow,
1210 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1211 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001212 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001213 settings.physicalDisplay = fullscreenRect();
1214 settings.clip = fullscreenRect();
1215
Vishnu Nair9b079a22020-01-21 14:36:08 -08001216 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001217
1218 // add background layer
1219 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001220 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001221 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1222 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1223 backgroundColor.b / 255.0f, this);
1224 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001225 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001226
1227 // add shadow layer
1228 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001229 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001230 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1231 shadowLayer.alpha = castingLayer.alpha;
1232 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001233 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001234
1235 // add layer casting the shadow
1236 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001237 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001238 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1239 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001240 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001241
Alec Mouric0aae732021-01-12 13:32:18 -08001242 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001243}
1244
Alec Mouribd17b3b2020-12-17 11:08:30 -08001245void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1246 const renderengine::ShadowSettings& shadow,
1247 const ubyte4& backgroundColor) {
1248 renderengine::DisplaySettings settings;
1249 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1250 settings.physicalDisplay = fullscreenRect();
1251 settings.clip = fullscreenRect();
1252
1253 std::vector<const renderengine::LayerSettings*> layers;
1254
1255 // add background layer
1256 renderengine::LayerSettings bgLayer;
1257 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1258 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1259 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1260 backgroundColor.b / 255.0f, this);
1261 bgLayer.alpha = backgroundColor.a / 255.0f;
1262 layers.push_back(&bgLayer);
1263
1264 // add shadow layer
1265 renderengine::LayerSettings shadowLayer;
1266 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1267 shadowLayer.geometry.boundaries = castingBounds;
1268 shadowLayer.alpha = 1.0f;
1269 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1270 shadowLayer.shadow = shadow;
1271 layers.push_back(&shadowLayer);
1272
Alec Mouric0aae732021-01-12 13:32:18 -08001273 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001274}
1275
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001276INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001277 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001278 std::make_shared<GLESCMRenderEngineFactory>(),
1279 std::make_shared<SkiaGLESRenderEngineFactory>(),
1280 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001281
1282TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001283 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001284 drawEmptyLayers();
1285}
1286
Ana Krulec07b98df2021-01-07 14:38:40 -08001287TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001288 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001289
1290 renderengine::DisplaySettings settings;
1291 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1292 settings.physicalDisplay = fullscreenRect();
1293 settings.clip = fullscreenRect();
1294
1295 // 255, 255, 255, 255 is full opaque white.
1296 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1297 // Create layer with given color.
1298 renderengine::LayerSettings bgLayer;
1299 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1300 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1301 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1302 backgroundColor.b / 255.0f);
1303 bgLayer.alpha = backgroundColor.a / 255.0f;
1304 // Transform the red color.
1305 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1306
1307 std::vector<const renderengine::LayerSettings*> layers;
1308 layers.push_back(&bgLayer);
1309
Alec Mouric0aae732021-01-12 13:32:18 -08001310 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001311
1312 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001313 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001314 backgroundColor.a);
1315}
1316
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001317TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001318 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001319
Alec Mourid43ccab2019-03-13 12:23:45 -07001320 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001321 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001322 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001323 renderengine::LayerSettings layer;
1324 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1325 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001326 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001327 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001328 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001329
1330 ASSERT_EQ(BAD_VALUE, status);
1331}
1332
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001333TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001334 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001335
Alec Mourid43ccab2019-03-13 12:23:45 -07001336 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001337 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001338 settings.physicalDisplay = fullscreenRect();
1339 settings.clip = fullscreenRect();
1340
Vishnu Nair9b079a22020-01-21 14:36:08 -08001341 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001342 renderengine::LayerSettings layer;
1343 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1344 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1345 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001346 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001347
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001348 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001349 ASSERT_EQ(NO_ERROR, status);
1350 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1351}
1352
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001353TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1354 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001355
1356 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1357 // GLES-specific test
1358 return;
1359 }
1360
1361 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001362
Alec Mourife0d72b2019-03-21 14:05:56 -07001363 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001364 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001365 settings.physicalDisplay = fullscreenRect();
1366 settings.clip = fullscreenRect();
1367
Vishnu Nair9b079a22020-01-21 14:36:08 -08001368 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001369 renderengine::LayerSettings layer;
1370 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1371 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1372 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001373 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001374
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001375 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001376 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001377 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001378 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1379}
1380
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001381TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001382 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001383 fillRedBuffer<ColorSourceVariant>();
1384}
1385
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001386TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001387 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001388 fillGreenBuffer<ColorSourceVariant>();
1389}
1390
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001391TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001392 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001393 fillBlueBuffer<ColorSourceVariant>();
1394}
1395
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001396TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001397 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001398 fillRedTransparentBuffer<ColorSourceVariant>();
1399}
1400
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001401TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001402 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001403 fillBufferPhysicalOffset<ColorSourceVariant>();
1404}
1405
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001406TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001407 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001408 fillBufferCheckersRotate0<ColorSourceVariant>();
1409}
1410
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001411TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001412 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001413 fillBufferCheckersRotate90<ColorSourceVariant>();
1414}
1415
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001416TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001417 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001418 fillBufferCheckersRotate180<ColorSourceVariant>();
1419}
1420
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001421TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001422 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001423 fillBufferCheckersRotate270<ColorSourceVariant>();
1424}
1425
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001427 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001428 fillBufferLayerTransform<ColorSourceVariant>();
1429}
1430
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001431TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001432 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001433 fillBufferColorTransform<ColorSourceVariant>();
1434}
1435
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001436TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001437 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001438 fillBufferWithRoundedCorners<ColorSourceVariant>();
1439}
1440
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001441TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001442 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001443 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1444}
1445
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001446TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001447 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001448 fillBufferAndBlurBackground<ColorSourceVariant>();
1449}
1450
Alec Mourie8489fd2021-04-29 16:08:56 -07001451TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1452 initializeRenderEngine();
1453 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1454}
1455
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001456TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001457 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001458 overlayCorners<ColorSourceVariant>();
1459}
1460
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001461TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001462 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001463 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1464}
1465
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001466TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001467 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001468 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1469}
1470
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001471TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001472 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001473 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1474}
1475
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001476TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001477 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001478 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1479}
1480
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001481TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001482 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001483 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1484}
1485
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001486TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001487 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001488 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1489}
1490
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001491TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001492 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001493 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1494}
1495
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001496TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001497 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001498 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1499}
1500
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001501TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001502 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001503 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1504}
1505
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001506TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001507 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001508 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1509}
1510
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001511TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001512 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001513 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1514}
1515
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001516TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001517 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001518 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1519}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001520
Alec Mouric0aae732021-01-12 13:32:18 -08001521TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1522 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001523 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1524}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001525
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001526TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001527 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001528 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1529}
1530
Alec Mourie8489fd2021-04-29 16:08:56 -07001531TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1532 initializeRenderEngine();
1533 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1534}
1535
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001536TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001537 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001538 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1539}
1540
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001541TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001542 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001543 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1544}
1545
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001546TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001547 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001548 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1549}
1550
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001551TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001552 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001553 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1554}
1555
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001556TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001557 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001558 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1559}
1560
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001561TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001562 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001563 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1564}
1565
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001566TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001567 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001568 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1569}
1570
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001571TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001572 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001573 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1574}
1575
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001576TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001577 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001578 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1579}
1580
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001581TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001582 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001583 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1584}
1585
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001586TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001587 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001588 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1589}
1590
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001591TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001592 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001593 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1594}
1595
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001596TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001597 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001598 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1599}
1600
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001601TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001602 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001603 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1604}
1605
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001606TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001607 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001608 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1609}
1610
Alec Mourie8489fd2021-04-29 16:08:56 -07001611TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1612 initializeRenderEngine();
1613 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1614}
1615
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001616TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001617 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001618 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1619}
1620
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001621TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001622 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001623 fillBufferTextureTransform();
1624}
1625
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001626TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001627 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001628 fillBufferWithPremultiplyAlpha();
1629}
1630
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001631TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001632 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001633 fillBufferWithoutPremultiplyAlpha();
1634}
1635
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001636TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001637 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001638 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001639}
1640
Alec Mouribd17b3b2020-12-17 11:08:30 -08001641TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001642 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001643
1644 const ubyte4 backgroundColor(255, 255, 255, 255);
1645 const float shadowLength = 5.0f;
1646 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1647 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1648 renderengine::ShadowSettings settings =
1649 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1650 false /* casterIsTranslucent */);
1651
1652 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1653 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1654}
1655
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001656TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001657 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001658
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001659 const ubyte4 casterColor(255, 0, 0, 255);
1660 const ubyte4 backgroundColor(255, 255, 255, 255);
1661 const float shadowLength = 5.0f;
1662 Rect casterBounds(1, 1);
1663 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1664 renderengine::LayerSettings castingLayer;
1665 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1666 castingLayer.alpha = 1.0f;
1667 renderengine::ShadowSettings settings =
1668 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1669 false /* casterIsTranslucent */);
1670
1671 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1672 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1673}
1674
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001675TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001676 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001677
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001678 const ubyte4 casterColor(255, 0, 0, 255);
1679 const ubyte4 backgroundColor(255, 255, 255, 255);
1680 const float shadowLength = 5.0f;
1681 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1682 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1683 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001684 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001685 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1686 castingLayer.alpha = 1.0f;
1687 renderengine::ShadowSettings settings =
1688 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1689 false /* casterIsTranslucent */);
1690
1691 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1692 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1693}
1694
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001695TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001696 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001697
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001698 const ubyte4 casterColor(255, 0, 0, 255);
1699 const ubyte4 backgroundColor(255, 255, 255, 255);
1700 const float shadowLength = 5.0f;
1701 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1702 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1703 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001704 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001705 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1706 castingLayer.alpha = 1.0f;
1707 renderengine::ShadowSettings settings =
1708 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1709 false /* casterIsTranslucent */);
1710
1711 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1712 backgroundColor);
1713 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1714}
1715
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001716TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001717 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001718
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001719 const ubyte4 casterColor(255, 0, 0, 255);
1720 const ubyte4 backgroundColor(255, 255, 255, 255);
1721 const float shadowLength = 5.0f;
1722 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1723 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1724 renderengine::LayerSettings castingLayer;
1725 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1726 castingLayer.geometry.roundedCornersRadius = 3.0f;
1727 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1728 castingLayer.alpha = 1.0f;
1729 renderengine::ShadowSettings settings =
1730 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1731 false /* casterIsTranslucent */);
1732
1733 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1734 backgroundColor);
1735 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1736}
1737
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001738TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001739 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001740
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001741 const ubyte4 casterColor(255, 0, 0, 255);
1742 const ubyte4 backgroundColor(255, 255, 255, 255);
1743 const float shadowLength = 5.0f;
1744 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1745 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1746 renderengine::LayerSettings castingLayer;
1747 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1748 castingLayer.alpha = 0.5f;
1749 renderengine::ShadowSettings settings =
1750 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1751 true /* casterIsTranslucent */);
1752
1753 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1754 backgroundColor);
1755
1756 // verify only the background since the shadow will draw behind the caster
1757 const float shadowInset = settings.length * -1.0f;
1758 const Rect casterWithShadow =
1759 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1760 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1761 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1762 backgroundColor.a);
1763}
1764
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001765TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1766 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001767
1768 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1769 // GLES-specific test
1770 return;
1771 }
1772
1773 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001774
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001775 renderengine::DisplaySettings settings;
1776 settings.physicalDisplay = fullscreenRect();
1777 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001778 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001779
1780 std::vector<const renderengine::LayerSettings*> layers;
1781 renderengine::LayerSettings layer;
1782 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1783 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1784 layer.alpha = 1.0;
1785 layers.push_back(&layer);
1786
1787 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001788 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001789 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001790 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001791
1792 const int fd = fenceTwo.get();
1793 if (fd >= 0) {
1794 sync_wait(fd, -1);
1795 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001796 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001797 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001798 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001799 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001800 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1801}
1802
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001803TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1804 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001805
1806 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1807 // GLES-specific test
1808 return;
1809 }
1810
1811 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001812
Alec Mouri368e1582020-08-13 10:14:29 -07001813 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001814 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001815 settings.physicalDisplay = fullscreenRect();
1816 settings.clip = fullscreenRect();
1817
1818 std::vector<const renderengine::LayerSettings*> layers;
1819 renderengine::LayerSettings layer;
1820 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1821 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1822 layer.alpha = 1.0;
1823 layers.push_back(&layer);
1824
1825 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001826 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001827
1828 const int fd = fence.get();
1829 if (fd >= 0) {
1830 sync_wait(fd, -1);
1831 }
1832
Alec Mouria90a5702021-04-16 16:36:21 +00001833 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001834 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001835 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1836 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001837
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001838 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001839
1840 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001841 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1842 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1843 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001844}
1845
Ana Krulecf9a15d92020-12-11 08:35:00 -08001846TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001847 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001848
1849 renderengine::DisplaySettings settings;
1850 settings.physicalDisplay = fullscreenRect();
1851 settings.clip = fullscreenRect();
1852 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1853
1854 std::vector<const renderengine::LayerSettings*> layers;
1855
1856 renderengine::LayerSettings redLayer;
1857 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1858 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1859 redLayer.geometry.roundedCornersRadius = 5.0f;
1860 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1861 // Red background.
1862 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1863 redLayer.alpha = 1.0f;
1864
1865 layers.push_back(&redLayer);
1866
1867 // Green layer with 1/3 size.
1868 renderengine::LayerSettings greenLayer;
1869 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1870 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1871 greenLayer.geometry.roundedCornersRadius = 5.0f;
1872 // Bottom right corner is not going to be rounded.
1873 greenLayer.geometry.roundedCornersCrop =
1874 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1875 DEFAULT_DISPLAY_HEIGHT)
1876 .toFloatRect();
1877 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1878 greenLayer.alpha = 1.0f;
1879
1880 layers.push_back(&greenLayer);
1881
Alec Mouric0aae732021-01-12 13:32:18 -08001882 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001883
1884 // Corners should be ignored...
1885 // Screen size: width is 128, height is 256.
1886 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1887 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1888 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1889 // Bottom right corner is kept out of the clipping, and it's green.
1890 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1891 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1892 0, 255, 0, 255);
1893}
1894
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001895TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1896 initializeRenderEngine();
1897
1898 renderengine::DisplaySettings settings;
1899 settings.physicalDisplay = fullscreenRect();
1900 settings.clip = fullscreenRect();
1901 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1902
1903 std::vector<const renderengine::LayerSettings*> layers;
1904
1905 renderengine::LayerSettings redLayer;
1906 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1907 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1908 redLayer.geometry.roundedCornersRadius = 5.0f;
1909 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1910 // Red background.
1911 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1912 redLayer.alpha = 1.0f;
1913
1914 layers.push_back(&redLayer);
1915
1916 // Green layer with 1/2 size with parent crop rect.
1917 renderengine::LayerSettings greenLayer = redLayer;
1918 greenLayer.geometry.boundaries =
1919 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1920 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1921
1922 layers.push_back(&greenLayer);
1923
1924 invokeDraw(settings, layers);
1925
1926 // Due to roundedCornersRadius, the corners are untouched.
1927 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1928 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1929 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1930 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1931
1932 // top middle should be green and the bottom middle red
1933 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1934 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1935
1936 // the bottom edge of the green layer should not be rounded
1937 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1938}
1939
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001940TEST_P(RenderEngineTest, testClear) {
1941 initializeRenderEngine();
1942
1943 const auto rect = fullscreenRect();
1944 const renderengine::DisplaySettings display{
1945 .physicalDisplay = rect,
1946 .clip = rect,
1947 };
1948
1949 const renderengine::LayerSettings redLayer{
1950 .geometry.boundaries = rect.toFloatRect(),
1951 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1952 .alpha = 1.0f,
1953 };
1954
1955 // This mimics prepareClearClientComposition. This layer should overwrite
1956 // the redLayer, so that the buffer is transparent, rather than red.
1957 const renderengine::LayerSettings clearLayer{
1958 .geometry.boundaries = rect.toFloatRect(),
1959 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1960 .alpha = 0.0f,
1961 .disableBlending = true,
1962 };
1963
1964 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1965 invokeDraw(display, layers);
1966 expectBufferColor(rect, 0, 0, 0, 0);
1967}
1968
1969TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1970 initializeRenderEngine();
1971
1972 const auto rect = Rect(0, 0, 1, 1);
1973 const renderengine::DisplaySettings display{
1974 .physicalDisplay = rect,
1975 .clip = rect,
1976 };
1977
1978 const renderengine::LayerSettings redLayer{
1979 .geometry.boundaries = rect.toFloatRect(),
1980 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1981 .alpha = 1.0f,
1982 };
1983
1984 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1985 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001986 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001987 {
1988 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001989 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1990 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001991 pixels[0] = 0;
1992 pixels[1] = 255;
1993 pixels[2] = 0;
1994 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001995 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001996 }
1997
1998 const renderengine::LayerSettings greenLayer{
1999 .geometry.boundaries = rect.toFloatRect(),
2000 .source =
2001 renderengine::PixelSource{
2002 .buffer =
2003 renderengine::Buffer{
2004 .buffer = buf,
2005 .usePremultipliedAlpha = true,
2006 },
2007 },
2008 .alpha = 0.5f,
2009 .disableBlending = true,
2010 };
2011
2012 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
2013 invokeDraw(display, layers);
2014 expectBufferColor(rect, 0, 128, 0, 128);
2015}
2016
Alec Mouri6e57f682018-09-29 20:45:08 -07002017} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002018
2019// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002020#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"