blob: 85322a9f7123760399b4b11573b062133a246f38 [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
266 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
267 uint8_t tolerance = 0) {
268 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
269 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
270 uint8_t tmp = a >= b ? a - b : b - a;
271 return tmp <= tolerance;
272 };
273 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700274 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800275
276 expectBufferColor(rect, r, g, b, a, colorCompare);
277 }
278
279 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
280 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
281 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000282 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
283 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700284 int32_t maxFails = 10;
285 int32_t fails = 0;
286 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000287 const uint8_t* src = pixels +
288 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700289 for (int32_t i = 0; i < region.getWidth(); i++) {
290 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800291 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700292 EXPECT_TRUE(equal)
293 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
294 << "expected (" << static_cast<uint32_t>(r) << ", "
295 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
296 << static_cast<uint32_t>(a) << "), "
297 << "got (" << static_cast<uint32_t>(src[0]) << ", "
298 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
299 << ", " << static_cast<uint32_t>(src[3]) << ")";
300 src += 4;
301 if (!equal && ++fails >= maxFails) {
302 break;
303 }
304 }
305 if (fails >= maxFails) {
306 break;
307 }
308 }
Alec Mouria90a5702021-04-16 16:36:21 +0000309 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700310 }
311
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800312 void expectAlpha(const Rect& rect, uint8_t a) {
313 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
314 return colorA[3] == colorB[3];
315 };
316 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
317 }
318
319 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
320 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
321 const ubyte4& backgroundColor) {
322 const Rect casterRect(castingLayer.geometry.boundaries);
323 Region casterRegion = Region(casterRect);
324 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
325 if (casterCornerRadius > 0.0f) {
326 // ignore the corners if a corner radius is set
327 Rect cornerRect(casterCornerRadius, casterCornerRadius);
328 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
329 casterRegion.subtractSelf(
330 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
331 casterRegion.subtractSelf(
332 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
333 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
334 casterRect.bottom - casterCornerRadius));
335 }
336
337 const float shadowInset = shadow.length * -1.0f;
338 const Rect casterWithShadow =
339 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
340 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
341 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
342
343 // verify casting layer
344 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
345
346 // verify shadows by testing just the alpha since its difficult to validate the shadow color
347 size_t c;
348 Rect const* r = shadowRegion.getArray(&c);
349 for (size_t i = 0; i < c; i++, r++) {
350 expectAlpha(*r, 255);
351 }
352
353 // verify background
354 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
355 backgroundColor.a);
356 }
357
Alec Mouribd17b3b2020-12-17 11:08:30 -0800358 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
359 const renderengine::ShadowSettings& shadow,
360 const ubyte4& backgroundColor) {
361 const float shadowInset = shadow.length * -1.0f;
362 const Rect casterRect(casterBounds);
363 const Rect shadowRect =
364 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
365
366 const Region backgroundRegion =
367 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
368
369 expectAlpha(shadowRect, 255);
370 // (0, 0, 0) fill on the bounds of the layer should be ignored.
371 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
372
373 // verify background
374 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
375 backgroundColor.a);
376 }
377
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800378 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
379 bool casterIsTranslucent) {
380 renderengine::ShadowSettings shadow;
381 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
382 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
383 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
384 shadow.lightRadius = 0.0f;
385 shadow.length = shadowLength;
386 shadow.casterIsTranslucent = casterIsTranslucent;
387 return shadow;
388 }
389
Alec Mouri1089aed2018-10-25 21:33:57 -0700390 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
391
392 static Rect offsetRect() {
393 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
394 DEFAULT_DISPLAY_HEIGHT);
395 }
396
397 static Rect offsetRectAtZero() {
398 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
399 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
400 }
401
Alec Mourid43ccab2019-03-13 12:23:45 -0700402 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800403 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700404 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800405 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800406 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700407
408 int fd = fence.release();
409 if (fd >= 0) {
410 sync_wait(fd, -1);
411 close(fd);
412 }
413
414 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800415 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000416 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700417 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700418 }
419
Alec Mourid43ccab2019-03-13 12:23:45 -0700420 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700421 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800422 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800423 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700424 }
425
Alec Mouri1089aed2018-10-25 21:33:57 -0700426 template <typename SourceVariant>
427 void fillBuffer(half r, half g, half b, half a);
428
429 template <typename SourceVariant>
430 void fillRedBuffer();
431
432 template <typename SourceVariant>
433 void fillGreenBuffer();
434
435 template <typename SourceVariant>
436 void fillBlueBuffer();
437
438 template <typename SourceVariant>
439 void fillRedTransparentBuffer();
440
441 template <typename SourceVariant>
442 void fillRedOffsetBuffer();
443
444 template <typename SourceVariant>
445 void fillBufferPhysicalOffset();
446
447 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700448 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700449
450 template <typename SourceVariant>
451 void fillBufferCheckersRotate0();
452
453 template <typename SourceVariant>
454 void fillBufferCheckersRotate90();
455
456 template <typename SourceVariant>
457 void fillBufferCheckersRotate180();
458
459 template <typename SourceVariant>
460 void fillBufferCheckersRotate270();
461
462 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800463 void fillBufferWithLayerTransform();
464
465 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700466 void fillBufferLayerTransform();
467
468 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800469 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800470
471 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700472 void fillBufferColorTransform();
473
Alec Mouri7c94edb2018-12-03 21:23:26 -0800474 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800475 void fillBufferWithColorTransformZeroLayerAlpha();
476
477 template <typename SourceVariant>
478 void fillBufferColorTransformZeroLayerAlpha();
479
480 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800481 void fillRedBufferWithRoundedCorners();
482
483 template <typename SourceVariant>
484 void fillBufferWithRoundedCorners();
485
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000486 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800487 void fillBufferAndBlurBackground();
488
489 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700490 void fillSmallLayerAndBlurBackground();
491
492 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000493 void overlayCorners();
494
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800495 void fillRedBufferTextureTransform();
496
497 void fillBufferTextureTransform();
498
499 void fillRedBufferWithPremultiplyAlpha();
500
501 void fillBufferWithPremultiplyAlpha();
502
503 void fillRedBufferWithoutPremultiplyAlpha();
504
505 void fillBufferWithoutPremultiplyAlpha();
506
Alec Mouriac335532018-11-12 15:01:33 -0800507 void fillGreenColorBufferThenClearRegion();
508
509 void clearLeftRegion();
510
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000511 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800512
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800513 template <typename SourceVariant>
514 void drawShadow(const renderengine::LayerSettings& castingLayer,
515 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
516 const ubyte4& backgroundColor);
517
Alec Mouribd17b3b2020-12-17 11:08:30 -0800518 void drawShadowWithoutCaster(const FloatRect& castingBounds,
519 const renderengine::ShadowSettings& shadow,
520 const ubyte4& backgroundColor);
521
Alec Mouric0aae732021-01-12 13:32:18 -0800522 void initializeRenderEngine();
523
524 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000525 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800526 // GLESRenderEngine for testing GLES-specific behavior.
527 // Owened by mRE, but this is downcasted.
528 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800529
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800530 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700531};
532
Alec Mouric0aae732021-01-12 13:32:18 -0800533void RenderEngineTest::initializeRenderEngine() {
534 const auto& renderEngineFactory = GetParam();
535 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
536 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
537 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
538 // every time.
539 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
540 renderEngineFactory->createGLESRenderEngine();
541 mGLESRE = renderEngine.get();
542 mRE = std::move(renderEngine);
543 } else {
544 mRE = renderEngineFactory->createRenderEngine();
545 }
Alec Mouria90a5702021-04-16 16:36:21 +0000546 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800547}
548
Alec Mouri1089aed2018-10-25 21:33:57 -0700549struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800550 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800551 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700552 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800553 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700554 }
555};
556
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800557struct RelaxOpaqueBufferVariant {
558 static void setOpaqueBit(renderengine::LayerSettings& layer) {
559 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800560 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800561 }
562
563 static uint8_t getAlphaChannel() { return 255; }
564};
565
566struct ForceOpaqueBufferVariant {
567 static void setOpaqueBit(renderengine::LayerSettings& layer) {
568 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800569 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800570 }
571
572 static uint8_t getAlphaChannel() {
573 // The isOpaque bit will override the alpha channel, so this should be
574 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800575 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800576 }
577};
578
579template <typename OpaquenessVariant>
580struct BufferSourceVariant {
581 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800582 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000583 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800584 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800585 fixture->mRE->genTextures(1, &texName);
586 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800587
588 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000589 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
590 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800591
Alec Mouria90a5702021-04-16 16:36:21 +0000592 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
593 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
594 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800595 iter[0] = uint8_t(r * 255);
596 iter[1] = uint8_t(g * 255);
597 iter[2] = uint8_t(b * 255);
598 iter[3] = OpaquenessVariant::getAlphaChannel();
599 iter += 4;
600 }
601 }
602
Alec Mouria90a5702021-04-16 16:36:21 +0000603 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800604
605 layer.source.buffer.buffer = buf;
606 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800607 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800608 OpaquenessVariant::setOpaqueBit(layer);
609 }
610};
611
Alec Mouri1089aed2018-10-25 21:33:57 -0700612template <typename SourceVariant>
613void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
614 renderengine::DisplaySettings settings;
615 settings.physicalDisplay = fullscreenRect();
616 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800617 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700618
Vishnu Nair9b079a22020-01-21 14:36:08 -0800619 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700620
621 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800622 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700623 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800624 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700625 layer.alpha = a;
626
Vishnu Nair9b079a22020-01-21 14:36:08 -0800627 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700628
Alec Mouric0aae732021-01-12 13:32:18 -0800629 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700630}
631
632template <typename SourceVariant>
633void RenderEngineTest::fillRedBuffer() {
634 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
635 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
636}
637
638template <typename SourceVariant>
639void RenderEngineTest::fillGreenBuffer() {
640 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
641 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
642}
643
644template <typename SourceVariant>
645void RenderEngineTest::fillBlueBuffer() {
646 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
647 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
648}
649
650template <typename SourceVariant>
651void RenderEngineTest::fillRedTransparentBuffer() {
652 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
653 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
654}
655
656template <typename SourceVariant>
657void RenderEngineTest::fillRedOffsetBuffer() {
658 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800659 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700660 settings.physicalDisplay = offsetRect();
661 settings.clip = offsetRectAtZero();
662
Vishnu Nair9b079a22020-01-21 14:36:08 -0800663 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700664
665 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800666 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700667 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800668 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700669 layer.alpha = 1.0f;
670
Vishnu Nair9b079a22020-01-21 14:36:08 -0800671 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800672 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700673}
674
675template <typename SourceVariant>
676void RenderEngineTest::fillBufferPhysicalOffset() {
677 fillRedOffsetBuffer<SourceVariant>();
678
679 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
680 DEFAULT_DISPLAY_HEIGHT),
681 255, 0, 0, 255);
682 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
683 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
684
685 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
686 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
687}
688
689template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700690void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700691 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800692 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700693 settings.physicalDisplay = fullscreenRect();
694 // Here logical space is 2x2
695 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700696 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700697
Vishnu Nair9b079a22020-01-21 14:36:08 -0800698 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700699
700 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800701 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700702 Rect rectOne(0, 0, 1, 1);
703 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800704 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700705 layerOne.alpha = 1.0f;
706
707 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800708 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700709 Rect rectTwo(0, 1, 1, 2);
710 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800711 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700712 layerTwo.alpha = 1.0f;
713
714 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800715 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700716 Rect rectThree(1, 0, 2, 1);
717 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800718 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700719 layerThree.alpha = 1.0f;
720
Vishnu Nair9b079a22020-01-21 14:36:08 -0800721 layers.push_back(&layerOne);
722 layers.push_back(&layerTwo);
723 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700724
Alec Mouric0aae732021-01-12 13:32:18 -0800725 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700726}
727
728template <typename SourceVariant>
729void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700730 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700731 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
732 255);
733 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
734 DEFAULT_DISPLAY_HEIGHT / 2),
735 0, 0, 255, 255);
736 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
737 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
738 0, 0, 0, 0);
739 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
740 DEFAULT_DISPLAY_HEIGHT),
741 0, 255, 0, 255);
742}
743
744template <typename SourceVariant>
745void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700746 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700747 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
748 255);
749 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
750 DEFAULT_DISPLAY_HEIGHT / 2),
751 255, 0, 0, 255);
752 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
753 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
754 0, 0, 255, 255);
755 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
756 DEFAULT_DISPLAY_HEIGHT),
757 0, 0, 0, 0);
758}
759
760template <typename SourceVariant>
761void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700762 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700763 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
764 0);
765 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
766 DEFAULT_DISPLAY_HEIGHT / 2),
767 0, 255, 0, 255);
768 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
769 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
770 255, 0, 0, 255);
771 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
772 DEFAULT_DISPLAY_HEIGHT),
773 0, 0, 255, 255);
774}
775
776template <typename SourceVariant>
777void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700778 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700779 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
780 255);
781 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
782 DEFAULT_DISPLAY_HEIGHT / 2),
783 0, 0, 0, 0);
784 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
785 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
786 0, 255, 0, 255);
787 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
788 DEFAULT_DISPLAY_HEIGHT),
789 255, 0, 0, 255);
790}
791
792template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800793void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700794 renderengine::DisplaySettings settings;
795 settings.physicalDisplay = fullscreenRect();
796 // Here logical space is 2x2
797 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800798 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700799
Vishnu Nair9b079a22020-01-21 14:36:08 -0800800 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700801
802 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800803 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700804 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
805 // Translate one pixel diagonally
806 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 -0800807 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700808 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
809 layer.alpha = 1.0f;
810
Vishnu Nair9b079a22020-01-21 14:36:08 -0800811 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700812
Alec Mouric0aae732021-01-12 13:32:18 -0800813 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800814}
Alec Mouri1089aed2018-10-25 21:33:57 -0700815
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800816template <typename SourceVariant>
817void RenderEngineTest::fillBufferLayerTransform() {
818 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700819 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
820 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
821 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
822 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
823 255, 0, 0, 255);
824}
825
826template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800827void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700828 renderengine::DisplaySettings settings;
829 settings.physicalDisplay = fullscreenRect();
830 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800831 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700832
Vishnu Nair9b079a22020-01-21 14:36:08 -0800833 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700834
835 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800836 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700837 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800838 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700839 layer.alpha = 1.0f;
840
841 // construct a fake color matrix
842 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800843 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700844 // set red channel to red + green
845 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
846
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800847 layer.alpha = 1.0f;
848 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
849
Vishnu Nair9b079a22020-01-21 14:36:08 -0800850 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700851
Alec Mouric0aae732021-01-12 13:32:18 -0800852 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800853}
Alec Mouri1089aed2018-10-25 21:33:57 -0700854
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800855template <typename SourceVariant>
856void RenderEngineTest::fillBufferColorTransform() {
857 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800858 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
859}
860
861template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800862void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
863 renderengine::DisplaySettings settings;
864 settings.physicalDisplay = fullscreenRect();
865 settings.clip = Rect(1, 1);
866
867 std::vector<const renderengine::LayerSettings*> layers;
868
869 renderengine::LayerSettings layer;
870 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
871 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
872 layer.alpha = 0;
873
874 // construct a fake color matrix
875 // simple inverse color
876 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
877
878 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
879
880 layers.push_back(&layer);
881
Alec Mouric0aae732021-01-12 13:32:18 -0800882 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800883}
884
885template <typename SourceVariant>
886void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
887 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
888 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
889}
890
891template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800892void RenderEngineTest::fillRedBufferWithRoundedCorners() {
893 renderengine::DisplaySettings settings;
894 settings.physicalDisplay = fullscreenRect();
895 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800896 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800897
Vishnu Nair9b079a22020-01-21 14:36:08 -0800898 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800899
900 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800901 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800902 layer.geometry.boundaries = fullscreenRect().toFloatRect();
903 layer.geometry.roundedCornersRadius = 5.0f;
904 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
905 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
906 layer.alpha = 1.0f;
907
Vishnu Nair9b079a22020-01-21 14:36:08 -0800908 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800909
Alec Mouric0aae732021-01-12 13:32:18 -0800910 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800911}
912
913template <typename SourceVariant>
914void RenderEngineTest::fillBufferWithRoundedCorners() {
915 fillRedBufferWithRoundedCorners<SourceVariant>();
916 // Corners should be ignored...
917 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
918 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
919 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
920 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
921 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
922 0, 0, 0, 0);
923 // ...And the non-rounded portion should be red.
924 // Other pixels may be anti-aliased, so let's not check those.
925 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
926 255);
927}
928
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000929template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800930void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800931 auto blurRadius = 50;
932 auto center = DEFAULT_DISPLAY_WIDTH / 2;
933
934 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800935 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800936 settings.physicalDisplay = fullscreenRect();
937 settings.clip = fullscreenRect();
938
Vishnu Nair9b079a22020-01-21 14:36:08 -0800939 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800940
941 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800942 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800943 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
944 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
945 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800946 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800947
948 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800949 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800950 leftLayer.geometry.boundaries =
951 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
952 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
953 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800954 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800955
956 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800957 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800958 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
959 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500960 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800961 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800962 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800963
Alec Mouric0aae732021-01-12 13:32:18 -0800964 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800965
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500966 // solid color
967 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
968
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500969 if (mRE->supportsBackgroundBlur()) {
970 // blurred color (downsampling should result in the center color being close to 128)
971 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400972 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500973 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800974}
975
976template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700977void RenderEngineTest::fillSmallLayerAndBlurBackground() {
978 auto blurRadius = 50;
979 renderengine::DisplaySettings settings;
980 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
981 settings.physicalDisplay = fullscreenRect();
982 settings.clip = fullscreenRect();
983
984 std::vector<const renderengine::LayerSettings*> layers;
985
986 renderengine::LayerSettings backgroundLayer;
987 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
988 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
989 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
990 backgroundLayer.alpha = 1.0f;
991 layers.push_back(&backgroundLayer);
992
993 renderengine::LayerSettings blurLayer;
994 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
995 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
996 blurLayer.backgroundBlurRadius = blurRadius;
997 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
998 blurLayer.alpha = 0;
999 layers.push_back(&blurLayer);
1000
1001 invokeDraw(settings, layers);
1002
1003 // Give a generous tolerance - the blur rectangle is very small and this test is
1004 // mainly concerned with ensuring that there's no device failure.
1005 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1006 40 /* tolerance */);
1007}
1008
1009template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001010void RenderEngineTest::overlayCorners() {
1011 renderengine::DisplaySettings settings;
1012 settings.physicalDisplay = fullscreenRect();
1013 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001014 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001015
Vishnu Nair9b079a22020-01-21 14:36:08 -08001016 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001017
1018 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001019 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001020 layerOne.geometry.boundaries =
1021 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1022 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1023 layerOne.alpha = 0.2;
1024
Vishnu Nair9b079a22020-01-21 14:36:08 -08001025 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001026 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001027 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1028 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1029 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1030 0, 0, 0, 0);
1031
Vishnu Nair9b079a22020-01-21 14:36:08 -08001032 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001033 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001034 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001035 layerTwo.geometry.boundaries =
1036 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1037 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1038 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1039 layerTwo.alpha = 1.0f;
1040
Vishnu Nair9b079a22020-01-21 14:36:08 -08001041 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001042 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001043
1044 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1045 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1046 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1047 0, 255, 0, 255);
1048}
1049
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001050void RenderEngineTest::fillRedBufferTextureTransform() {
1051 renderengine::DisplaySettings settings;
1052 settings.physicalDisplay = fullscreenRect();
1053 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001054 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001055
Vishnu Nair9b079a22020-01-21 14:36:08 -08001056 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001057
1058 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001059 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001060 // Here will allocate a checker board texture, but transform texture
1061 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001062 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001063 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001064 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001065 this->mTexNames.push_back(texName);
1066
1067 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001068 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1069 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070 // Red top left, Green top right, Blue bottom left, Black bottom right
1071 pixels[0] = 255;
1072 pixels[1] = 0;
1073 pixels[2] = 0;
1074 pixels[3] = 255;
1075 pixels[4] = 0;
1076 pixels[5] = 255;
1077 pixels[6] = 0;
1078 pixels[7] = 255;
1079 pixels[8] = 0;
1080 pixels[9] = 0;
1081 pixels[10] = 255;
1082 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001083 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001084
1085 layer.source.buffer.buffer = buf;
1086 layer.source.buffer.textureName = texName;
1087 // Transform coordinates to only be inside the red quadrant.
1088 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1089 layer.alpha = 1.0f;
1090 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1091
Vishnu Nair9b079a22020-01-21 14:36:08 -08001092 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001093
Alec Mouric0aae732021-01-12 13:32:18 -08001094 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001095}
1096
1097void RenderEngineTest::fillBufferTextureTransform() {
1098 fillRedBufferTextureTransform();
1099 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1100}
1101
1102void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1103 renderengine::DisplaySettings settings;
1104 settings.physicalDisplay = fullscreenRect();
1105 // Here logical space is 1x1
1106 settings.clip = Rect(1, 1);
1107
Vishnu Nair9b079a22020-01-21 14:36:08 -08001108 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001109
1110 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001111 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001112 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001113 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001114 this->mTexNames.push_back(texName);
1115
1116 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001117 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1118 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001119 pixels[0] = 255;
1120 pixels[1] = 0;
1121 pixels[2] = 0;
1122 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001123 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001124
1125 layer.source.buffer.buffer = buf;
1126 layer.source.buffer.textureName = texName;
1127 layer.source.buffer.usePremultipliedAlpha = true;
1128 layer.alpha = 0.5f;
1129 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1130
Vishnu Nair9b079a22020-01-21 14:36:08 -08001131 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001132
Alec Mouric0aae732021-01-12 13:32:18 -08001133 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001134}
1135
1136void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1137 fillRedBufferWithPremultiplyAlpha();
1138 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1139}
1140
1141void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1142 renderengine::DisplaySettings settings;
1143 settings.physicalDisplay = fullscreenRect();
1144 // Here logical space is 1x1
1145 settings.clip = Rect(1, 1);
1146
Vishnu Nair9b079a22020-01-21 14:36:08 -08001147 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001148
1149 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001150 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001151 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001152 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001153 this->mTexNames.push_back(texName);
1154
1155 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001156 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1157 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001158 pixels[0] = 255;
1159 pixels[1] = 0;
1160 pixels[2] = 0;
1161 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001162 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001163
1164 layer.source.buffer.buffer = buf;
1165 layer.source.buffer.textureName = texName;
1166 layer.source.buffer.usePremultipliedAlpha = false;
1167 layer.alpha = 0.5f;
1168 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1169
Vishnu Nair9b079a22020-01-21 14:36:08 -08001170 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001171
Alec Mouric0aae732021-01-12 13:32:18 -08001172 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001173}
1174
1175void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1176 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001177 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001178}
1179
Alec Mouriac335532018-11-12 15:01:33 -08001180void RenderEngineTest::clearLeftRegion() {
1181 renderengine::DisplaySettings settings;
1182 settings.physicalDisplay = fullscreenRect();
1183 // Here logical space is 4x4
1184 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001185 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001186 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001187 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001188 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001189 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001190 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001191}
1192
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001193void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001194 // Reuse mBuffer
1195 clearLeftRegion();
1196 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1197 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1198 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001199 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001200}
1201
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001202template <typename SourceVariant>
1203void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1204 const renderengine::ShadowSettings& shadow,
1205 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1206 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001207 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001208 settings.physicalDisplay = fullscreenRect();
1209 settings.clip = fullscreenRect();
1210
Vishnu Nair9b079a22020-01-21 14:36:08 -08001211 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001212
1213 // add background layer
1214 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001215 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001216 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1217 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1218 backgroundColor.b / 255.0f, this);
1219 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001220 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001221
1222 // add shadow layer
1223 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001224 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001225 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1226 shadowLayer.alpha = castingLayer.alpha;
1227 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001228 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001229
1230 // add layer casting the shadow
1231 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001232 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001233 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1234 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001235 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001236
Alec Mouric0aae732021-01-12 13:32:18 -08001237 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001238}
1239
Alec Mouribd17b3b2020-12-17 11:08:30 -08001240void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1241 const renderengine::ShadowSettings& shadow,
1242 const ubyte4& backgroundColor) {
1243 renderengine::DisplaySettings settings;
1244 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1245 settings.physicalDisplay = fullscreenRect();
1246 settings.clip = fullscreenRect();
1247
1248 std::vector<const renderengine::LayerSettings*> layers;
1249
1250 // add background layer
1251 renderengine::LayerSettings bgLayer;
1252 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1253 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1254 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1255 backgroundColor.b / 255.0f, this);
1256 bgLayer.alpha = backgroundColor.a / 255.0f;
1257 layers.push_back(&bgLayer);
1258
1259 // add shadow layer
1260 renderengine::LayerSettings shadowLayer;
1261 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1262 shadowLayer.geometry.boundaries = castingBounds;
1263 shadowLayer.alpha = 1.0f;
1264 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1265 shadowLayer.shadow = shadow;
1266 layers.push_back(&shadowLayer);
1267
Alec Mouric0aae732021-01-12 13:32:18 -08001268 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001269}
1270
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001271INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001272 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001273 std::make_shared<GLESCMRenderEngineFactory>(),
1274 std::make_shared<SkiaGLESRenderEngineFactory>(),
1275 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001276
1277TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001278 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001279 drawEmptyLayers();
1280}
1281
Ana Krulec07b98df2021-01-07 14:38:40 -08001282TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001283 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001284
1285 renderengine::DisplaySettings settings;
1286 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1287 settings.physicalDisplay = fullscreenRect();
1288 settings.clip = fullscreenRect();
1289
1290 // 255, 255, 255, 255 is full opaque white.
1291 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1292 // Create layer with given color.
1293 renderengine::LayerSettings bgLayer;
1294 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1295 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1296 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1297 backgroundColor.b / 255.0f);
1298 bgLayer.alpha = backgroundColor.a / 255.0f;
1299 // Transform the red color.
1300 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1301
1302 std::vector<const renderengine::LayerSettings*> layers;
1303 layers.push_back(&bgLayer);
1304
Alec Mouric0aae732021-01-12 13:32:18 -08001305 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001306
1307 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001308 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001309 backgroundColor.a);
1310}
1311
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001312TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001313 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001314
Alec Mourid43ccab2019-03-13 12:23:45 -07001315 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001316 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001317 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001318 renderengine::LayerSettings layer;
1319 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1320 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001321 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001322 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001323 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001324
1325 ASSERT_EQ(BAD_VALUE, status);
1326}
1327
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001328TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001329 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001330
Alec Mourid43ccab2019-03-13 12:23:45 -07001331 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001332 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001333 settings.physicalDisplay = fullscreenRect();
1334 settings.clip = fullscreenRect();
1335
Vishnu Nair9b079a22020-01-21 14:36:08 -08001336 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001337 renderengine::LayerSettings layer;
1338 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1339 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1340 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001341 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001342
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001343 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001344 ASSERT_EQ(NO_ERROR, status);
1345 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1346}
1347
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001348TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1349 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001350
1351 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1352 // GLES-specific test
1353 return;
1354 }
1355
1356 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001357
Alec Mourife0d72b2019-03-21 14:05:56 -07001358 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001359 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001360 settings.physicalDisplay = fullscreenRect();
1361 settings.clip = fullscreenRect();
1362
Vishnu Nair9b079a22020-01-21 14:36:08 -08001363 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001364 renderengine::LayerSettings layer;
1365 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1366 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1367 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001368 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001369
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001370 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001371 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001372 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001373 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1374}
1375
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001376TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001377 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001378 fillRedBuffer<ColorSourceVariant>();
1379}
1380
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001381TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001382 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001383 fillGreenBuffer<ColorSourceVariant>();
1384}
1385
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001386TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001387 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001388 fillBlueBuffer<ColorSourceVariant>();
1389}
1390
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001391TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001392 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001393 fillRedTransparentBuffer<ColorSourceVariant>();
1394}
1395
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001396TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001397 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001398 fillBufferPhysicalOffset<ColorSourceVariant>();
1399}
1400
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001401TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001402 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001403 fillBufferCheckersRotate0<ColorSourceVariant>();
1404}
1405
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001406TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001407 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001408 fillBufferCheckersRotate90<ColorSourceVariant>();
1409}
1410
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001411TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001412 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001413 fillBufferCheckersRotate180<ColorSourceVariant>();
1414}
1415
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001416TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001417 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001418 fillBufferCheckersRotate270<ColorSourceVariant>();
1419}
1420
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001421TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001422 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001423 fillBufferLayerTransform<ColorSourceVariant>();
1424}
1425
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001427 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001428 fillBufferColorTransform<ColorSourceVariant>();
1429}
1430
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001431TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001432 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001433 fillBufferWithRoundedCorners<ColorSourceVariant>();
1434}
1435
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001436TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001437 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001438 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1439}
1440
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001441TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001442 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001443 fillBufferAndBlurBackground<ColorSourceVariant>();
1444}
1445
Alec Mourie8489fd2021-04-29 16:08:56 -07001446TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1447 initializeRenderEngine();
1448 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1449}
1450
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001451TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001452 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001453 overlayCorners<ColorSourceVariant>();
1454}
1455
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001456TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001457 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001458 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1459}
1460
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001461TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001462 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001463 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1464}
1465
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001466TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001467 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001468 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1469}
1470
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001471TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001472 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001473 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1474}
1475
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001476TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001477 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001478 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1479}
1480
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001481TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001482 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001483 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1484}
1485
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001486TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001487 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001488 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1489}
1490
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001491TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001492 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001493 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1494}
1495
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001496TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001497 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001498 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1499}
1500
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001501TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001502 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001503 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1504}
1505
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001506TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001507 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001508 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1509}
1510
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001511TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001512 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001513 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1514}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001515
Alec Mouric0aae732021-01-12 13:32:18 -08001516TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1517 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001518 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1519}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001520
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001521TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001522 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001523 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1524}
1525
Alec Mourie8489fd2021-04-29 16:08:56 -07001526TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1527 initializeRenderEngine();
1528 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1529}
1530
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001531TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001532 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001533 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1534}
1535
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001536TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001537 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001538 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1539}
1540
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001541TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001542 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001543 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1544}
1545
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001546TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001547 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001548 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1549}
1550
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001551TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001552 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001553 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1554}
1555
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001556TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001557 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001558 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1559}
1560
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001561TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001562 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001563 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1564}
1565
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001566TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001567 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001568 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1569}
1570
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001571TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001572 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001573 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1574}
1575
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001576TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001577 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001578 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1579}
1580
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001581TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001582 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001583 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1584}
1585
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001586TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001587 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001588 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1589}
1590
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001591TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001592 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001593 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1594}
1595
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001596TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001597 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001598 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1599}
1600
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001601TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001602 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001603 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1604}
1605
Alec Mourie8489fd2021-04-29 16:08:56 -07001606TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1607 initializeRenderEngine();
1608 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1609}
1610
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001611TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001612 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001613 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1614}
1615
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001616TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001617 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001618 fillBufferTextureTransform();
1619}
1620
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001621TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001622 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001623 fillBufferWithPremultiplyAlpha();
1624}
1625
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001626TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001627 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001628 fillBufferWithoutPremultiplyAlpha();
1629}
1630
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001631TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001632 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001633 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001634}
1635
Alec Mouribd17b3b2020-12-17 11:08:30 -08001636TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001637 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001638
1639 const ubyte4 backgroundColor(255, 255, 255, 255);
1640 const float shadowLength = 5.0f;
1641 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1642 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1643 renderengine::ShadowSettings settings =
1644 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1645 false /* casterIsTranslucent */);
1646
1647 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1648 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1649}
1650
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001651TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001652 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001653
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001654 const ubyte4 casterColor(255, 0, 0, 255);
1655 const ubyte4 backgroundColor(255, 255, 255, 255);
1656 const float shadowLength = 5.0f;
1657 Rect casterBounds(1, 1);
1658 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1659 renderengine::LayerSettings castingLayer;
1660 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1661 castingLayer.alpha = 1.0f;
1662 renderengine::ShadowSettings settings =
1663 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1664 false /* casterIsTranslucent */);
1665
1666 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1667 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1668}
1669
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001670TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001671 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001672
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001673 const ubyte4 casterColor(255, 0, 0, 255);
1674 const ubyte4 backgroundColor(255, 255, 255, 255);
1675 const float shadowLength = 5.0f;
1676 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1677 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1678 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001679 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001680 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1681 castingLayer.alpha = 1.0f;
1682 renderengine::ShadowSettings settings =
1683 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1684 false /* casterIsTranslucent */);
1685
1686 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1687 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1688}
1689
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001690TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001691 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001692
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001693 const ubyte4 casterColor(255, 0, 0, 255);
1694 const ubyte4 backgroundColor(255, 255, 255, 255);
1695 const float shadowLength = 5.0f;
1696 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1697 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1698 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001699 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001700 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1701 castingLayer.alpha = 1.0f;
1702 renderengine::ShadowSettings settings =
1703 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1704 false /* casterIsTranslucent */);
1705
1706 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1707 backgroundColor);
1708 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1709}
1710
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001711TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001712 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001713
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001714 const ubyte4 casterColor(255, 0, 0, 255);
1715 const ubyte4 backgroundColor(255, 255, 255, 255);
1716 const float shadowLength = 5.0f;
1717 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1718 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1719 renderengine::LayerSettings castingLayer;
1720 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1721 castingLayer.geometry.roundedCornersRadius = 3.0f;
1722 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1723 castingLayer.alpha = 1.0f;
1724 renderengine::ShadowSettings settings =
1725 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1726 false /* casterIsTranslucent */);
1727
1728 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1729 backgroundColor);
1730 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1731}
1732
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001733TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001734 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001735
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001736 const ubyte4 casterColor(255, 0, 0, 255);
1737 const ubyte4 backgroundColor(255, 255, 255, 255);
1738 const float shadowLength = 5.0f;
1739 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1740 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1741 renderengine::LayerSettings castingLayer;
1742 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1743 castingLayer.alpha = 0.5f;
1744 renderengine::ShadowSettings settings =
1745 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1746 true /* casterIsTranslucent */);
1747
1748 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1749 backgroundColor);
1750
1751 // verify only the background since the shadow will draw behind the caster
1752 const float shadowInset = settings.length * -1.0f;
1753 const Rect casterWithShadow =
1754 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1755 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1756 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1757 backgroundColor.a);
1758}
1759
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001760TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1761 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001762
1763 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1764 // GLES-specific test
1765 return;
1766 }
1767
1768 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001769
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001770 renderengine::DisplaySettings settings;
1771 settings.physicalDisplay = fullscreenRect();
1772 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001773 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001774
1775 std::vector<const renderengine::LayerSettings*> layers;
1776 renderengine::LayerSettings layer;
1777 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1778 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1779 layer.alpha = 1.0;
1780 layers.push_back(&layer);
1781
1782 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001783 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001784 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001785 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001786
1787 const int fd = fenceTwo.get();
1788 if (fd >= 0) {
1789 sync_wait(fd, -1);
1790 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001791 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001792 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001793 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001794 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001795 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1796}
1797
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001798TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1799 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001800
1801 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1802 // GLES-specific test
1803 return;
1804 }
1805
1806 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001807
Alec Mouri368e1582020-08-13 10:14:29 -07001808 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001809 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001810 settings.physicalDisplay = fullscreenRect();
1811 settings.clip = fullscreenRect();
1812
1813 std::vector<const renderengine::LayerSettings*> layers;
1814 renderengine::LayerSettings layer;
1815 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1816 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1817 layer.alpha = 1.0;
1818 layers.push_back(&layer);
1819
1820 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001821 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001822
1823 const int fd = fence.get();
1824 if (fd >= 0) {
1825 sync_wait(fd, -1);
1826 }
1827
Alec Mouria90a5702021-04-16 16:36:21 +00001828 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001829 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001830 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1831 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001832
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001833 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001834
1835 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001836 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1837 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1838 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001839}
1840
Ana Krulecf9a15d92020-12-11 08:35:00 -08001841TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001842 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001843
1844 renderengine::DisplaySettings settings;
1845 settings.physicalDisplay = fullscreenRect();
1846 settings.clip = fullscreenRect();
1847 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1848
1849 std::vector<const renderengine::LayerSettings*> layers;
1850
1851 renderengine::LayerSettings redLayer;
1852 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1853 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1854 redLayer.geometry.roundedCornersRadius = 5.0f;
1855 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1856 // Red background.
1857 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1858 redLayer.alpha = 1.0f;
1859
1860 layers.push_back(&redLayer);
1861
1862 // Green layer with 1/3 size.
1863 renderengine::LayerSettings greenLayer;
1864 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1865 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1866 greenLayer.geometry.roundedCornersRadius = 5.0f;
1867 // Bottom right corner is not going to be rounded.
1868 greenLayer.geometry.roundedCornersCrop =
1869 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1870 DEFAULT_DISPLAY_HEIGHT)
1871 .toFloatRect();
1872 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1873 greenLayer.alpha = 1.0f;
1874
1875 layers.push_back(&greenLayer);
1876
Alec Mouric0aae732021-01-12 13:32:18 -08001877 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001878
1879 // Corners should be ignored...
1880 // Screen size: width is 128, height is 256.
1881 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1882 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1883 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1884 // Bottom right corner is kept out of the clipping, and it's green.
1885 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1886 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1887 0, 255, 0, 255);
1888}
1889
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001890TEST_P(RenderEngineTest, testClear) {
1891 initializeRenderEngine();
1892
1893 const auto rect = fullscreenRect();
1894 const renderengine::DisplaySettings display{
1895 .physicalDisplay = rect,
1896 .clip = rect,
1897 };
1898
1899 const renderengine::LayerSettings redLayer{
1900 .geometry.boundaries = rect.toFloatRect(),
1901 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1902 .alpha = 1.0f,
1903 };
1904
1905 // This mimics prepareClearClientComposition. This layer should overwrite
1906 // the redLayer, so that the buffer is transparent, rather than red.
1907 const renderengine::LayerSettings clearLayer{
1908 .geometry.boundaries = rect.toFloatRect(),
1909 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1910 .alpha = 0.0f,
1911 .disableBlending = true,
1912 };
1913
1914 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1915 invokeDraw(display, layers);
1916 expectBufferColor(rect, 0, 0, 0, 0);
1917}
1918
1919TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1920 initializeRenderEngine();
1921
1922 const auto rect = Rect(0, 0, 1, 1);
1923 const renderengine::DisplaySettings display{
1924 .physicalDisplay = rect,
1925 .clip = rect,
1926 };
1927
1928 const renderengine::LayerSettings redLayer{
1929 .geometry.boundaries = rect.toFloatRect(),
1930 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1931 .alpha = 1.0f,
1932 };
1933
1934 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1935 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001936 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001937 {
1938 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001939 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1940 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001941 pixels[0] = 0;
1942 pixels[1] = 255;
1943 pixels[2] = 0;
1944 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001945 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001946 }
1947
1948 const renderengine::LayerSettings greenLayer{
1949 .geometry.boundaries = rect.toFloatRect(),
1950 .source =
1951 renderengine::PixelSource{
1952 .buffer =
1953 renderengine::Buffer{
1954 .buffer = buf,
1955 .usePremultipliedAlpha = true,
1956 },
1957 },
1958 .alpha = 0.5f,
1959 .disableBlending = true,
1960 };
1961
1962 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1963 invokeDraw(display, layers);
1964 expectBufferColor(rect, 0, 128, 0, 128);
1965}
1966
Alec Mouri6e57f682018-09-29 20:45:08 -07001967} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001968
1969// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001970#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"