blob: 39103df08180dad479037303b23af3396294d3eb [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,
972 10 /* tolerance */);
973 }
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
Alec Mourice438e72021-04-21 12:10:11 -07001441// TODO(b/186010146): reenable once swiftshader is happy with this test
1442TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001443 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001444 fillBufferAndBlurBackground<ColorSourceVariant>();
1445}
1446
Alec Mourie8489fd2021-04-29 16:08:56 -07001447TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1448 initializeRenderEngine();
1449 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1450}
1451
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001452TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001453 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001454 overlayCorners<ColorSourceVariant>();
1455}
1456
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001457TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001458 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001459 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1460}
1461
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001462TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001463 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001464 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1465}
1466
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001467TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001468 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001469 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1470}
1471
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001472TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001473 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001474 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1475}
1476
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001477TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001478 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001479 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1480}
1481
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001482TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001484 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001489 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001509 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001514 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1515}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001516
Alec Mouric0aae732021-01-12 13:32:18 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1518 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001519 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1520}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001521
Alec Mourice438e72021-04-21 12:10:11 -07001522// TODO(b/186010146): reenable once swiftshader is happy with this test
1523TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001524 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001525 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1526}
1527
Alec Mourie8489fd2021-04-29 16:08:56 -07001528TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1529 initializeRenderEngine();
1530 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1531}
1532
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001533TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001534 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001535 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1536}
1537
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001538TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001539 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001540 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1541}
1542
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001543TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001544 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001545 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1546}
1547
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001548TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001549 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001550 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1551}
1552
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001553TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001554 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001555 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1556}
1557
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001558TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001559 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001560 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1561}
1562
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001563TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001564 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001565 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1566}
1567
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001568TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001569 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001570 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1571}
1572
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001573TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001574 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001575 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1576}
1577
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001578TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001579 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001580 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1581}
1582
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001583TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001584 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001585 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1586}
1587
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001588TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001589 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001590 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1591}
1592
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001593TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001594 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001595 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1596}
1597
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001598TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001599 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001600 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1601}
1602
Alec Mourice438e72021-04-21 12:10:11 -07001603// TODO(b/186010146): reenable once swiftshader is happy with this test
1604TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001606 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1607}
1608
Alec Mourie8489fd2021-04-29 16:08:56 -07001609TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1610 initializeRenderEngine();
1611 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1612}
1613
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001614TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001615 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001616 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1617}
1618
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001619TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001620 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001621 fillBufferTextureTransform();
1622}
1623
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001624TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001625 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001626 fillBufferWithPremultiplyAlpha();
1627}
1628
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001629TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001630 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001631 fillBufferWithoutPremultiplyAlpha();
1632}
1633
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001634TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001635 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001636 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001637}
1638
Alec Mouribd17b3b2020-12-17 11:08:30 -08001639TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001640 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001641
1642 const ubyte4 backgroundColor(255, 255, 255, 255);
1643 const float shadowLength = 5.0f;
1644 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1645 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1646 renderengine::ShadowSettings settings =
1647 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1648 false /* casterIsTranslucent */);
1649
1650 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1651 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1652}
1653
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001654TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001655 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001656
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001657 const ubyte4 casterColor(255, 0, 0, 255);
1658 const ubyte4 backgroundColor(255, 255, 255, 255);
1659 const float shadowLength = 5.0f;
1660 Rect casterBounds(1, 1);
1661 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1662 renderengine::LayerSettings castingLayer;
1663 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1664 castingLayer.alpha = 1.0f;
1665 renderengine::ShadowSettings settings =
1666 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1667 false /* casterIsTranslucent */);
1668
1669 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1670 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1671}
1672
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001673TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001674 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001675
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001676 const ubyte4 casterColor(255, 0, 0, 255);
1677 const ubyte4 backgroundColor(255, 255, 255, 255);
1678 const float shadowLength = 5.0f;
1679 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1680 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1681 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001682 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001683 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1684 castingLayer.alpha = 1.0f;
1685 renderengine::ShadowSettings settings =
1686 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1687 false /* casterIsTranslucent */);
1688
1689 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1690 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1691}
1692
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001693TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001694 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001695
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001696 const ubyte4 casterColor(255, 0, 0, 255);
1697 const ubyte4 backgroundColor(255, 255, 255, 255);
1698 const float shadowLength = 5.0f;
1699 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1700 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1701 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001702 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001703 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1704 castingLayer.alpha = 1.0f;
1705 renderengine::ShadowSettings settings =
1706 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1707 false /* casterIsTranslucent */);
1708
1709 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1710 backgroundColor);
1711 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1712}
1713
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001714TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001715 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001716
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001717 const ubyte4 casterColor(255, 0, 0, 255);
1718 const ubyte4 backgroundColor(255, 255, 255, 255);
1719 const float shadowLength = 5.0f;
1720 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1721 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1722 renderengine::LayerSettings castingLayer;
1723 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1724 castingLayer.geometry.roundedCornersRadius = 3.0f;
1725 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1726 castingLayer.alpha = 1.0f;
1727 renderengine::ShadowSettings settings =
1728 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1729 false /* casterIsTranslucent */);
1730
1731 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1732 backgroundColor);
1733 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1734}
1735
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001736TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001737 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001738
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001739 const ubyte4 casterColor(255, 0, 0, 255);
1740 const ubyte4 backgroundColor(255, 255, 255, 255);
1741 const float shadowLength = 5.0f;
1742 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1743 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1744 renderengine::LayerSettings castingLayer;
1745 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1746 castingLayer.alpha = 0.5f;
1747 renderengine::ShadowSettings settings =
1748 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1749 true /* casterIsTranslucent */);
1750
1751 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1752 backgroundColor);
1753
1754 // verify only the background since the shadow will draw behind the caster
1755 const float shadowInset = settings.length * -1.0f;
1756 const Rect casterWithShadow =
1757 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1758 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1759 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1760 backgroundColor.a);
1761}
1762
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001763TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1764 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001765
1766 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1767 // GLES-specific test
1768 return;
1769 }
1770
1771 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001772
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001773 renderengine::DisplaySettings settings;
1774 settings.physicalDisplay = fullscreenRect();
1775 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001776 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001777
1778 std::vector<const renderengine::LayerSettings*> layers;
1779 renderengine::LayerSettings layer;
1780 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1781 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1782 layer.alpha = 1.0;
1783 layers.push_back(&layer);
1784
1785 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001786 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001787 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001788 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001789
1790 const int fd = fenceTwo.get();
1791 if (fd >= 0) {
1792 sync_wait(fd, -1);
1793 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001794 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001795 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001796 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001797 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001798 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1799}
1800
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001801TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1802 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001803
1804 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1805 // GLES-specific test
1806 return;
1807 }
1808
1809 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001810
Alec Mouri368e1582020-08-13 10:14:29 -07001811 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001812 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001813 settings.physicalDisplay = fullscreenRect();
1814 settings.clip = fullscreenRect();
1815
1816 std::vector<const renderengine::LayerSettings*> layers;
1817 renderengine::LayerSettings layer;
1818 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1819 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1820 layer.alpha = 1.0;
1821 layers.push_back(&layer);
1822
1823 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001824 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001825
1826 const int fd = fence.get();
1827 if (fd >= 0) {
1828 sync_wait(fd, -1);
1829 }
1830
Alec Mouria90a5702021-04-16 16:36:21 +00001831 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001832 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001833 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1834 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001835
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001836 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001837
1838 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001839 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1840 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1841 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001842}
1843
Ana Krulecf9a15d92020-12-11 08:35:00 -08001844TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001845 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001846
1847 renderengine::DisplaySettings settings;
1848 settings.physicalDisplay = fullscreenRect();
1849 settings.clip = fullscreenRect();
1850 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1851
1852 std::vector<const renderengine::LayerSettings*> layers;
1853
1854 renderengine::LayerSettings redLayer;
1855 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1856 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1857 redLayer.geometry.roundedCornersRadius = 5.0f;
1858 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1859 // Red background.
1860 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1861 redLayer.alpha = 1.0f;
1862
1863 layers.push_back(&redLayer);
1864
1865 // Green layer with 1/3 size.
1866 renderengine::LayerSettings greenLayer;
1867 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1868 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1869 greenLayer.geometry.roundedCornersRadius = 5.0f;
1870 // Bottom right corner is not going to be rounded.
1871 greenLayer.geometry.roundedCornersCrop =
1872 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1873 DEFAULT_DISPLAY_HEIGHT)
1874 .toFloatRect();
1875 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1876 greenLayer.alpha = 1.0f;
1877
1878 layers.push_back(&greenLayer);
1879
Alec Mouric0aae732021-01-12 13:32:18 -08001880 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001881
1882 // Corners should be ignored...
1883 // Screen size: width is 128, height is 256.
1884 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1885 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1886 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1887 // Bottom right corner is kept out of the clipping, and it's green.
1888 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1889 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1890 0, 255, 0, 255);
1891}
1892
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001893TEST_P(RenderEngineTest, testClear) {
1894 initializeRenderEngine();
1895
1896 const auto rect = fullscreenRect();
1897 const renderengine::DisplaySettings display{
1898 .physicalDisplay = rect,
1899 .clip = rect,
1900 };
1901
1902 const renderengine::LayerSettings redLayer{
1903 .geometry.boundaries = rect.toFloatRect(),
1904 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1905 .alpha = 1.0f,
1906 };
1907
1908 // This mimics prepareClearClientComposition. This layer should overwrite
1909 // the redLayer, so that the buffer is transparent, rather than red.
1910 const renderengine::LayerSettings clearLayer{
1911 .geometry.boundaries = rect.toFloatRect(),
1912 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1913 .alpha = 0.0f,
1914 .disableBlending = true,
1915 };
1916
1917 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1918 invokeDraw(display, layers);
1919 expectBufferColor(rect, 0, 0, 0, 0);
1920}
1921
1922TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1923 initializeRenderEngine();
1924
1925 const auto rect = Rect(0, 0, 1, 1);
1926 const renderengine::DisplaySettings display{
1927 .physicalDisplay = rect,
1928 .clip = rect,
1929 };
1930
1931 const renderengine::LayerSettings redLayer{
1932 .geometry.boundaries = rect.toFloatRect(),
1933 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1934 .alpha = 1.0f,
1935 };
1936
1937 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1938 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001939 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001940 {
1941 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001942 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1943 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001944 pixels[0] = 0;
1945 pixels[1] = 255;
1946 pixels[2] = 0;
1947 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001948 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001949 }
1950
1951 const renderengine::LayerSettings greenLayer{
1952 .geometry.boundaries = rect.toFloatRect(),
1953 .source =
1954 renderengine::PixelSource{
1955 .buffer =
1956 renderengine::Buffer{
1957 .buffer = buf,
1958 .usePremultipliedAlpha = true,
1959 },
1960 },
1961 .alpha = 0.5f,
1962 .disableBlending = true,
1963 };
1964
1965 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1966 invokeDraw(display, layers);
1967 expectBufferColor(rect, 0, 128, 0, 128);
1968}
1969
Alec Mouri6e57f682018-09-29 20:45:08 -07001970} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001971
1972// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001973#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"