blob: 886c9da70a39c64254cc500d6647e4ffd3970c4d [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 Mouri6e57f682018-09-29 20:45:08 -070027#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070028#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070029#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080030
31#include <chrono>
32#include <condition_variable>
33#include <fstream>
34
Alec Mourid43ccab2019-03-13 12:23:45 -070035#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080036#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080037#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070038
Alec Mouri1089aed2018-10-25 21:33:57 -070039constexpr int DEFAULT_DISPLAY_WIDTH = 128;
40constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
41constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080042constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070043
Alec Mouri6e57f682018-09-29 20:45:08 -070044namespace android {
45
Ana Krulec82ba2ec2020-11-21 13:33:20 -080046class RenderEngineFactory {
47public:
48 virtual ~RenderEngineFactory() = default;
49
50 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080051 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
52 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
53 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
54 return nullptr;
55 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080056};
57
58class GLESRenderEngineFactory : public RenderEngineFactory {
59public:
60 std::string name() override { return "GLESRenderEngineFactory"; }
61
Alec Mouric0aae732021-01-12 13:32:18 -080062 renderengine::RenderEngine::RenderEngineType type() {
63 return renderengine::RenderEngine::RenderEngineType::GLES;
64 }
65
66 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
67 return createGLESRenderEngine();
68 }
69
70 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080071 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070072 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080073 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
74 .setImageCacheSize(1)
75 .setUseColorManagerment(false)
76 .setEnableProtectedContext(false)
77 .setPrecacheToneMapperShaderOnly(false)
78 .setSupportsBackgroundBlur(true)
79 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080080 .setRenderEngineType(type())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080081 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080082 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070083 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080084};
Alec Mourid43ccab2019-03-13 12:23:45 -070085
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080086class GLESCMRenderEngineFactory : public RenderEngineFactory {
87public:
88 std::string name() override { return "GLESCMRenderEngineFactory"; }
89
Alec Mouric0aae732021-01-12 13:32:18 -080090 renderengine::RenderEngine::RenderEngineType type() {
91 return renderengine::RenderEngine::RenderEngineType::GLES;
92 }
93
94 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
95 return createGLESRenderEngine();
96 }
97
98 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080099 renderengine::RenderEngineCreationArgs reCreationArgs =
100 renderengine::RenderEngineCreationArgs::Builder()
101 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
102 .setImageCacheSize(1)
103 .setEnableProtectedContext(false)
104 .setPrecacheToneMapperShaderOnly(false)
105 .setSupportsBackgroundBlur(true)
106 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800107 .setRenderEngineType(type())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800108 .setUseColorManagerment(true)
109 .build();
110 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
111 }
112};
113
Alec Mouri0eab3e82020-12-08 18:10:27 -0800114class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
115public:
Alec Mouric0aae732021-01-12 13:32:18 -0800116 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800117
Alec Mouric0aae732021-01-12 13:32:18 -0800118 renderengine::RenderEngine::RenderEngineType type() {
119 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
120 }
121
122 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800123 renderengine::RenderEngineCreationArgs reCreationArgs =
124 renderengine::RenderEngineCreationArgs::Builder()
125 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
126 .setImageCacheSize(1)
127 .setEnableProtectedContext(false)
128 .setPrecacheToneMapperShaderOnly(false)
129 .setSupportsBackgroundBlur(true)
130 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800131 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800132 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800133 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800134 }
135};
136
137class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
138public:
Alec Mouric0aae732021-01-12 13:32:18 -0800139 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800140
Alec Mouric0aae732021-01-12 13:32:18 -0800141 renderengine::RenderEngine::RenderEngineType type() {
142 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
143 }
144
145 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800146 renderengine::RenderEngineCreationArgs reCreationArgs =
147 renderengine::RenderEngineCreationArgs::Builder()
148 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
149 .setImageCacheSize(1)
150 .setEnableProtectedContext(false)
151 .setPrecacheToneMapperShaderOnly(false)
152 .setSupportsBackgroundBlur(true)
153 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800154 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800155 .setUseColorManagerment(true)
156 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800157 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800158 }
159};
160
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800161class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
162public:
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800163 static sp<GraphicBuffer> allocateDefaultBuffer() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700164 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
165 HAL_PIXEL_FORMAT_RGBA_8888, 1,
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800166 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
Alec Mouric0aae732021-01-12 13:32:18 -0800167 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE,
Alec Mouri1089aed2018-10-25 21:33:57 -0700168 "output");
Alec Mouri6e57f682018-09-29 20:45:08 -0700169 }
170
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800171 // Allocates a 1x1 buffer to fill with a solid color
172 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) {
173 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
174 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
175 GRALLOC_USAGE_HW_TEXTURE,
176 "input");
177 }
178
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800179 RenderEngineTest() {
180 const ::testing::TestInfo* const test_info =
181 ::testing::UnitTest::GetInstance()->current_test_info();
182 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
183 mBuffer = allocateDefaultBuffer();
184 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700185
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800186 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800187 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
188 writeBufferToFile("/data/texture_out_");
189 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800190 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800191 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800192 if (mGLESRE != nullptr) {
193 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
194 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800195 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800196 const ::testing::TestInfo* const test_info =
197 ::testing::UnitTest::GetInstance()->current_test_info();
198 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800199 }
200
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800201 void writeBufferToFile(const char* basename) {
202 std::string filename(basename);
203 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
204 filename.append(".ppm");
205 std::ofstream file(filename.c_str(), std::ios::binary);
206 if (!file.is_open()) {
207 ALOGE("Unable to open file: %s", filename.c_str());
208 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
209 "surfaceflinger to write debug images");
210 return;
211 }
212
Alec Mouri1089aed2018-10-25 21:33:57 -0700213 uint8_t* pixels;
214 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
215 reinterpret_cast<void**>(&pixels));
216
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800217 file << "P6\n";
218 file << mBuffer->getWidth() << "\n";
219 file << mBuffer->getHeight() << "\n";
220 file << 255 << "\n";
221
222 std::vector<uint8_t> outBuffer(mBuffer->getWidth() * mBuffer->getHeight() * 3);
223 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
224
225 for (int32_t j = 0; j < mBuffer->getHeight(); j++) {
226 const uint8_t* src = pixels + (mBuffer->getStride() * j) * 4;
227 for (int32_t i = 0; i < mBuffer->getWidth(); i++) {
228 // Only copy R, G and B components
229 outPtr[0] = src[0];
230 outPtr[1] = src[1];
231 outPtr[2] = src[2];
232 outPtr += 3;
233
234 src += 4;
235 }
236 }
237 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
238 mBuffer->unlock();
239 }
240
241 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
242 size_t c;
243 Rect const* rect = region.getArray(&c);
244 for (size_t i = 0; i < c; i++, rect++) {
245 expectBufferColor(*rect, r, g, b, a);
246 }
247 }
248
249 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
250 uint8_t tolerance = 0) {
251 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
252 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
253 uint8_t tmp = a >= b ? a - b : b - a;
254 return tmp <= tolerance;
255 };
256 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700257 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800258
259 expectBufferColor(rect, r, g, b, a, colorCompare);
260 }
261
262 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
263 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
264 uint8_t* pixels;
265 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
266 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700267 int32_t maxFails = 10;
268 int32_t fails = 0;
269 for (int32_t j = 0; j < region.getHeight(); j++) {
270 const uint8_t* src =
271 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4;
272 for (int32_t i = 0; i < region.getWidth(); i++) {
273 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800274 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700275 EXPECT_TRUE(equal)
276 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
277 << "expected (" << static_cast<uint32_t>(r) << ", "
278 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
279 << static_cast<uint32_t>(a) << "), "
280 << "got (" << static_cast<uint32_t>(src[0]) << ", "
281 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
282 << ", " << static_cast<uint32_t>(src[3]) << ")";
283 src += 4;
284 if (!equal && ++fails >= maxFails) {
285 break;
286 }
287 }
288 if (fails >= maxFails) {
289 break;
290 }
291 }
292 mBuffer->unlock();
293 }
294
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800295 void expectAlpha(const Rect& rect, uint8_t a) {
296 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
297 return colorA[3] == colorB[3];
298 };
299 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
300 }
301
302 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
303 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
304 const ubyte4& backgroundColor) {
305 const Rect casterRect(castingLayer.geometry.boundaries);
306 Region casterRegion = Region(casterRect);
307 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
308 if (casterCornerRadius > 0.0f) {
309 // ignore the corners if a corner radius is set
310 Rect cornerRect(casterCornerRadius, casterCornerRadius);
311 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
312 casterRegion.subtractSelf(
313 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
314 casterRegion.subtractSelf(
315 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
316 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
317 casterRect.bottom - casterCornerRadius));
318 }
319
320 const float shadowInset = shadow.length * -1.0f;
321 const Rect casterWithShadow =
322 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
323 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
324 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
325
326 // verify casting layer
327 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
328
329 // verify shadows by testing just the alpha since its difficult to validate the shadow color
330 size_t c;
331 Rect const* r = shadowRegion.getArray(&c);
332 for (size_t i = 0; i < c; i++, r++) {
333 expectAlpha(*r, 255);
334 }
335
336 // verify background
337 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
338 backgroundColor.a);
339 }
340
Alec Mouribd17b3b2020-12-17 11:08:30 -0800341 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
342 const renderengine::ShadowSettings& shadow,
343 const ubyte4& backgroundColor) {
344 const float shadowInset = shadow.length * -1.0f;
345 const Rect casterRect(casterBounds);
346 const Rect shadowRect =
347 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
348
349 const Region backgroundRegion =
350 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
351
352 expectAlpha(shadowRect, 255);
353 // (0, 0, 0) fill on the bounds of the layer should be ignored.
354 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
355
356 // verify background
357 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
358 backgroundColor.a);
359 }
360
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800361 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
362 bool casterIsTranslucent) {
363 renderengine::ShadowSettings shadow;
364 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
365 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
366 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
367 shadow.lightRadius = 0.0f;
368 shadow.length = shadowLength;
369 shadow.casterIsTranslucent = casterIsTranslucent;
370 return shadow;
371 }
372
Alec Mouri1089aed2018-10-25 21:33:57 -0700373 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
374
375 static Rect offsetRect() {
376 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
377 DEFAULT_DISPLAY_HEIGHT);
378 }
379
380 static Rect offsetRectAtZero() {
381 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
382 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
383 }
384
Alec Mourid43ccab2019-03-13 12:23:45 -0700385 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800386 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700387 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800388 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800389 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
390 mCurrentBuffer = mBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700391
392 int fd = fence.release();
393 if (fd >= 0) {
394 sync_wait(fd, -1);
395 close(fd);
396 }
397
398 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800399 if (layers.size() > 0 && mGLESRE != nullptr) {
400 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700401 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700402 }
403
Alec Mourid43ccab2019-03-13 12:23:45 -0700404 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700405 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800406 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800407 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700408 }
409
Alec Mouri1089aed2018-10-25 21:33:57 -0700410 template <typename SourceVariant>
411 void fillBuffer(half r, half g, half b, half a);
412
413 template <typename SourceVariant>
414 void fillRedBuffer();
415
416 template <typename SourceVariant>
417 void fillGreenBuffer();
418
419 template <typename SourceVariant>
420 void fillBlueBuffer();
421
422 template <typename SourceVariant>
423 void fillRedTransparentBuffer();
424
425 template <typename SourceVariant>
426 void fillRedOffsetBuffer();
427
428 template <typename SourceVariant>
429 void fillBufferPhysicalOffset();
430
431 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700432 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700433
434 template <typename SourceVariant>
435 void fillBufferCheckersRotate0();
436
437 template <typename SourceVariant>
438 void fillBufferCheckersRotate90();
439
440 template <typename SourceVariant>
441 void fillBufferCheckersRotate180();
442
443 template <typename SourceVariant>
444 void fillBufferCheckersRotate270();
445
446 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800447 void fillBufferWithLayerTransform();
448
449 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700450 void fillBufferLayerTransform();
451
452 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800453 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800454
455 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700456 void fillBufferColorTransform();
457
Alec Mouri7c94edb2018-12-03 21:23:26 -0800458 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800459 void fillBufferWithColorTransformZeroLayerAlpha();
460
461 template <typename SourceVariant>
462 void fillBufferColorTransformZeroLayerAlpha();
463
464 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800465 void fillRedBufferWithRoundedCorners();
466
467 template <typename SourceVariant>
468 void fillBufferWithRoundedCorners();
469
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000470 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800471 void fillBufferAndBlurBackground();
472
473 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000474 void overlayCorners();
475
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800476 void fillRedBufferTextureTransform();
477
478 void fillBufferTextureTransform();
479
480 void fillRedBufferWithPremultiplyAlpha();
481
482 void fillBufferWithPremultiplyAlpha();
483
484 void fillRedBufferWithoutPremultiplyAlpha();
485
486 void fillBufferWithoutPremultiplyAlpha();
487
Alec Mouriac335532018-11-12 15:01:33 -0800488 void fillGreenColorBufferThenClearRegion();
489
490 void clearLeftRegion();
491
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000492 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800493
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800494 template <typename SourceVariant>
495 void drawShadow(const renderengine::LayerSettings& castingLayer,
496 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
497 const ubyte4& backgroundColor);
498
Alec Mouribd17b3b2020-12-17 11:08:30 -0800499 void drawShadowWithoutCaster(const FloatRect& castingBounds,
500 const renderengine::ShadowSettings& shadow,
501 const ubyte4& backgroundColor);
502
Alec Mouric0aae732021-01-12 13:32:18 -0800503 void initializeRenderEngine();
504
505 std::unique_ptr<renderengine::RenderEngine> mRE;
506 // GLESRenderEngine for testing GLES-specific behavior.
507 // Owened by mRE, but this is downcasted.
508 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800509
Alec Mourid43ccab2019-03-13 12:23:45 -0700510 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to
511 // be freed *after* RenderEngine is destroyed, so that the EGL image is
512 // destroyed first.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800513 sp<GraphicBuffer> mCurrentBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700514
515 sp<GraphicBuffer> mBuffer;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800516
517 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700518};
519
Alec Mouric0aae732021-01-12 13:32:18 -0800520void RenderEngineTest::initializeRenderEngine() {
521 const auto& renderEngineFactory = GetParam();
522 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
523 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
524 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
525 // every time.
526 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
527 renderEngineFactory->createGLESRenderEngine();
528 mGLESRE = renderEngine.get();
529 mRE = std::move(renderEngine);
530 } else {
531 mRE = renderEngineFactory->createRenderEngine();
532 }
533}
534
Alec Mouri1089aed2018-10-25 21:33:57 -0700535struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800536 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800537 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700538 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800539 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700540 }
541};
542
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800543struct RelaxOpaqueBufferVariant {
544 static void setOpaqueBit(renderengine::LayerSettings& layer) {
545 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800546 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800547 }
548
549 static uint8_t getAlphaChannel() { return 255; }
550};
551
552struct ForceOpaqueBufferVariant {
553 static void setOpaqueBit(renderengine::LayerSettings& layer) {
554 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800555 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800556 }
557
558 static uint8_t getAlphaChannel() {
559 // The isOpaque bit will override the alpha channel, so this should be
560 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800561 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800562 }
563};
564
565template <typename OpaquenessVariant>
566struct BufferSourceVariant {
567 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800568 RenderEngineTest* fixture) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800569 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1);
570 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800571 fixture->mRE->genTextures(1, &texName);
572 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800573
574 uint8_t* pixels;
575 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
576 reinterpret_cast<void**>(&pixels));
577
578 for (int32_t j = 0; j < buf->getHeight(); j++) {
579 uint8_t* iter = pixels + (buf->getStride() * j) * 4;
580 for (int32_t i = 0; i < buf->getWidth(); i++) {
581 iter[0] = uint8_t(r * 255);
582 iter[1] = uint8_t(g * 255);
583 iter[2] = uint8_t(b * 255);
584 iter[3] = OpaquenessVariant::getAlphaChannel();
585 iter += 4;
586 }
587 }
588
589 buf->unlock();
590
591 layer.source.buffer.buffer = buf;
592 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800593 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800594 OpaquenessVariant::setOpaqueBit(layer);
595 }
596};
597
Alec Mouri1089aed2018-10-25 21:33:57 -0700598template <typename SourceVariant>
599void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
600 renderengine::DisplaySettings settings;
601 settings.physicalDisplay = fullscreenRect();
602 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800603 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700604
Vishnu Nair9b079a22020-01-21 14:36:08 -0800605 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700606
607 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800608 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700609 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800610 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700611 layer.alpha = a;
612
Vishnu Nair9b079a22020-01-21 14:36:08 -0800613 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700614
Alec Mouric0aae732021-01-12 13:32:18 -0800615 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700616}
617
618template <typename SourceVariant>
619void RenderEngineTest::fillRedBuffer() {
620 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
621 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
622}
623
624template <typename SourceVariant>
625void RenderEngineTest::fillGreenBuffer() {
626 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
627 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
628}
629
630template <typename SourceVariant>
631void RenderEngineTest::fillBlueBuffer() {
632 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
633 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
634}
635
636template <typename SourceVariant>
637void RenderEngineTest::fillRedTransparentBuffer() {
638 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
639 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
640}
641
642template <typename SourceVariant>
643void RenderEngineTest::fillRedOffsetBuffer() {
644 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800645 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700646 settings.physicalDisplay = offsetRect();
647 settings.clip = offsetRectAtZero();
648
Vishnu Nair9b079a22020-01-21 14:36:08 -0800649 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700650
651 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800652 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700653 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800654 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700655 layer.alpha = 1.0f;
656
Vishnu Nair9b079a22020-01-21 14:36:08 -0800657 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800658 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700659}
660
661template <typename SourceVariant>
662void RenderEngineTest::fillBufferPhysicalOffset() {
663 fillRedOffsetBuffer<SourceVariant>();
664
665 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
666 DEFAULT_DISPLAY_HEIGHT),
667 255, 0, 0, 255);
668 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
669 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
670
671 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
672 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
673}
674
675template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700676void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700677 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800678 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700679 settings.physicalDisplay = fullscreenRect();
680 // Here logical space is 2x2
681 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700682 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700683
Vishnu Nair9b079a22020-01-21 14:36:08 -0800684 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700685
686 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800687 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700688 Rect rectOne(0, 0, 1, 1);
689 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800690 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700691 layerOne.alpha = 1.0f;
692
693 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800694 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700695 Rect rectTwo(0, 1, 1, 2);
696 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800697 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700698 layerTwo.alpha = 1.0f;
699
700 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800701 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700702 Rect rectThree(1, 0, 2, 1);
703 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800704 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700705 layerThree.alpha = 1.0f;
706
Vishnu Nair9b079a22020-01-21 14:36:08 -0800707 layers.push_back(&layerOne);
708 layers.push_back(&layerTwo);
709 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700710
Alec Mouric0aae732021-01-12 13:32:18 -0800711 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700712}
713
714template <typename SourceVariant>
715void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700716 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700717 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
718 255);
719 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
720 DEFAULT_DISPLAY_HEIGHT / 2),
721 0, 0, 255, 255);
722 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
723 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
724 0, 0, 0, 0);
725 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
726 DEFAULT_DISPLAY_HEIGHT),
727 0, 255, 0, 255);
728}
729
730template <typename SourceVariant>
731void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700732 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700733 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
734 255);
735 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
736 DEFAULT_DISPLAY_HEIGHT / 2),
737 255, 0, 0, 255);
738 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
739 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
740 0, 0, 255, 255);
741 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
742 DEFAULT_DISPLAY_HEIGHT),
743 0, 0, 0, 0);
744}
745
746template <typename SourceVariant>
747void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700748 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700749 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
750 0);
751 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
752 DEFAULT_DISPLAY_HEIGHT / 2),
753 0, 255, 0, 255);
754 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
755 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
756 255, 0, 0, 255);
757 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
758 DEFAULT_DISPLAY_HEIGHT),
759 0, 0, 255, 255);
760}
761
762template <typename SourceVariant>
763void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700764 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700765 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
766 255);
767 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
768 DEFAULT_DISPLAY_HEIGHT / 2),
769 0, 0, 0, 0);
770 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
771 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
772 0, 255, 0, 255);
773 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
774 DEFAULT_DISPLAY_HEIGHT),
775 255, 0, 0, 255);
776}
777
778template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800779void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700780 renderengine::DisplaySettings settings;
781 settings.physicalDisplay = fullscreenRect();
782 // Here logical space is 2x2
783 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800784 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700785
Vishnu Nair9b079a22020-01-21 14:36:08 -0800786 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700787
788 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800789 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700790 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
791 // Translate one pixel diagonally
792 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 -0800793 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700794 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
795 layer.alpha = 1.0f;
796
Vishnu Nair9b079a22020-01-21 14:36:08 -0800797 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700798
Alec Mouric0aae732021-01-12 13:32:18 -0800799 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800800}
Alec Mouri1089aed2018-10-25 21:33:57 -0700801
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800802template <typename SourceVariant>
803void RenderEngineTest::fillBufferLayerTransform() {
804 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700805 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
806 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
807 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
808 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
809 255, 0, 0, 255);
810}
811
812template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800813void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700814 renderengine::DisplaySettings settings;
815 settings.physicalDisplay = fullscreenRect();
816 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800817 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700818
Vishnu Nair9b079a22020-01-21 14:36:08 -0800819 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700820
821 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800822 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700823 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800824 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700825 layer.alpha = 1.0f;
826
827 // construct a fake color matrix
828 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800829 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700830 // set red channel to red + green
831 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
832
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800833 layer.alpha = 1.0f;
834 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
835
Vishnu Nair9b079a22020-01-21 14:36:08 -0800836 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700837
Alec Mouric0aae732021-01-12 13:32:18 -0800838 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800839}
Alec Mouri1089aed2018-10-25 21:33:57 -0700840
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800841template <typename SourceVariant>
842void RenderEngineTest::fillBufferColorTransform() {
843 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800844 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
845}
846
847template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800848void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
849 renderengine::DisplaySettings settings;
850 settings.physicalDisplay = fullscreenRect();
851 settings.clip = Rect(1, 1);
852
853 std::vector<const renderengine::LayerSettings*> layers;
854
855 renderengine::LayerSettings layer;
856 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
857 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
858 layer.alpha = 0;
859
860 // construct a fake color matrix
861 // simple inverse color
862 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
863
864 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
865
866 layers.push_back(&layer);
867
Alec Mouric0aae732021-01-12 13:32:18 -0800868 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800869}
870
871template <typename SourceVariant>
872void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
873 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
874 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
875}
876
877template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800878void RenderEngineTest::fillRedBufferWithRoundedCorners() {
879 renderengine::DisplaySettings settings;
880 settings.physicalDisplay = fullscreenRect();
881 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800882 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800883
Vishnu Nair9b079a22020-01-21 14:36:08 -0800884 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800885
886 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800887 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800888 layer.geometry.boundaries = fullscreenRect().toFloatRect();
889 layer.geometry.roundedCornersRadius = 5.0f;
890 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
891 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
892 layer.alpha = 1.0f;
893
Vishnu Nair9b079a22020-01-21 14:36:08 -0800894 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800895
Alec Mouric0aae732021-01-12 13:32:18 -0800896 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800897}
898
899template <typename SourceVariant>
900void RenderEngineTest::fillBufferWithRoundedCorners() {
901 fillRedBufferWithRoundedCorners<SourceVariant>();
902 // Corners should be ignored...
903 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
904 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
905 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
906 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
907 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
908 0, 0, 0, 0);
909 // ...And the non-rounded portion should be red.
910 // Other pixels may be anti-aliased, so let's not check those.
911 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
912 255);
913}
914
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000915template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800916void RenderEngineTest::fillBufferAndBlurBackground() {
917 char value[PROPERTY_VALUE_MAX];
918 property_get("ro.surface_flinger.supports_background_blur", value, "0");
919 if (!atoi(value)) {
920 // This device doesn't support blurs, no-op.
921 return;
922 }
923
924 auto blurRadius = 50;
925 auto center = DEFAULT_DISPLAY_WIDTH / 2;
926
927 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800928 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800929 settings.physicalDisplay = fullscreenRect();
930 settings.clip = fullscreenRect();
931
Vishnu Nair9b079a22020-01-21 14:36:08 -0800932 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800933
934 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800935 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800936 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
937 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
938 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800939 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800940
941 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800942 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800943 leftLayer.geometry.boundaries =
944 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
945 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
946 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800947 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800948
949 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800950 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800951 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
952 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500953 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800954 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800955 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800956
Alec Mouric0aae732021-01-12 13:32:18 -0800957 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800958
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500959 // solid color
960 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
961
962 // blurred color (downsampling should result in the center color being close to 128)
963 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
964 10 /* tolerance */);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800965}
966
967template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000968void RenderEngineTest::overlayCorners() {
969 renderengine::DisplaySettings settings;
970 settings.physicalDisplay = fullscreenRect();
971 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800972 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000973
Vishnu Nair9b079a22020-01-21 14:36:08 -0800974 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000975
976 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800977 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000978 layerOne.geometry.boundaries =
979 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
980 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
981 layerOne.alpha = 0.2;
982
Vishnu Nair9b079a22020-01-21 14:36:08 -0800983 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -0800984 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000985 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
986 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
987 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
988 0, 0, 0, 0);
989
Vishnu Nair9b079a22020-01-21 14:36:08 -0800990 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000991 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800992 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000993 layerTwo.geometry.boundaries =
994 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
995 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
996 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
997 layerTwo.alpha = 1.0f;
998
Vishnu Nair9b079a22020-01-21 14:36:08 -0800999 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001000 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001001
1002 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1003 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1004 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1005 0, 255, 0, 255);
1006}
1007
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001008void RenderEngineTest::fillRedBufferTextureTransform() {
1009 renderengine::DisplaySettings settings;
1010 settings.physicalDisplay = fullscreenRect();
1011 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001012 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001013
Vishnu Nair9b079a22020-01-21 14:36:08 -08001014 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001015
1016 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001017 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001018 // Here will allocate a checker board texture, but transform texture
1019 // coordinates so that only the upper left is applied.
1020 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2);
1021 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001022 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001023 this->mTexNames.push_back(texName);
1024
1025 uint8_t* pixels;
1026 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1027 reinterpret_cast<void**>(&pixels));
1028 // Red top left, Green top right, Blue bottom left, Black bottom right
1029 pixels[0] = 255;
1030 pixels[1] = 0;
1031 pixels[2] = 0;
1032 pixels[3] = 255;
1033 pixels[4] = 0;
1034 pixels[5] = 255;
1035 pixels[6] = 0;
1036 pixels[7] = 255;
1037 pixels[8] = 0;
1038 pixels[9] = 0;
1039 pixels[10] = 255;
1040 pixels[11] = 255;
1041 buf->unlock();
1042
1043 layer.source.buffer.buffer = buf;
1044 layer.source.buffer.textureName = texName;
1045 // Transform coordinates to only be inside the red quadrant.
1046 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1047 layer.alpha = 1.0f;
1048 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1049
Vishnu Nair9b079a22020-01-21 14:36:08 -08001050 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001051
Alec Mouric0aae732021-01-12 13:32:18 -08001052 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001053}
1054
1055void RenderEngineTest::fillBufferTextureTransform() {
1056 fillRedBufferTextureTransform();
1057 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1058}
1059
1060void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1061 renderengine::DisplaySettings settings;
1062 settings.physicalDisplay = fullscreenRect();
1063 // Here logical space is 1x1
1064 settings.clip = Rect(1, 1);
1065
Vishnu Nair9b079a22020-01-21 14:36:08 -08001066 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001067
1068 renderengine::LayerSettings layer;
1069 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1070 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001071 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001072 this->mTexNames.push_back(texName);
1073
1074 uint8_t* pixels;
1075 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1076 reinterpret_cast<void**>(&pixels));
1077 pixels[0] = 255;
1078 pixels[1] = 0;
1079 pixels[2] = 0;
1080 pixels[3] = 255;
1081 buf->unlock();
1082
1083 layer.source.buffer.buffer = buf;
1084 layer.source.buffer.textureName = texName;
1085 layer.source.buffer.usePremultipliedAlpha = true;
1086 layer.alpha = 0.5f;
1087 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1088
Vishnu Nair9b079a22020-01-21 14:36:08 -08001089 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001090
Alec Mouric0aae732021-01-12 13:32:18 -08001091 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001092}
1093
1094void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1095 fillRedBufferWithPremultiplyAlpha();
1096 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1097}
1098
1099void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1100 renderengine::DisplaySettings settings;
1101 settings.physicalDisplay = fullscreenRect();
1102 // Here logical space is 1x1
1103 settings.clip = Rect(1, 1);
1104
Vishnu Nair9b079a22020-01-21 14:36:08 -08001105 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001106
1107 renderengine::LayerSettings layer;
1108 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1109 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001110 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001111 this->mTexNames.push_back(texName);
1112
1113 uint8_t* pixels;
1114 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1115 reinterpret_cast<void**>(&pixels));
1116 pixels[0] = 255;
1117 pixels[1] = 0;
1118 pixels[2] = 0;
1119 pixels[3] = 255;
1120 buf->unlock();
1121
1122 layer.source.buffer.buffer = buf;
1123 layer.source.buffer.textureName = texName;
1124 layer.source.buffer.usePremultipliedAlpha = false;
1125 layer.alpha = 0.5f;
1126 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1127
Vishnu Nair9b079a22020-01-21 14:36:08 -08001128 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001129
Alec Mouric0aae732021-01-12 13:32:18 -08001130 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001131}
1132
1133void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1134 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001135 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001136}
1137
Alec Mouriac335532018-11-12 15:01:33 -08001138void RenderEngineTest::clearLeftRegion() {
1139 renderengine::DisplaySettings settings;
1140 settings.physicalDisplay = fullscreenRect();
1141 // Here logical space is 4x4
1142 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001143 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001144 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001145 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001146 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001147 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001148 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001149}
1150
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001151void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001152 // Reuse mBuffer
1153 clearLeftRegion();
1154 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1155 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1156 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001157 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001158}
1159
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001160template <typename SourceVariant>
1161void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1162 const renderengine::ShadowSettings& shadow,
1163 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1164 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001165 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001166 settings.physicalDisplay = fullscreenRect();
1167 settings.clip = fullscreenRect();
1168
Vishnu Nair9b079a22020-01-21 14:36:08 -08001169 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001170
1171 // add background layer
1172 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001173 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001174 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1175 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1176 backgroundColor.b / 255.0f, this);
1177 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001178 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001179
1180 // add shadow layer
1181 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001182 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001183 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1184 shadowLayer.alpha = castingLayer.alpha;
1185 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001186 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001187
1188 // add layer casting the shadow
1189 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001190 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001191 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1192 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001193 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001194
Alec Mouric0aae732021-01-12 13:32:18 -08001195 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001196}
1197
Alec Mouribd17b3b2020-12-17 11:08:30 -08001198void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1199 const renderengine::ShadowSettings& shadow,
1200 const ubyte4& backgroundColor) {
1201 renderengine::DisplaySettings settings;
1202 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1203 settings.physicalDisplay = fullscreenRect();
1204 settings.clip = fullscreenRect();
1205
1206 std::vector<const renderengine::LayerSettings*> layers;
1207
1208 // add background layer
1209 renderengine::LayerSettings bgLayer;
1210 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1211 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1212 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1213 backgroundColor.b / 255.0f, this);
1214 bgLayer.alpha = backgroundColor.a / 255.0f;
1215 layers.push_back(&bgLayer);
1216
1217 // add shadow layer
1218 renderengine::LayerSettings shadowLayer;
1219 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1220 shadowLayer.geometry.boundaries = castingBounds;
1221 shadowLayer.alpha = 1.0f;
1222 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1223 shadowLayer.shadow = shadow;
1224 layers.push_back(&shadowLayer);
1225
Alec Mouric0aae732021-01-12 13:32:18 -08001226 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001227}
1228
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001229INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001230 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001231 std::make_shared<GLESCMRenderEngineFactory>(),
1232 std::make_shared<SkiaGLESRenderEngineFactory>(),
1233 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001234
1235TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001236 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001237 drawEmptyLayers();
1238}
1239
Ana Krulec07b98df2021-01-07 14:38:40 -08001240TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
1241 const auto& renderEngineFactory = GetParam();
1242 mRE = renderEngineFactory->createRenderEngine();
1243
1244 renderengine::DisplaySettings settings;
1245 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1246 settings.physicalDisplay = fullscreenRect();
1247 settings.clip = fullscreenRect();
1248
1249 // 255, 255, 255, 255 is full opaque white.
1250 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1251 // Create layer with given color.
1252 renderengine::LayerSettings bgLayer;
1253 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1254 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1255 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1256 backgroundColor.b / 255.0f);
1257 bgLayer.alpha = backgroundColor.a / 255.0f;
1258 // Transform the red color.
1259 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1260
1261 std::vector<const renderengine::LayerSettings*> layers;
1262 layers.push_back(&bgLayer);
1263
Alec Mouric0aae732021-01-12 13:32:18 -08001264 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001265
1266 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001267 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001268 backgroundColor.a);
1269}
1270
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001271TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001272 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001273
Alec Mourid43ccab2019-03-13 12:23:45 -07001274 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001275 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001276 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001277 renderengine::LayerSettings layer;
1278 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1279 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001280 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001281 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001282 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001283
1284 ASSERT_EQ(BAD_VALUE, status);
1285}
1286
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001287TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001288 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001289
Alec Mourid43ccab2019-03-13 12:23:45 -07001290 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001291 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001292 settings.physicalDisplay = fullscreenRect();
1293 settings.clip = fullscreenRect();
1294
Vishnu Nair9b079a22020-01-21 14:36:08 -08001295 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001296 renderengine::LayerSettings layer;
1297 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1298 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1299 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001300 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001301
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001302 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
1303 mCurrentBuffer = mBuffer;
Alec Mourid43ccab2019-03-13 12:23:45 -07001304 ASSERT_EQ(NO_ERROR, status);
1305 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1306}
1307
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001308TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1309 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001310
1311 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1312 // GLES-specific test
1313 return;
1314 }
1315
1316 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001317
Alec Mourife0d72b2019-03-21 14:05:56 -07001318 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001319 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001320 settings.physicalDisplay = fullscreenRect();
1321 settings.clip = fullscreenRect();
1322
Vishnu Nair9b079a22020-01-21 14:36:08 -08001323 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001324 renderengine::LayerSettings layer;
1325 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1326 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1327 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001328 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001329
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001330 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
1331 mCurrentBuffer = mBuffer;
Alec Mourife0d72b2019-03-21 14:05:56 -07001332 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -08001333 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001334 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1335}
1336
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001337TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001338 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001339 fillRedBuffer<ColorSourceVariant>();
1340}
1341
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001343 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001344 fillGreenBuffer<ColorSourceVariant>();
1345}
1346
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001347TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001348 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001349 fillBlueBuffer<ColorSourceVariant>();
1350}
1351
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001352TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001353 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001354 fillRedTransparentBuffer<ColorSourceVariant>();
1355}
1356
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001357TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001358 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001359 fillBufferPhysicalOffset<ColorSourceVariant>();
1360}
1361
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001362TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001363 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001364 fillBufferCheckersRotate0<ColorSourceVariant>();
1365}
1366
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001367TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001368 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001369 fillBufferCheckersRotate90<ColorSourceVariant>();
1370}
1371
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001372TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001373 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001374 fillBufferCheckersRotate180<ColorSourceVariant>();
1375}
1376
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001377TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001378 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001379 fillBufferCheckersRotate270<ColorSourceVariant>();
1380}
1381
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001382TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001383 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001384 fillBufferLayerTransform<ColorSourceVariant>();
1385}
1386
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001387TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001388 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001389 fillBufferColorTransform<ColorSourceVariant>();
1390}
1391
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001392TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001393 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001394 fillBufferWithRoundedCorners<ColorSourceVariant>();
1395}
1396
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001397TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001398 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001399 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1400}
1401
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001402TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001403 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001404 fillBufferAndBlurBackground<ColorSourceVariant>();
1405}
1406
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001407TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001408 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001409 overlayCorners<ColorSourceVariant>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001413 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001414 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1415}
1416
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001417TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001418 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001419 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1420}
1421
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001422TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001423 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001424 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1425}
1426
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001427TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001428 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001429 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1430}
1431
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001432TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001433 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001434 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1435}
1436
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001437TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001438 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001439 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1440}
1441
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001442TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001443 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001444 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1445}
1446
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001447TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001448 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001449 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1450}
1451
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001452TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001453 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001454 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1455}
1456
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001457TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001458 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001459 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1460}
1461
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001462TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001463 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001464 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1465}
1466
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001467TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001468 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001469 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1470}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001471
Alec Mouric0aae732021-01-12 13:32:18 -08001472TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1473 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001474 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1475}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001476
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001477TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001478 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001479 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1480}
1481
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001482TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001484 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001489 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001509 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001514 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1515}
1516
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001518 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001519 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1520}
1521
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001522TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001523 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001524 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1525}
1526
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001527TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001528 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001529 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1530}
1531
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001532TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001533 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001534 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1535}
1536
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001537TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001538 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001539 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1540}
1541
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001542TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001543 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001544 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1545}
1546
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001547TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001548 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001549 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1550}
1551
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001552TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001553 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001554 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1555}
1556
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001557TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001558 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001559 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1560}
1561
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001562TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001563 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001564 fillBufferTextureTransform();
1565}
1566
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001567TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001568 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001569 fillBufferWithPremultiplyAlpha();
1570}
1571
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001572TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001573 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001574 fillBufferWithoutPremultiplyAlpha();
1575}
1576
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001577TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001578 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001579 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001580}
1581
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001582TEST_P(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) {
1583 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001584
1585 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1586 // GLES-specific test
1587 return;
1588 }
1589
1590 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001591
Alec Mourid43ccab2019-03-13 12:23:45 -07001592 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001593 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001594 settings.physicalDisplay = fullscreenRect();
1595 settings.clip = fullscreenRect();
1596
Vishnu Nair9b079a22020-01-21 14:36:08 -08001597 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001598
1599 renderengine::LayerSettings layer;
1600 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1601 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1602
Vishnu Nair9b079a22020-01-21 14:36:08 -08001603 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001604 invokeDraw(settings, layers);
Alec Mourid43ccab2019-03-13 12:23:45 -07001605 uint64_t bufferId = layer.source.buffer.buffer->getId();
Alec Mouric0aae732021-01-12 13:32:18 -08001606 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001607 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001608 mGLESRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001609 std::lock_guard<std::mutex> lock(barrier->mutex);
1610 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1611 [&]() REQUIRES(barrier->mutex) {
1612 return barrier->isOpen;
1613 }));
Alec Mouric0aae732021-01-12 13:32:18 -08001614 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001615 EXPECT_EQ(NO_ERROR, barrier->result);
Alec Mourid43ccab2019-03-13 12:23:45 -07001616}
1617
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001618TEST_P(RenderEngineTest, cacheExternalBuffer_withNullBuffer) {
1619 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001620
1621 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1622 // GLES-specific test
1623 return;
1624 }
1625
1626 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001627
Alec Mouri16a99402019-07-29 16:37:30 -07001628 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001629 mGLESRE->cacheExternalTextureBufferForTesting(nullptr);
Alec Mouri16a99402019-07-29 16:37:30 -07001630 std::lock_guard<std::mutex> lock(barrier->mutex);
1631 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1632 [&]() REQUIRES(barrier->mutex) {
1633 return barrier->isOpen;
1634 }));
1635 EXPECT_TRUE(barrier->isOpen);
1636 EXPECT_EQ(BAD_VALUE, barrier->result);
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001637}
1638
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001639TEST_P(RenderEngineTest, cacheExternalBuffer_cachesImages) {
1640 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001641
1642 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1643 // GLES-specific test
1644 return;
1645 }
1646
1647 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001648
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001649 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1650 uint64_t bufferId = buf->getId();
Alec Mouri16a99402019-07-29 16:37:30 -07001651 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001652 mGLESRE->cacheExternalTextureBufferForTesting(buf);
Alec Mouri16a99402019-07-29 16:37:30 -07001653 {
1654 std::lock_guard<std::mutex> lock(barrier->mutex);
1655 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1656 [&]() REQUIRES(barrier->mutex) {
1657 return barrier->isOpen;
1658 }));
1659 EXPECT_EQ(NO_ERROR, barrier->result);
1660 }
Alec Mouric0aae732021-01-12 13:32:18 -08001661 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1662 barrier = mGLESRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001663 {
1664 std::lock_guard<std::mutex> lock(barrier->mutex);
1665 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1666 [&]() REQUIRES(barrier->mutex) {
1667 return barrier->isOpen;
1668 }));
1669 EXPECT_EQ(NO_ERROR, barrier->result);
1670 }
Alec Mouric0aae732021-01-12 13:32:18 -08001671 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001672}
1673
Alec Mouribd17b3b2020-12-17 11:08:30 -08001674TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001675 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001676
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::ShadowSettings settings =
1682 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1683 false /* casterIsTranslucent */);
1684
1685 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1686 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1687}
1688
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001690 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001691
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001692 const ubyte4 casterColor(255, 0, 0, 255);
1693 const ubyte4 backgroundColor(255, 255, 255, 255);
1694 const float shadowLength = 5.0f;
1695 Rect casterBounds(1, 1);
1696 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1697 renderengine::LayerSettings castingLayer;
1698 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1699 castingLayer.alpha = 1.0f;
1700 renderengine::ShadowSettings settings =
1701 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1702 false /* casterIsTranslucent */);
1703
1704 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1705 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1706}
1707
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001708TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001709 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001710
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001711 const ubyte4 casterColor(255, 0, 0, 255);
1712 const ubyte4 backgroundColor(255, 255, 255, 255);
1713 const float shadowLength = 5.0f;
1714 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1715 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1716 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001717 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001718 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1719 castingLayer.alpha = 1.0f;
1720 renderengine::ShadowSettings settings =
1721 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1722 false /* casterIsTranslucent */);
1723
1724 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1725 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1726}
1727
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001728TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001729 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001730
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001731 const ubyte4 casterColor(255, 0, 0, 255);
1732 const ubyte4 backgroundColor(255, 255, 255, 255);
1733 const float shadowLength = 5.0f;
1734 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1735 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1736 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001737 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001738 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1739 castingLayer.alpha = 1.0f;
1740 renderengine::ShadowSettings settings =
1741 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1742 false /* casterIsTranslucent */);
1743
1744 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1745 backgroundColor);
1746 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1747}
1748
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001749TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001750 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001751
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001752 const ubyte4 casterColor(255, 0, 0, 255);
1753 const ubyte4 backgroundColor(255, 255, 255, 255);
1754 const float shadowLength = 5.0f;
1755 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1756 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1757 renderengine::LayerSettings castingLayer;
1758 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1759 castingLayer.geometry.roundedCornersRadius = 3.0f;
1760 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1761 castingLayer.alpha = 1.0f;
1762 renderengine::ShadowSettings settings =
1763 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1764 false /* casterIsTranslucent */);
1765
1766 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1767 backgroundColor);
1768 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1769}
1770
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001771TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001772 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001773
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001774 const ubyte4 casterColor(255, 0, 0, 255);
1775 const ubyte4 backgroundColor(255, 255, 255, 255);
1776 const float shadowLength = 5.0f;
1777 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1778 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1779 renderengine::LayerSettings castingLayer;
1780 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1781 castingLayer.alpha = 0.5f;
1782 renderengine::ShadowSettings settings =
1783 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1784 true /* casterIsTranslucent */);
1785
1786 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1787 backgroundColor);
1788
1789 // verify only the background since the shadow will draw behind the caster
1790 const float shadowInset = settings.length * -1.0f;
1791 const Rect casterWithShadow =
1792 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1793 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1794 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1795 backgroundColor.a);
1796}
1797
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001798TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1799 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001800
1801 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1802 // GLES-specific test
1803 return;
1804 }
1805
1806 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001807
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001808 renderengine::DisplaySettings settings;
1809 settings.physicalDisplay = fullscreenRect();
1810 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001811 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001812
1813 std::vector<const renderengine::LayerSettings*> layers;
1814 renderengine::LayerSettings layer;
1815 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1816 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1817 layer.alpha = 1.0;
1818 layers.push_back(&layer);
1819
1820 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001821 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001822 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001823 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001824
1825 const int fd = fenceTwo.get();
1826 if (fd >= 0) {
1827 sync_wait(fd, -1);
1828 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001829 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001830 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001831 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001832 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001833 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1834}
1835
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001836TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1837 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001838
1839 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1840 // GLES-specific test
1841 return;
1842 }
1843
1844 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001845
Alec Mouri368e1582020-08-13 10:14:29 -07001846 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001847 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001848 settings.physicalDisplay = fullscreenRect();
1849 settings.clip = fullscreenRect();
1850
1851 std::vector<const renderengine::LayerSettings*> layers;
1852 renderengine::LayerSettings layer;
1853 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1854 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1855 layer.alpha = 1.0;
1856 layers.push_back(&layer);
1857
1858 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001859 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001860
1861 const int fd = fence.get();
1862 if (fd >= 0) {
1863 sync_wait(fd, -1);
1864 }
1865
1866 uint64_t bufferId = layer.source.buffer.buffer->getId();
1867 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001868 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1869 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001870
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001871 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001872
1873 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001874 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1875 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1876 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001877}
1878
Ana Krulecf9a15d92020-12-11 08:35:00 -08001879TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001880 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001881
1882 renderengine::DisplaySettings settings;
1883 settings.physicalDisplay = fullscreenRect();
1884 settings.clip = fullscreenRect();
1885 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1886
1887 std::vector<const renderengine::LayerSettings*> layers;
1888
1889 renderengine::LayerSettings redLayer;
1890 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1891 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1892 redLayer.geometry.roundedCornersRadius = 5.0f;
1893 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1894 // Red background.
1895 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1896 redLayer.alpha = 1.0f;
1897
1898 layers.push_back(&redLayer);
1899
1900 // Green layer with 1/3 size.
1901 renderengine::LayerSettings greenLayer;
1902 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1903 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1904 greenLayer.geometry.roundedCornersRadius = 5.0f;
1905 // Bottom right corner is not going to be rounded.
1906 greenLayer.geometry.roundedCornersCrop =
1907 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1908 DEFAULT_DISPLAY_HEIGHT)
1909 .toFloatRect();
1910 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1911 greenLayer.alpha = 1.0f;
1912
1913 layers.push_back(&greenLayer);
1914
Alec Mouric0aae732021-01-12 13:32:18 -08001915 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001916
1917 // Corners should be ignored...
1918 // Screen size: width is 128, height is 256.
1919 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1920 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1921 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1922 // Bottom right corner is kept out of the clipping, and it's green.
1923 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1924 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1925 0, 255, 0, 255);
1926}
1927
Alec Mouri6e57f682018-09-29 20:45:08 -07001928} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001929
1930// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001931#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"